From 515da1cd8fc1000ed8be62fe397c5e37df02156e Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 26 Apr 2024 23:14:05 +0000 Subject: [PATCH 001/140] Create flake.nix --- flake.lock | 1193 ++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 22 + 2 files changed, 1215 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..4006f34939 --- /dev/null +++ b/flake.lock @@ -0,0 +1,1193 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "inputs": { + "systems": "systems_7" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "inputs": { + "systems": "systems_8" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "inputs": { + "systems": "systems_9" + }, + "locked": { + "lastModified": 1687171271, + "narHash": "sha256-BJlq+ozK2B1sJDQXS3tzJM5a+oVZmi1q0FlBK/Xqv7M=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "inputs": { + "systems": "systems_10" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "inputs": { + "systems": "systems_11" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "inputs": { + "systems": "systems_12" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "inputs": { + "systems": "systems_13" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "inputs": { + "systems": "systems_14" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "inputs": { + "systems": "systems_15" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "inputs": { + "systems": "systems_4" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "inputs": { + "systems": "systems_5" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "inputs": { + "systems": "systems_6" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "foundry": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1712135466, + "narHash": "sha256-+xFfYk17EI0zZTGmhh3MyeSpl7RVohoVp/4HaSvGj4I=", + "owner": "shazow", + "repo": "foundry.nix", + "rev": "ece7c960a440c6725a7a5576d1f49a5fabde3747", + "type": "github" + }, + "original": { + "owner": "shazow", + "ref": "monthly", + "repo": "foundry.nix", + "type": "github" + } + }, + "foundry_2": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1709457044, + "narHash": "sha256-1SktmSjTjC1rhJwQ+kvqUeExKogNzserFGuoGwOerHw=", + "owner": "shazow", + "repo": "foundry.nix", + "rev": "592e8ca2e82a2c3a8d0d4dcc7f7c5b8c3842efcd", + "type": "github" + }, + "original": { + "owner": "shazow", + "ref": "monthly", + "repo": "foundry.nix", + "type": "github" + } + }, + "foundry_3": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1705216422, + "narHash": "sha256-kIAi+aqJoOVhpQP5DWRDdNsrfBMn+GsCwiuwJhG4w/g=", + "owner": "shazow", + "repo": "foundry.nix", + "rev": "9ecf12199280f738eaaad2d1224e54403dbdf426", + "type": "github" + }, + "original": { + "owner": "shazow", + "repo": "foundry.nix", + "rev": "9ecf12199280f738eaaad2d1224e54403dbdf426", + "type": "github" + } + }, + "foundry_4": { + "inputs": { + "flake-utils": "flake-utils_12", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1705216422, + "narHash": "sha256-kIAi+aqJoOVhpQP5DWRDdNsrfBMn+GsCwiuwJhG4w/g=", + "owner": "shazow", + "repo": "foundry.nix", + "rev": "9ecf12199280f738eaaad2d1224e54403dbdf426", + "type": "github" + }, + "original": { + "owner": "shazow", + "repo": "foundry.nix", + "rev": "9ecf12199280f738eaaad2d1224e54403dbdf426", + "type": "github" + } + }, + "naersk": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1686572087, + "narHash": "sha256-jXTut7ZSYqLEgm/nTk7TuVL2ExahTip605bLINklAnQ=", + "owner": "nix-community", + "repo": "naersk", + "rev": "8507af04eb40c5520bd35d9ce6f9d2342cea5ad1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "naersk", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1666753130, + "narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f540aeda6f677354f1e7144ab04352f61aaa0118", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1687518131, + "narHash": "sha256-KirltRIc4SFfk8bTNudIqgKAALH5oqpW3PefmkfWK5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3d8a93602bc54ece7a4e689d9aea1a574e2bbc24", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1681358109, + "narHash": "sha256-eKyxW4OohHQx9Urxi7TQlFBTDWII+F+x2hklDOQPB50=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "96ba1c52e54e74c3197f4d43026b3f3d92e83ff9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1706487304, + "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1706487304, + "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1708564076, + "narHash": "sha256-KKkqoxlgx9n3nwST7O2kM8tliDOijiSSNaWuSkiozdQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "98b00b6947a9214381112bdb6f89c25498db4959", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1706487304, + "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1708564076, + "narHash": "sha256-KKkqoxlgx9n3nwST7O2kM8tliDOijiSSNaWuSkiozdQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "98b00b6947a9214381112bdb6f89c25498db4959", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1712609864, + "narHash": "sha256-c0U5x9ucCKHZHqaJIy4eB0FTFNWbLLF9PyNsVDDj75w=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "902522b1a069597be55bc1547fadaaeb62111019", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "902522b1a069597be55bc1547fadaaeb62111019", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1666753130, + "narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f540aeda6f677354f1e7144ab04352f61aaa0118", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1712609864, + "narHash": "sha256-c0U5x9ucCKHZHqaJIy4eB0FTFNWbLLF9PyNsVDDj75w=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "902522b1a069597be55bc1547fadaaeb62111019", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "902522b1a069597be55bc1547fadaaeb62111019", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1666753130, + "narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f540aeda6f677354f1e7144ab04352f61aaa0118", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1706634492, + "narHash": "sha256-9wg1OQET7oCzzMsktGufJmfr2ylecL8T8YYqQo+qNSc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "dad88c029e2644adfde882f73e9338fd39058a3f", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "dad88c029e2644adfde882f73e9338fd39058a3f", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1666753130, + "narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f540aeda6f677354f1e7144ab04352f61aaa0118", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1706634492, + "narHash": "sha256-9wg1OQET7oCzzMsktGufJmfr2ylecL8T8YYqQo+qNSc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "dad88c029e2644adfde882f73e9338fd39058a3f", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "dad88c029e2644adfde882f73e9338fd39058a3f", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1687518131, + "narHash": "sha256-KirltRIc4SFfk8bTNudIqgKAALH5oqpW3PefmkfWK5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3d8a93602bc54ece7a4e689d9aea1a574e2bbc24", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "rain": { + "inputs": { + "flake-utils": "flake-utils_4", + "rainix": "rainix_2" + }, + "locked": { + "lastModified": 1713982615, + "narHash": "sha256-LEmo3vlyIOr3W7J9sl1iXpBBWcys4D+MVG3NJRfZj+c=", + "owner": "rainlanguage", + "repo": "rain.cli", + "rev": "63c9af98671604a54c7e319ff9b3f2978a57d5b8", + "type": "github" + }, + "original": { + "owner": "rainlanguage", + "repo": "rain.cli", + "type": "github" + } + }, + "rain_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "rainix": "rainix_3" + }, + "locked": { + "lastModified": 1709330445, + "narHash": "sha256-fNBo/pmPOkTbkKZRFnxR6QBQEk1QSL13iIdfPQN6jpg=", + "owner": "rainlanguage", + "repo": "rain.cli", + "rev": "0f882121f9f26208c1ae062c368ee817b2ca1363", + "type": "github" + }, + "original": { + "owner": "rainlanguage", + "repo": "rain.cli", + "type": "github" + } + }, + "rain_3": { + "inputs": { + "flake-utils": "flake-utils_10", + "rainix": "rainix_4" + }, + "locked": { + "lastModified": 1706637129, + "narHash": "sha256-dMyuaMux2bVChGb0DA1lyYw+SxyEz41CshmZsqGZwqM=", + "owner": "rainlanguage", + "repo": "rain.cli", + "rev": "da5bb3446ea008cf9537c537ad30d4ef16f5d36f", + "type": "github" + }, + "original": { + "owner": "rainlanguage", + "repo": "rain.cli", + "type": "github" + } + }, + "rain_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "naersk": "naersk", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1700476138, + "narHash": "sha256-cpKb/QMQQgoV4xiEI/TSEW48v/8MxvGA9Q9BK75DnH4=", + "owner": "rainprotocol", + "repo": "rain.cli", + "rev": "6a912680be6d967fd6114aafab793ebe8503d27b", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rain.cli", + "type": "github" + } + }, + "rainix": { + "inputs": { + "flake-utils": "flake-utils_2", + "foundry": "foundry", + "nixpkgs": "nixpkgs_2", + "rain": "rain", + "rust-overlay": "rust-overlay_4", + "solc": "solc_2" + }, + "locked": { + "lastModified": 1714161679, + "narHash": "sha256-9My5dH9pJoQMS4mkyk0cgu3FV64DkoHJOOHugGTDVgc=", + "owner": "rainprotocol", + "repo": "rainix", + "rev": "38bdeda14882f6af40170be2079cd0286ba17bb7", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rainix", + "type": "github" + } + }, + "rainix_2": { + "inputs": { + "flake-utils": "flake-utils_5", + "foundry": "foundry_2", + "nixpkgs": "nixpkgs_4", + "rain": "rain_2", + "rust-overlay": "rust-overlay_3", + "solc": "solc" + }, + "locked": { + "lastModified": 1713900533, + "narHash": "sha256-8FUM4l4Quwnl+uwGwsH68MwbPMKwVXoerEcGx7sgK5U=", + "owner": "rainprotocol", + "repo": "rainix", + "rev": "6097a125b4ab515e650a6f35d6018744c4ac3bc4", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rainix", + "rev": "6097a125b4ab515e650a6f35d6018744c4ac3bc4", + "type": "github" + } + }, + "rainix_3": { + "inputs": { + "flake-utils": "flake-utils_8", + "foundry": "foundry_3", + "nixpkgs": "nixpkgs_6", + "rain": "rain_3", + "rust-overlay": "rust-overlay_2" + }, + "locked": { + "lastModified": 1707160817, + "narHash": "sha256-ZLJ3/YlQqnrsFFc4BdO3d4QulAPnUjZYs9cJ+9+6FBo=", + "owner": "rainprotocol", + "repo": "rainix", + "rev": "10cbcbe44d597b6e4618af28fb7977a79e241342", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rainix", + "type": "github" + } + }, + "rainix_4": { + "inputs": { + "flake-utils": "flake-utils_11", + "foundry": "foundry_4", + "nixpkgs": "nixpkgs_8", + "rain": "rain_4", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1706636911, + "narHash": "sha256-jcplLR2rPxwnNNPnBgHeFkCSsaPu5uwaBl5zLnpJVWo=", + "owner": "rainprotocol", + "repo": "rainix", + "rev": "f68a83772f51d5230b61919322a2ffd6092b1107", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rainix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "rainix": "rainix" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": "flake-utils_14", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1706580650, + "narHash": "sha256-e6q4Pn1dp3NoQJdMYdyNdDHU5IRBW9i3bHSJ3jThEL0=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "39e20b3c02caa91c9970beef325a04975d83d77f", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_2": { + "inputs": { + "flake-utils": "flake-utils_15", + "nixpkgs": "nixpkgs_12" + }, + "locked": { + "lastModified": 1706634984, + "narHash": "sha256-xn7lGPE8gRGBe3Lt8ESoN/uUHm7IrbiV7siupwjHX1o=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "883b84c426107a8ec020e7124f263d7c35a5bb9f", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_3": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_13" + }, + "locked": { + "lastModified": 1711851236, + "narHash": "sha256-EJ03x3N9ihhonAttkaCrqxb0djDq3URCuDpmVPbNZhA=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "f258266af947599e8069df1c2e933189270f143a", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_4": { + "inputs": { + "flake-utils": "flake-utils_18", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1713924823, + "narHash": "sha256-kOeyS3GFwgnKvzuBMmFqEAX0xwZ7Nj4/5tXuvpZ0d4U=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "8a2edac3ae926a2a6ce60f4595dcc4540fc8cad4", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "solc": { + "inputs": { + "flake-utils": "flake-utils_17", + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1711538161, + "narHash": "sha256-rETVdEIQ2PyEcNgzXXFSiYAYl0koCeGDIWp9XYBTxoQ=", + "owner": "hellwolf", + "repo": "solc.nix", + "rev": "a995838545a7383a0b37776e969743b1346d5479", + "type": "github" + }, + "original": { + "owner": "hellwolf", + "repo": "solc.nix", + "type": "github" + } + }, + "solc_2": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1711538161, + "narHash": "sha256-rETVdEIQ2PyEcNgzXXFSiYAYl0koCeGDIWp9XYBTxoQ=", + "owner": "hellwolf", + "repo": "solc.nix", + "rev": "a995838545a7383a0b37776e969743b1346d5479", + "type": "github" + }, + "original": { + "owner": "hellwolf", + "repo": "solc.nix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_10": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_11": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_12": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_13": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_14": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_15": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_6": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_7": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_8": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_9": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..b58bce3335 --- /dev/null +++ b/flake.nix @@ -0,0 +1,22 @@ +{ + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + rainix.url = "github:rainprotocol/rainix"; + }; + + outputs = { self, flake-utils, rainix }: + + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = rainix.pkgs.${system}; + in { + # For `nix develop`: + devShell = pkgs.mkShell { + nativeBuildInputs = [ + rainix.node-build-inputs.${system} + pkgs.nodePackages.pnpm + ]; + }; + } + ); +} \ No newline at end of file From 14054166cef61aa848e4fc3c8eac589b47f8cf7d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 26 Apr 2024 23:15:32 +0000 Subject: [PATCH 002/140] update --- package.json | 2 +- packages/sushi/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6d643bcb16..e4fbc713b3 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "packageManager": "pnpm@8.15.3", "engines": { "node": ">=20.x", - "pnpm": "8.15.3" + "pnpm": ">=8.15.3" }, "pnpm": { "overrides": { diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 2fa74f6ecf..6d08193e82 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -185,7 +185,7 @@ "check": "tsc --pretty --noEmit", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist", "dev": "tsc -w", - "generate": "npx tsx ./scripts/generate.ts", + "generate": "tsx ./scripts/generate.ts", "prepublishOnly": "pnpm build", "test": "vitest run -c ./test/vitest.config.ts", "test:debug": "vitest --inspect-brk --no-threads run -c ./test/vitest.config.ts", From 5d08ee292c566ed1f562b5bff5f92cde502267d9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 26 Apr 2024 23:34:57 +0000 Subject: [PATCH 003/140] init --- packages/sushi/src/chain/constants.ts | 2 + packages/sushi/src/chain/generated.ts | 1469 +++++++++-------- packages/sushi/src/config/native-ids.ts | 1 + packages/sushi/src/config/route-processor.ts | 4 + packages/sushi/src/config/stables.ts | 1 + packages/sushi/src/config/viem.ts | 139 +- .../sushi/src/currency/token-addresses.ts | 3 + packages/sushi/src/currency/tokens.ts | 56 +- packages/sushi/src/serializer/index.ts | 2 +- 9 files changed, 864 insertions(+), 813 deletions(-) diff --git a/packages/sushi/src/chain/constants.ts b/packages/sushi/src/chain/constants.ts index 815b95e308..d742176352 100644 --- a/packages/sushi/src/chain/constants.ts +++ b/packages/sushi/src/chain/constants.ts @@ -52,6 +52,7 @@ export const ChainId = { CRONOS: 25, BLAST: 81457, // RONIN: 2020, + FLARE: 14, } as const export type ChainId = (typeof ChainId)[keyof typeof ChainId] @@ -130,5 +131,6 @@ export const ChainKey = { [ChainId.ZETACHAIN]: 'zetachain', [ChainId.CRONOS]: 'cronos', [ChainId.BLAST]: 'blast', + [ChainId.FLARE]: 'flare', } as const export type ChainKey = (typeof ChainKey)[keyof typeof ChainKey] diff --git a/packages/sushi/src/chain/generated.ts b/packages/sushi/src/chain/generated.ts index 0148eaf6b9..563ae5bfc3 100644 --- a/packages/sushi/src/chain/generated.ts +++ b/packages/sushi/src/chain/generated.ts @@ -1,971 +1,984 @@ export default [ { - chainId: 1, - explorers: [ + "chainId": 1, + "explorers": [ { - name: 'etherscan', - url: 'https://etherscan.io', - standard: 'EIP3091', + "name": "etherscan", + "url": "https://etherscan.io", + "standard": "EIP3091" }, { - name: 'blockscout', - url: 'https://eth.blockscout.com', - icon: 'blockscout', - standard: 'EIP3091', + "name": "blockscout", + "url": "https://eth.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://ethereum.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://ethereum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, - name: 'Ethereum Mainnet', - shortName: 'eth', + "name": "Ethereum Mainnet", + "shortName": "eth" }, { - chainId: 10, - explorers: [ + "chainId": 10, + "explorers": [ { - name: 'etherscan', - url: 'https://optimistic.etherscan.io', - standard: 'EIP3091', + "name": "etherscan", + "url": "https://optimistic.etherscan.io", + "standard": "EIP3091" }, { - name: 'blockscout', - url: 'https://optimism.blockscout.com', - icon: 'blockscout', - standard: 'EIP3091', + "name": "blockscout", + "url": "https://optimism.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://optimism.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://optimism.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, - name: 'OP Mainnet', - shortName: 'oeth', + "name": "OP Mainnet", + "shortName": "oeth" }, { - chainId: 25, - explorers: [ + "chainId": 14, + "explorers": [ { - name: 'Cronos Explorer', - url: 'https://explorer.cronos.org', - standard: 'none', + "name": "blockscout", + "url": "https://flare-explorer.flare.network", + "standard": "EIP3091" }, + { + "name": "flarescan", + "url": "https://mainnet.flarescan.com", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Cronos', - symbol: 'CRO', - decimals: 18, + "nativeCurrency": { + "name": "Flare", + "symbol": "FLR", + "decimals": 18 }, - name: 'Cronos Mainnet', - shortName: 'cro', + "name": "Flare Mainnet", + "shortName": "flr" }, { - chainId: 40, - explorers: [ + "chainId": 25, + "explorers": [ { - name: 'teloscan', - url: 'https://teloscan.io', - standard: 'EIP3091', - }, + "name": "Cronos Explorer", + "url": "https://explorer.cronos.org", + "standard": "none" + } ], - nativeCurrency: { - name: 'Telos', - symbol: 'TLOS', - decimals: 18, + "nativeCurrency": { + "name": "Cronos", + "symbol": "CRO", + "decimals": 18 }, - name: 'Telos EVM Mainnet', - shortName: 'TelosEVM', + "name": "Cronos Mainnet", + "shortName": "cro" }, { - chainId: 56, - explorers: [ + "chainId": 40, + "explorers": [ { - name: 'bscscan', - url: 'https://bscscan.com', - standard: 'EIP3091', - }, + "name": "teloscan", + "url": "https://teloscan.io", + "standard": "EIP3091" + } + ], + "nativeCurrency": { + "name": "Telos", + "symbol": "TLOS", + "decimals": 18 + }, + "name": "Telos EVM Mainnet", + "shortName": "TelosEVM" + }, + { + "chainId": 56, + "explorers": [ { - name: 'dexguru', - url: 'https://bnb.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', + "name": "bscscan", + "url": "https://bscscan.com", + "standard": "EIP3091" }, + { + "name": "dexguru", + "url": "https://bnb.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'BNB Chain Native Token', - symbol: 'BNB', - decimals: 18, + "nativeCurrency": { + "name": "BNB Chain Native Token", + "symbol": "BNB", + "decimals": 18 }, - name: 'BNB Smart Chain Mainnet', - shortName: 'bnb', + "name": "BNB Smart Chain Mainnet", + "shortName": "bnb" }, { - chainId: 66, - explorers: [ + "chainId": 66, + "explorers": [ { - name: 'OKLink', - url: 'https://www.oklink.com/en/okc', - standard: 'EIP3091', - }, + "name": "OKLink", + "url": "https://www.oklink.com/en/okc", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'OKXChain Global Utility Token', - symbol: 'OKT', - decimals: 18, + "nativeCurrency": { + "name": "OKXChain Global Utility Token", + "symbol": "OKT", + "decimals": 18 }, - name: 'OKXChain Mainnet', - shortName: 'okt', + "name": "OKXChain Mainnet", + "shortName": "okt" }, { - chainId: 97, - explorers: [ + "chainId": 97, + "explorers": [ { - name: 'bscscan-testnet', - url: 'https://testnet.bscscan.com', - standard: 'EIP3091', - }, + "name": "bscscan-testnet", + "url": "https://testnet.bscscan.com", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'BNB Chain Native Token', - symbol: 'tBNB', - decimals: 18, + "nativeCurrency": { + "name": "BNB Chain Native Token", + "symbol": "tBNB", + "decimals": 18 }, - name: 'BNB Smart Chain Testnet', - shortName: 'bnbt', + "name": "BNB Smart Chain Testnet", + "shortName": "bnbt" }, { - chainId: 100, - explorers: [ + "chainId": 100, + "explorers": [ { - name: 'gnosisscan', - url: 'https://gnosisscan.io', - standard: 'EIP3091', + "name": "gnosisscan", + "url": "https://gnosisscan.io", + "standard": "EIP3091" }, { - name: 'blockscout', - url: 'https://gnosis.blockscout.com', - icon: 'blockscout', - standard: 'EIP3091', + "name": "blockscout", + "url": "https://gnosis.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://gnosis.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://gnosis.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'xDAI', - symbol: 'XDAI', - decimals: 18, + "nativeCurrency": { + "name": "xDAI", + "symbol": "XDAI", + "decimals": 18 }, - name: 'Gnosis', - shortName: 'gno', + "name": "Gnosis", + "shortName": "gno" }, { - chainId: 108, - explorers: [ + "chainId": 108, + "explorers": [ { - name: 'thundercore-viewblock', - url: 'https://viewblock.io/thundercore', - standard: 'EIP3091', - }, + "name": "thundercore-viewblock", + "url": "https://viewblock.io/thundercore", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'ThunderCore Token', - symbol: 'TT', - decimals: 18, + "nativeCurrency": { + "name": "ThunderCore Token", + "symbol": "TT", + "decimals": 18 }, - name: 'ThunderCore Mainnet', - shortName: 'TT', + "name": "ThunderCore Mainnet", + "shortName": "TT" }, { - chainId: 122, - explorers: [ + "chainId": 122, + "explorers": [ { - name: 'blockscout', - url: 'https://explorer.fuse.io', - icon: 'blockscout', - standard: 'EIP3091', - }, + "name": "blockscout", + "url": "https://explorer.fuse.io", + "icon": "blockscout", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Fuse', - symbol: 'FUSE', - decimals: 18, + "nativeCurrency": { + "name": "Fuse", + "symbol": "FUSE", + "decimals": 18 }, - name: 'Fuse Mainnet', - shortName: 'fuse', + "name": "Fuse Mainnet", + "shortName": "fuse" }, { - chainId: 128, - explorers: [ + "chainId": 128, + "explorers": [ { - name: 'hecoinfo', - url: 'https://hecoinfo.com', - standard: 'EIP3091', - }, + "name": "hecoinfo", + "url": "https://hecoinfo.com", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Huobi ECO Chain Native Token', - symbol: 'HT', - decimals: 18, + "nativeCurrency": { + "name": "Huobi ECO Chain Native Token", + "symbol": "HT", + "decimals": 18 }, - name: 'Huobi ECO Chain Mainnet', - shortName: 'heco', + "name": "Huobi ECO Chain Mainnet", + "shortName": "heco" }, { - chainId: 137, - explorers: [ + "chainId": 137, + "explorers": [ { - name: 'polygonscan', - url: 'https://polygonscan.com', - standard: 'EIP3091', + "name": "polygonscan", + "url": "https://polygonscan.com", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://polygon.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://polygon.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'MATIC', - symbol: 'MATIC', - decimals: 18, + "nativeCurrency": { + "name": "MATIC", + "symbol": "MATIC", + "decimals": 18 }, - name: 'Polygon Mainnet', - shortName: 'matic', + "name": "Polygon Mainnet", + "shortName": "matic" }, { - chainId: 199, - explorers: [ + "chainId": 199, + "explorers": [ { - name: 'BitTorrent Chain Explorer', - url: 'https://bttcscan.com', - standard: 'EIP3091', - }, + "name": "BitTorrent Chain Explorer", + "url": "https://bttcscan.com", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'BitTorrent', - symbol: 'BTT', - decimals: 18, + "nativeCurrency": { + "name": "BitTorrent", + "symbol": "BTT", + "decimals": 18 }, - name: 'BitTorrent Chain Mainnet', - shortName: 'BTT', + "name": "BitTorrent Chain Mainnet", + "shortName": "BTT" }, { - chainId: 250, - explorers: [ + "chainId": 250, + "explorers": [ { - name: 'ftmscan', - url: 'https://ftmscan.com', - icon: 'ftmscan', - standard: 'EIP3091', + "name": "ftmscan", + "url": "https://ftmscan.com", + "icon": "ftmscan", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://fantom.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://fantom.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Fantom', - symbol: 'FTM', - decimals: 18, + "nativeCurrency": { + "name": "Fantom", + "symbol": "FTM", + "decimals": 18 }, - name: 'Fantom Opera', - shortName: 'ftm', + "name": "Fantom Opera", + "shortName": "ftm" }, { - chainId: 288, - explorers: [ + "chainId": 288, + "explorers": [ { - name: 'Bobascan', - url: 'https://bobascan.com', - standard: 'none', - }, - { - name: 'Blockscout', - url: 'https://blockexplorer.boba.network', - standard: 'none', - }, + "name": "Bobascan", + "url": "https://bobascan.com", + "standard": "none" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Boba Network', - shortName: 'Boba', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ - { - url: 'https://gateway.boba.network', - }, - ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, + "name": "Boba Network", + "shortName": "Boba", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ + { + "url": "https://gateway.boba.network" + } + ] + } }, { - chainId: 314, - explorers: [ + "chainId": 314, + "explorers": [ { - name: 'Filfox', - url: 'https://filfox.info/en', - standard: 'none', + "name": "Filfox", + "url": "https://filfox.info/en", + "standard": "none" }, { - name: 'Beryx', - url: 'https://beryx.zondax.ch', - standard: 'none', + "name": "Beryx", + "url": "https://beryx.zondax.ch", + "standard": "none" }, { - name: 'Glif Explorer', - url: 'https://explorer.glif.io', - standard: 'EIP3091', + "name": "Glif Explorer", + "url": "https://explorer.glif.io", + "standard": "EIP3091" }, { - name: 'Dev.storage', - url: 'https://dev.storage', - standard: 'none', + "name": "Dev.storage", + "url": "https://dev.storage", + "standard": "none" }, { - name: 'Filscan', - url: 'https://filscan.io', - standard: 'none', + "name": "Filscan", + "url": "https://filscan.io", + "standard": "none" }, { - name: 'Filscout', - url: 'https://filscout.io/en', - standard: 'none', - }, + "name": "Filscout", + "url": "https://filscout.io/en", + "standard": "none" + } ], - nativeCurrency: { - name: 'filecoin', - symbol: 'FIL', - decimals: 18, + "nativeCurrency": { + "name": "filecoin", + "symbol": "FIL", + "decimals": 18 }, - name: 'Filecoin - Mainnet', - shortName: 'filecoin', + "name": "Filecoin - Mainnet", + "shortName": "filecoin" }, { - chainId: 324, - explorers: [ + "chainId": 324, + "explorers": [ { - name: 'zkSync Era Block Explorer', - url: 'https://explorer.zksync.io', - icon: 'zksync-era', - standard: 'EIP3091', - }, + "name": "zkSync Era Block Explorer", + "url": "https://explorer.zksync.io", + "icon": "zksync-era", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'zkSync Mainnet', - shortName: 'zksync', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ - { - url: 'https://bridge.zksync.io/', - }, - ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, - }, - { - chainId: 1088, - explorers: [ - { - name: 'blockscout', - url: 'https://andromeda-explorer.metis.io', - standard: 'EIP3091', - }, - ], - nativeCurrency: { - name: 'Metis', - symbol: 'METIS', - decimals: 18, - }, - name: 'Metis Andromeda Mainnet', - shortName: 'metis-andromeda', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ + "name": "zkSync Mainnet", + "shortName": "zksync", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ { - url: 'https://bridge.metis.io', - }, - ], - }, - }, - { - chainId: 1101, - explorers: [ - { - name: 'blockscout', - url: 'https://zkevm.polygonscan.com', - icon: 'zkevm', - standard: 'EIP3091', - }, - ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Polygon zkEVM', - shortName: 'zkevm', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ + "url": "https://bridge.zksync.io/" + } + ] + } + }, + { + "chainId": 1088, + "explorers": [ + { + "name": "blockscout", + "url": "https://andromeda-explorer.metis.io", + "standard": "EIP3091" + } + ], + "nativeCurrency": { + "name": "Metis", + "symbol": "METIS", + "decimals": 18 + }, + "name": "Metis Andromeda Mainnet", + "shortName": "metis-andromeda", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ { - url: 'https://bridge.zkevm-rpc.com', - }, - ], - }, + "url": "https://bridge.metis.io" + } + ] + } + }, + { + "chainId": 1101, + "explorers": [ + { + "name": "blockscout", + "url": "https://zkevm.polygonscan.com", + "icon": "zkevm", + "standard": "EIP3091" + } + ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "name": "Polygon zkEVM", + "shortName": "zkevm", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ + { + "url": "https://bridge.zkevm-rpc.com" + } + ] + } }, { - chainId: 1116, - explorers: [ + "chainId": 1116, + "explorers": [ { - name: 'Core Scan', - url: 'https://scan.coredao.org', - icon: 'core', - standard: 'EIP3091', - }, + "name": "Core Scan", + "url": "https://scan.coredao.org", + "icon": "core", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Core Blockchain Native Token', - symbol: 'CORE', - decimals: 18, + "nativeCurrency": { + "name": "Core Blockchain Native Token", + "symbol": "CORE", + "decimals": 18 }, - name: 'Core Blockchain Mainnet', - shortName: 'core', + "name": "Core Blockchain Mainnet", + "shortName": "core" }, { - chainId: 1284, - explorers: [ + "chainId": 1284, + "explorers": [ { - name: 'moonscan', - url: 'https://moonbeam.moonscan.io', - standard: 'none', - }, + "name": "moonscan", + "url": "https://moonbeam.moonscan.io", + "standard": "none" + } ], - nativeCurrency: { - name: 'Glimmer', - symbol: 'GLMR', - decimals: 18, + "nativeCurrency": { + "name": "Glimmer", + "symbol": "GLMR", + "decimals": 18 }, - name: 'Moonbeam', - shortName: 'mbeam', + "name": "Moonbeam", + "shortName": "mbeam" }, { - chainId: 1285, - explorers: [ + "chainId": 1285, + "explorers": [ { - name: 'moonscan', - url: 'https://moonriver.moonscan.io', - standard: 'none', - }, + "name": "moonscan", + "url": "https://moonriver.moonscan.io", + "standard": "none" + } ], - nativeCurrency: { - name: 'Moonriver', - symbol: 'MOVR', - decimals: 18, + "nativeCurrency": { + "name": "Moonriver", + "symbol": "MOVR", + "decimals": 18 }, - name: 'Moonriver', - shortName: 'mriver', + "name": "Moonriver", + "shortName": "mriver" }, { - chainId: 2222, - explorers: [ + "chainId": 2222, + "explorers": [ { - name: 'Kava EVM Explorer', - url: 'https://kavascan.com', - standard: 'EIP3091', - icon: 'kava', - }, + "name": "Kava EVM Explorer", + "url": "https://kavascan.com", + "standard": "EIP3091", + "icon": "kava" + } ], - nativeCurrency: { - name: 'Kava', - symbol: 'KAVA', - decimals: 18, + "nativeCurrency": { + "name": "Kava", + "symbol": "KAVA", + "decimals": 18 }, - name: 'Kava', - shortName: 'kava', + "name": "Kava", + "shortName": "kava" }, { - chainId: 4002, - explorers: [ + "chainId": 4002, + "explorers": [ { - name: 'ftmscan', - url: 'https://testnet.ftmscan.com', - icon: 'ftmscan', - standard: 'EIP3091', - }, + "name": "ftmscan", + "url": "https://testnet.ftmscan.com", + "icon": "ftmscan", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Fantom', - symbol: 'FTM', - decimals: 18, + "nativeCurrency": { + "name": "Fantom", + "symbol": "FTM", + "decimals": 18 }, - name: 'Fantom Testnet', - shortName: 'tftm', + "name": "Fantom Testnet", + "shortName": "tftm" }, { - chainId: 7000, - explorers: [ + "chainId": 7000, + "explorers": [ { - name: 'ZetaChain Mainnet Explorer', - url: 'https://explorer.mainnet.zetachain.com', - standard: 'none', - }, + "name": "ZetaChain Mainnet Explorer", + "url": "https://explorer.mainnet.zetachain.com", + "standard": "none" + } ], - nativeCurrency: { - name: 'Zeta', - symbol: 'ZETA', - decimals: 18, + "nativeCurrency": { + "name": "Zeta", + "symbol": "ZETA", + "decimals": 18 }, - name: 'ZetaChain Mainnet', - shortName: 'zetachain-mainnet', + "name": "ZetaChain Mainnet", + "shortName": "zetachain-mainnet" }, { - chainId: 8453, - explorers: [ + "chainId": 8453, + "explorers": [ { - name: 'basescan', - url: 'https://basescan.org', - standard: 'none', + "name": "basescan", + "url": "https://basescan.org", + "standard": "none" }, { - name: 'basescout', - url: 'https://base.blockscout.com', - icon: 'blockscout', - standard: 'EIP3091', + "name": "basescout", + "url": "https://base.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://base.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://base.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, - name: 'Base', - shortName: 'base', + "name": "Base", + "shortName": "base" }, { - chainId: 11235, - explorers: [ + "chainId": 11235, + "explorers": [ { - name: 'Mainnet HAQQ Explorer', - url: 'https://explorer.haqq.network', - standard: 'EIP3091', - }, + "name": "Mainnet HAQQ Explorer", + "url": "https://explorer.haqq.network", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Islamic Coin', - symbol: 'ISLM', - decimals: 18, + "nativeCurrency": { + "name": "Islamic Coin", + "symbol": "ISLM", + "decimals": 18 }, - name: 'Haqq Network', - shortName: 'ISLM', + "name": "Haqq Network", + "shortName": "ISLM" }, { - chainId: 42161, - explorers: [ + "chainId": 42161, + "explorers": [ { - name: 'Arbiscan', - url: 'https://arbiscan.io', - standard: 'EIP3091', + "name": "Arbiscan", + "url": "https://arbiscan.io", + "standard": "EIP3091" }, { - name: 'Arbitrum Explorer', - url: 'https://explorer.arbitrum.io', - standard: 'EIP3091', + "name": "Arbitrum Explorer", + "url": "https://explorer.arbitrum.io", + "standard": "EIP3091" }, { - name: 'dexguru', - url: 'https://arbitrum.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, + "name": "dexguru", + "url": "https://arbitrum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Arbitrum One', - shortName: 'arb1', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ - { - url: 'https://bridge.arbitrum.io', - }, - ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, - }, - { - chainId: 42170, - explorers: [ - { - name: 'Arbitrum Nova Chain Explorer', - url: 'https://nova-explorer.arbitrum.io', - icon: 'blockscout', - standard: 'EIP3091', - }, - { - name: 'dexguru', - url: 'https://nova.dex.guru', - icon: 'dexguru', - standard: 'EIP3091', - }, - ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Arbitrum Nova', - shortName: 'arb-nova', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ + "name": "Arbitrum One", + "shortName": "arb1", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ { - url: 'https://bridge.arbitrum.io', - }, - ], - }, + "url": "https://bridge.arbitrum.io" + } + ] + } + }, + { + "chainId": 42170, + "explorers": [ + { + "name": "Arbitrum Nova Chain Explorer", + "url": "https://nova-explorer.arbitrum.io", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://nova.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "name": "Arbitrum Nova", + "shortName": "arb-nova", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ + { + "url": "https://bridge.arbitrum.io" + } + ] + } }, { - chainId: 42220, - explorers: [ + "chainId": 42220, + "explorers": [ { - name: 'Celoscan', - url: 'https://celoscan.io', - standard: 'EIP3091', + "name": "Celoscan", + "url": "https://celoscan.io", + "standard": "EIP3091" }, { - name: 'blockscout', - url: 'https://explorer.celo.org', - standard: 'none', - }, + "name": "blockscout", + "url": "https://explorer.celo.org", + "standard": "none" + } ], - nativeCurrency: { - name: 'CELO', - symbol: 'CELO', - decimals: 18, + "nativeCurrency": { + "name": "CELO", + "symbol": "CELO", + "decimals": 18 }, - name: 'Celo Mainnet', - shortName: 'celo', + "name": "Celo Mainnet", + "shortName": "celo" }, { - chainId: 43113, - explorers: [ + "chainId": 43113, + "explorers": [ { - name: 'snowtrace', - url: 'https://testnet.snowtrace.io', - standard: 'EIP3091', - }, + "name": "snowtrace", + "url": "https://testnet.snowtrace.io", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Avalanche', - symbol: 'AVAX', - decimals: 18, + "nativeCurrency": { + "name": "Avalanche", + "symbol": "AVAX", + "decimals": 18 }, - name: 'Avalanche Fuji Testnet', - shortName: 'Fuji', + "name": "Avalanche Fuji Testnet", + "shortName": "Fuji" }, { - chainId: 43114, - explorers: [ + "chainId": 43114, + "explorers": [ { - name: 'snowtrace', - url: 'https://snowtrace.io', - standard: 'EIP3091', - }, + "name": "snowtrace", + "url": "https://snowtrace.io", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Avalanche', - symbol: 'AVAX', - decimals: 18, + "nativeCurrency": { + "name": "Avalanche", + "symbol": "AVAX", + "decimals": 18 }, - name: 'Avalanche C-Chain', - shortName: 'avax', + "name": "Avalanche C-Chain", + "shortName": "avax" }, { - chainId: 43288, - explorers: [ + "chainId": 43288, + "explorers": [ { - name: 'Boba Avax Explorer', - url: 'https://blockexplorer.avax.boba.network', - standard: 'none', - }, + "name": "Boba Avax Explorer", + "url": "https://blockexplorer.avax.boba.network", + "standard": "none" + } ], - nativeCurrency: { - name: 'Boba Token', - symbol: 'BOBA', - decimals: 18, + "nativeCurrency": { + "name": "Boba Token", + "symbol": "BOBA", + "decimals": 18 }, - name: 'Boba Avax', - shortName: 'bobaavax', + "name": "Boba Avax", + "shortName": "bobaavax" }, { - chainId: 56288, - explorers: [ + "chainId": 56288, + "explorers": [ { - name: 'Boba BNB block explorer', - url: 'https://blockexplorer.bnb.boba.network', - standard: 'none', - }, + "name": "Boba BNB block explorer", + "url": "https://bobascan.com", + "standard": "none" + } ], - nativeCurrency: { - name: 'Boba Token', - symbol: 'BOBA', - decimals: 18, - }, - name: 'Boba BNB Mainnet', - shortName: 'BobaBnb', - parent: { - type: 'L2', - chain: 'eip155-5', - bridges: [ - { - url: 'https://gateway.boba.network', - }, - ], + "nativeCurrency": { + "name": "Boba Token", + "symbol": "BOBA", + "decimals": 18 }, + "name": "Boba BNB Mainnet", + "shortName": "BobaBnb", + "parent": { + "type": "L2", + "chain": "eip155-5", + "bridges": [ + { + "url": "https://gateway.boba.network" + } + ] + } }, { - chainId: 59144, - explorers: [ + "chainId": 59144, + "explorers": [ { - name: 'Etherscan', - url: 'https://lineascan.build', - standard: 'EIP3091', - icon: 'linea', + "name": "Etherscan", + "url": "https://lineascan.build", + "standard": "EIP3091", + "icon": "linea" }, { - name: 'Blockscout', - url: 'https://explorer.linea.build', - standard: 'EIP3091', - icon: 'linea', + "name": "Blockscout", + "url": "https://explorer.linea.build", + "standard": "EIP3091", + "icon": "linea" }, { - name: 'L2scan', - url: 'https://linea.l2scan.co', - standard: 'EIP3091', - icon: 'linea', - }, + "name": "L2scan", + "url": "https://linea.l2scan.co", + "standard": "EIP3091", + "icon": "linea" + } ], - nativeCurrency: { - name: 'Linea Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Linea', - shortName: 'linea', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ - { - url: 'https://bridge.linea.build', - }, - ], + "nativeCurrency": { + "name": "Linea Ether", + "symbol": "ETH", + "decimals": 18 }, + "name": "Linea", + "shortName": "linea", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ + { + "url": "https://bridge.linea.build" + } + ] + } }, { - chainId: 80001, - explorers: [ + "chainId": 80001, + "explorers": [ { - name: 'polygonscan', - url: 'https://mumbai.polygonscan.com', - standard: 'EIP3091', - }, + "name": "polygonscan", + "url": "https://mumbai.polygonscan.com", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'MATIC', - symbol: 'MATIC', - decimals: 18, + "nativeCurrency": { + "name": "MATIC", + "symbol": "MATIC", + "decimals": 18 }, - name: 'Mumbai', - shortName: 'maticmum', + "name": "Mumbai", + "shortName": "maticmum" }, { - chainId: 81457, - explorers: [ + "chainId": 81457, + "explorers": [ { - name: 'Blastscan', - url: 'https://blastscan.io', - icon: 'blast', - standard: 'EIP3091', + "name": "Blastscan", + "url": "https://blastscan.io", + "icon": "blast", + "standard": "EIP3091" }, { - name: 'Blast Explorer', - url: 'https://blastexplorer.io', - icon: 'blast', - standard: 'EIP3091', - }, + "name": "Blast Explorer", + "url": "https://blastexplorer.io", + "icon": "blast", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Blast', - shortName: 'blastmainnet', - parent: { - type: 'L2', - chain: 'eip155-1', + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, + "name": "Blast", + "shortName": "blastmainnet", + "parent": { + "type": "L2", + "chain": "eip155-1" + } }, { - chainId: 421614, - explorers: [ + "chainId": 421614, + "explorers": [ { - name: 'Arbitrum Sepolia Rollup Testnet Explorer', - url: 'https://sepolia-explorer.arbitrum.io', - standard: 'EIP3091', - }, + "name": "Arbitrum Sepolia Rollup Testnet Explorer", + "url": "https://sepolia-explorer.arbitrum.io", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Sepolia Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Arbitrum Sepolia', - shortName: 'arb-sep', - parent: { - type: 'L2', - chain: 'eip155-11155111', - bridges: [ - { - url: 'https://bridge.arbitrum.io', - }, - ], + "nativeCurrency": { + "name": "Sepolia Ether", + "symbol": "ETH", + "decimals": 18 }, - }, - { - chainId: 534352, - explorers: [ - { - name: 'Scrollscan', - url: 'https://scrollscan.com', - standard: 'EIP3091', - }, - { - name: 'Blockscout', - url: 'https://blockscout.scroll.io', - standard: 'EIP3091', - }, - ], - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - name: 'Scroll', - shortName: 'scr', - parent: { - type: 'L2', - chain: 'eip155-1', - bridges: [ + "name": "Arbitrum Sepolia", + "shortName": "arb-sep", + "parent": { + "type": "L2", + "chain": "eip155-11155111", + "bridges": [ { - url: 'https://scroll.io/bridge', - }, - ], - }, + "url": "https://bridge.arbitrum.io" + } + ] + } + }, + { + "chainId": 534352, + "explorers": [ + { + "name": "Scrollscan", + "url": "https://scrollscan.com", + "standard": "EIP3091" + } + ], + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "name": "Scroll", + "shortName": "scr", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [ + { + "url": "https://scroll.io/bridge" + } + ] + } }, { - chainId: 11155111, - explorers: [ + "chainId": 11155111, + "explorers": [ { - name: 'etherscan-sepolia', - url: 'https://sepolia.etherscan.io', - standard: 'EIP3091', + "name": "etherscan-sepolia", + "url": "https://sepolia.etherscan.io", + "standard": "EIP3091" }, { - name: 'otterscan-sepolia', - url: 'https://sepolia.otterscan.io', - standard: 'EIP3091', - }, + "name": "otterscan-sepolia", + "url": "https://sepolia.otterscan.io", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'Sepolia Ether', - symbol: 'ETH', - decimals: 18, + "nativeCurrency": { + "name": "Sepolia Ether", + "symbol": "ETH", + "decimals": 18 }, - name: 'Sepolia', - shortName: 'sep', + "name": "Sepolia", + "shortName": "sep" }, { - chainId: 1666600000, - explorers: [ + "chainId": 1666600000, + "explorers": [ { - name: 'Harmony Block Explorer', - url: 'https://explorer.harmony.one', - standard: 'EIP3091', - }, + "name": "Harmony Block Explorer", + "url": "https://explorer.harmony.one", + "standard": "EIP3091" + } ], - nativeCurrency: { - name: 'ONE', - symbol: 'ONE', - decimals: 18, + "nativeCurrency": { + "name": "ONE", + "symbol": "ONE", + "decimals": 18 }, - name: 'Harmony Mainnet Shard 0', - shortName: 'hmy-s0', + "name": "Harmony Mainnet Shard 0", + "shortName": "hmy-s0" }, { - chainId: 11297108109, - explorers: [ + "chainId": 11297108109, + "explorers": [ { - name: 'Chainlens', - url: 'https://palm.chainlens.com', - standard: 'EIP3091', + "name": "Chainlens", + "url": "https://palm.chainlens.com", + "standard": "EIP3091" }, { - name: 'Dora', - url: 'https://www.ondora.xyz/network/palm', - standard: 'none', - }, + "name": "Dora", + "url": "https://www.ondora.xyz/network/palm", + "standard": "none" + } ], - nativeCurrency: { - name: 'PALM', - symbol: 'PALM', - decimals: 18, + "nativeCurrency": { + "name": "PALM", + "symbol": "PALM", + "decimals": 18 }, - name: 'Palm', - shortName: 'palm', - }, -] as const + "name": "Palm", + "shortName": "palm" + } +] as const; + diff --git a/packages/sushi/src/config/native-ids.ts b/packages/sushi/src/config/native-ids.ts index f034f6435c..d4b1aba7ad 100644 --- a/packages/sushi/src/config/native-ids.ts +++ b/packages/sushi/src/config/native-ids.ts @@ -54,4 +54,5 @@ export const nativeCurrencyIds = { [ChainId.ZETACHAIN]: 'ZETA', [ChainId.CRONOS]: 'CRO', [ChainId.BLAST]: 'ETH', + [ChainId.FLARE]: 'FLR', } as const diff --git a/packages/sushi/src/config/route-processor.ts b/packages/sushi/src/config/route-processor.ts index 6a36705ec7..394e589fcd 100644 --- a/packages/sushi/src/config/route-processor.ts +++ b/packages/sushi/src/config/route-processor.ts @@ -132,6 +132,7 @@ export const ROUTE_PROCESSOR_3_SUPPORTED_CHAIN_IDS = [ ChainId.TELOS, ChainId.THUNDERCORE, ChainId.LINEA, + ChainId.FLARE, ] as const export type RouteProcessor3ChainId = (typeof ROUTE_PROCESSOR_3_SUPPORTED_CHAIN_IDS)[number] @@ -169,6 +170,7 @@ export const ROUTE_PROCESSOR_3_ADDRESS: Record< [ChainId.TELOS]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de', [ChainId.THUNDERCORE]: '0x1b9d177CcdeA3c79B6c8F40761fc8Dc9d0500EAa', [ChainId.LINEA]: '0x0b17dF2CDEf8f0fCb7847e287726C6a8c1415A1f', + [ChainId.FLARE]: '0x9B3F1D56D9004e6C69d8247d402F38DE5F87A27c', } as const export const isRouteProcessor3ChainId = ( chainId: ChainId, @@ -225,6 +227,7 @@ export const ROUTE_PROCESSOR_3_2_SUPPORTED_CHAIN_IDS = [ ChainId.SCROLL, ChainId.FILECOIN, ChainId.ZETACHAIN, + ChainId.FLARE, ] as const export type RouteProcessor3_2ChainId = (typeof ROUTE_PROCESSOR_3_2_SUPPORTED_CHAIN_IDS)[number] @@ -251,6 +254,7 @@ export const ROUTE_PROCESSOR_3_2_ADDRESS: Record< [ChainId.SCROLL]: '0xCA6Fe749878841b96F620Ec79638B13dAaD3D320', [ChainId.FILECOIN]: '0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959', [ChainId.ZETACHAIN]: '0xb46e319390De313B8cc95EA5aa30C7bBFD79Da94', + [ChainId.FLARE]: '0x5CeEe9F4F49C106D5Bc049C8D649C332E6d365ad', } as const export const isRouteProcessor3_2ChainId = ( chainId: ChainId, diff --git a/packages/sushi/src/config/stables.ts b/packages/sushi/src/config/stables.ts index e15ae8142a..ee03cf6fcc 100644 --- a/packages/sushi/src/config/stables.ts +++ b/packages/sushi/src/config/stables.ts @@ -208,6 +208,7 @@ export const STABLES = { ], [ChainId.CRONOS]: [USDC[ChainId.CRONOS]], [ChainId.BLAST]: [USDB[ChainId.BLAST], MUSD], + [ChainId.FLARE]: [USDT[ChainId.FLARE]], // TESTNETS // [ChainId.RINKEBY]: [USDC[ChainId.RINKEBY]], // [ChainId.ROPSTEN]: [ diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index e82f9e73e0..bcf69a7184 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -32,6 +32,7 @@ import { // evmosTestnet, fantom, fantomTestnet, + flare as _flare, // fantomTestnet, // filecoinTestnet, foundry, @@ -90,6 +91,7 @@ export { // evmos, // evmosTestnet, fantom, + flare, // fantomTestnet, // filecoinTestnet, foundry, @@ -140,6 +142,16 @@ const haqq = { }, } as const +const flare = { + ..._flare, + contracts: { + multicall3: { + address: "0xcA11bde05977b3631167028862bE2a173976CA11", + blockCreated: 3002461, + }, + }, +} as const + // Chains missing from viem entirely export const kava = { id: ChainId.KAVA, @@ -490,95 +502,51 @@ export const blast = { }, } as const -// const alchemyId = -// process.env['ALCHEMY_ID'] || process.env['NEXT_PUBLIC_ALCHEMY_ID'] -const drpcId = process.env['DRPC_ID'] || process.env['NEXT_PUBLIC_DRPC_ID'] - export const publicTransports = { - [ChainId.ARBITRUM_NOVA]: http( - `https://lb.drpc.org/ogrpc?network=arbitrum-nova&dkey=${drpcId}`, - ), - [ChainId.ARBITRUM]: http( - `https://lb.drpc.org/ogrpc?network=arbitrum&dkey=${drpcId}`, - ), - [ChainId.AVALANCHE]: http( - `https://lb.drpc.org/ogrpc?network=avalanche&dkey=${drpcId}`, - ), - [ChainId.BOBA]: http('https://mainnet.boba.network'), - [ChainId.BOBA_AVAX]: http('https://avax.boba.network'), - [ChainId.BOBA_BNB]: http('https://bnb.boba.network'), - [ChainId.BSC]: http(`https://lb.drpc.org/ogrpc?network=bsc&dkey=${drpcId}`), - [ChainId.BTTC]: http('https://rpc.bittorrentchain.io'), - [ChainId.CELO]: http(`https://lb.drpc.org/ogrpc?network=celo&dkey=${drpcId}`), - [ChainId.ETHEREUM]: http( - `https://lb.drpc.org/ogrpc?network=ethereum&dkey=${drpcId}`, - ), - [ChainId.FANTOM]: http( - `https://lb.drpc.org/ogrpc?network=fantom&dkey=${drpcId}`, - ), - [ChainId.FUSE]: http(`https://lb.drpc.org/ogrpc?network=fuse&dkey=${drpcId}`), - [ChainId.GNOSIS]: http( - `https://lb.drpc.org/ogrpc?network=gnosis&dkey=${drpcId}`, - ), - [ChainId.HARMONY]: http( - `https://lb.drpc.org/ogrpc?network=harmony-0&dkey=${drpcId}`, - ), - [ChainId.KAVA]: http(`https://lb.drpc.org/ogrpc?network=kava&dkey=${drpcId}`), - [ChainId.METIS]: http( - `https://lb.drpc.org/ogrpc?network=metis&dkey=${drpcId}`, - ), - [ChainId.MOONBEAM]: http( - `https://lb.drpc.org/ogrpc?network=moonbeam&dkey=${drpcId}`, - ), - [ChainId.MOONRIVER]: http( - `https://lb.drpc.org/ogrpc?network=moonriver&dkey=${drpcId}`, - ), - [ChainId.OPTIMISM]: http( - `https://lb.drpc.org/ogrpc?network=optimism&dkey=${drpcId}`, - ), - [ChainId.POLYGON]: http( - `https://lb.drpc.org/ogrpc?network=polygon&dkey=${drpcId}`, - ), - [ChainId.POLYGON_ZKEVM]: http( - `https://lb.drpc.org/ogrpc?network=polygon-zkevm&dkey=${drpcId}`, - ), - [ChainId.THUNDERCORE]: http('https://mainnet-rpc.thundercore.com'), - [ChainId.HAQQ]: http(`https://lb.drpc.org/ogrpc?network=haqq&dkey=${drpcId}`), - [ChainId.CORE]: http('https://rpc.coredao.org'), - [ChainId.TELOS]: http('https://rpc1.us.telos.net/evm'), + [ChainId.ARBITRUM_NOVA]: http(arbitrumNova.rpcUrls.default.http[0]), + [ChainId.ARBITRUM]: http(arbitrum.rpcUrls.default.http[0]), + [ChainId.AVALANCHE]: http(avalanche.rpcUrls.default.http[0]), + [ChainId.BOBA]: http(boba.rpcUrls.default.http[0]), + [ChainId.BOBA_AVAX]: http(bobaAvax.rpcUrls.default.http[0]), + [ChainId.BOBA_BNB]: http(bobaBnb.rpcUrls.default.http[0]), + [ChainId.BSC]: http(bsc.rpcUrls.default.http[0]), + [ChainId.BTTC]: http(bttc.rpcUrls.default.http[0]), + [ChainId.CELO]: http(celo.rpcUrls.default.http[0]), + [ChainId.ETHEREUM]: http(mainnet.rpcUrls.default.http[0]), + [ChainId.FANTOM]: http(fantom.rpcUrls.default.http[0]), + [ChainId.FUSE]: http(fuse.rpcUrls.default.http[0]), + [ChainId.GNOSIS]: http(gnosis.rpcUrls.default.http[0]), + [ChainId.HARMONY]: http(harmonyOne.rpcUrls.default.http[0]), + [ChainId.KAVA]: http(kava.rpcUrls.default.http[0]), + [ChainId.METIS]: http(metis.rpcUrls.default.http[0]), + [ChainId.MOONBEAM]: http(moonbeam.rpcUrls.default.http[0]), + [ChainId.MOONRIVER]: http(moonriver.rpcUrls.default.http[0]), + [ChainId.OPTIMISM]: http(optimism.rpcUrls.default.http[0]), + [ChainId.POLYGON]: http(polygon.rpcUrls.default.http[0]), + [ChainId.POLYGON_ZKEVM]: http(polygonZkEvm.rpcUrls.default.http[0]), + [ChainId.THUNDERCORE]: http(thundercore.rpcUrls.default.http[0]), + [ChainId.HAQQ]: http(haqq.rpcUrls.default.http[0]), + [ChainId.CORE]: http(core.rpcUrls.default.http[0]), + [ChainId.TELOS]: http(telos.rpcUrls.default.http[0]), [ChainId.PALM]: http(palm.rpcUrls.default.http[0]), [ChainId.OKEX]: http(okc.rpcUrls.default.http[0]), [ChainId.HECO]: http(heco.rpcUrls.default.http[0]), [ChainId.ZKSYNC_ERA]: http(zkSync.rpcUrls.default.http[0]), - [ChainId.LINEA]: http( - `https://lb.drpc.org/ogrpc?network=linea&dkey=${drpcId}`, - ), - [ChainId.BASE]: http(`https://lb.drpc.org/ogrpc?network=base&dkey=${drpcId}`), - [ChainId.SCROLL]: http( - `https://lb.drpc.org/ogrpc?network=scroll&dkey=${drpcId}`, - ), - [ChainId.FILECOIN]: http( - `https://lb.drpc.org/ogrpc?network=filecoin&dkey=${drpcId}`, - // 'https://fil-mainnet-1.rpc.laconic.com/rpc/v1' - ), - [ChainId.ZETACHAIN]: http( - `https://lb.drpc.org/ogrpc?network=zeta-chain&dkey=${drpcId}`, - ), - [ChainId.CRONOS]: http( - `https://lb.drpc.org/ogrpc?network=cronos&dkey=${drpcId}`, - ), - [ChainId.BLAST]: http( - `https://lb.drpc.org/ogrpc?network=blast&dkey=${drpcId}`, - ), + [ChainId.LINEA]: http(linea.rpcUrls.default.http[0]), + [ChainId.BASE]: http(base.rpcUrls.default.http[0]), + [ChainId.SCROLL]: http(scroll.rpcUrls.default.http[0]), + [ChainId.FILECOIN]: http(filecoin.rpcUrls.default.http[0]), + [ChainId.ZETACHAIN]: http(zetachain.rpcUrls.default.http[0]), + [ChainId.CRONOS]: http(cronos.rpcUrls.default.http[0]), + [ChainId.BLAST]: http(blast.rpcUrls.default.http[0]), + [ChainId.FLARE]: http(flare.rpcUrls.default.http[0]), /* Testnets */ // TODO: add testnet transports - [ChainId.ARBITRUM_TESTNET]: http('https://sepolia-rollup.arbitrum.io/rpc'), - [ChainId.AVALANCHE_TESTNET]: http( - 'https://api.avax-test.network/ext/bc/C/rpc', - ), - [ChainId.BSC_TESTNET]: http('https://bsc-testnet.public.blastapi.io'), - [ChainId.FANTOM_TESTNET]: http('https://rpc.testnet.fantom.network'), - [ChainId.POLYGON_TESTNET]: http('https://rpc.ankr.com/polygon_mumbai'), - [ChainId.SEPOLIA]: http('https://sepolia.drpc.org'), + [ChainId.ARBITRUM_TESTNET]: http(arbitrumSepolia.rpcUrls.default.http[0]), + [ChainId.AVALANCHE_TESTNET]: http(avalancheFuji.rpcUrls.default.http[0]), + [ChainId.BSC_TESTNET]: http(bscTestnet.rpcUrls.default.http[0]), + [ChainId.FANTOM_TESTNET]: http(fantomTestnet.rpcUrls.default.http[0]), + [ChainId.POLYGON_TESTNET]: http(polygonMumbai.rpcUrls.default.http[0]), + [ChainId.SEPOLIA]: http(sepolia.rpcUrls.default.http[0]), } as const satisfies Record export const publicChains = [ @@ -618,6 +586,7 @@ export const publicChains = [ scroll, filecoin, zetachain, + flare, /* Testnets */ arbitrumSepolia, @@ -773,6 +742,10 @@ export const publicClientConfig = { chain: blast, transport: publicTransports[ChainId.BLAST], }, + [ChainId.FLARE]: { + chain: flare, + transport: publicTransports[ChainId.FLARE], + }, /* Testnets */ [ChainId.ARBITRUM_TESTNET]: { chain: arbitrumSepolia, diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 75eafd6731..5940308846 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -311,6 +311,7 @@ export const WETH9_ADDRESS = { [ChainId.ZETACHAIN]: '0xd97B1de3619ed2c6BEb3860147E30cA8A7dC9891', [ChainId.CRONOS]: '0xe44Fd7fCb2b1581822D0c862B68222998a0c299a', [ChainId.BLAST]: '0x4300000000000000000000000000000000000004', + [ChainId.FLARE]: '0x62bd084cbcd6c85347c50292a141ea4d3e7e3511', } as const export const WNATIVE_ADDRESS = { @@ -367,6 +368,7 @@ export const WNATIVE_ADDRESS = { [ChainId.ZETACHAIN]: '0x5F0b1a82749cb4E2278EC87F8BF6B618dC71a8bf', [ChainId.CRONOS]: '0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23', [ChainId.BLAST]: WETH9_ADDRESS[ChainId.BLAST], + [ChainId.FLARE]: '0x1D80c49BbBCd1C0911346656B529DF9E5c2F783d', } as const export const SUSHI_ADDRESS = { @@ -481,6 +483,7 @@ export const USDT_ADDRESS = { [ChainId.HAQQ]: axlUSDT_ADDRESS[ChainId.HAQQ], [ChainId.SCROLL]: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df', [ChainId.ZETACHAIN]: '0x7c8dDa80bbBE1254a7aACf3219EBe1481c6E01d7', + [ChainId.FLARE]: '0x96B41289D90444B8adD57e6F265DB5aE8651DF29', } as const export const DAI_ADDRESS = { diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index cc60febbec..787b1cc8c8 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -684,6 +684,13 @@ export const WNATIVE = { name: 'Wrapped CRO', }), [ChainId.BLAST]: WETH9[ChainId.BLAST], + [ChainId.FLARE]: new Token({ + chainId: ChainId.FLARE, + address: WNATIVE_ADDRESS[ChainId.FLARE], + decimals: 18, + symbol: 'WFLR', + name: 'Wrapped FLR', + }), } as const export const SUSHI = addressMapToTokenMap( @@ -802,7 +809,7 @@ export const USDT: Record = { USDT_ADDRESS, ) as Omit< Record, - typeof ChainId.BSC & typeof ChainId.BSC_TESTNET + typeof ChainId.BSC & typeof ChainId.BSC_TESTNET & typeof ChainId.FLARE >), [ChainId.BSC]: new Token({ chainId: ChainId.BSC, @@ -825,6 +832,13 @@ export const USDT: Record = { symbol: 'USDT', name: 'Tether USD', }), + [ChainId.FLARE]: new Token({ + chainId: ChainId.FLARE, + address: USDT_ADDRESS[ChainId.FLARE], + decimals: 6, + symbol: 'eUSDT', + name: 'Tether USD', + }), } export const DAI = addressMapToTokenMap( @@ -1152,3 +1166,43 @@ export const MUSD = new Token({ symbol: 'MUSD', decimals: 18, }) + +export const ENOSYS_BNZ = new Token({ + chainId: ChainId.FLARE, + address: '0xfD3449E8Ee31117a848D41Ee20F497a9bCb53164', + decimals: 18, + symbol: 'BNZ', + name: 'BonezCoin', +}) + +export const ENOSYS_EQNT = new Token({ + chainId: ChainId.FLARE, + address: '0x60fDC7B744E886e96Aa0DEf5f69eE440dB9d8c77', + decimals: 18, + symbol: 'eQNT', + name: 'EnosysQuant', +}) + +export const ENOSYS_HLN = new Token({ + chainId: ChainId.FLARE, + address: '0x140D8d3649Ec605CF69018C627fB44cCC76eC89f', + decimals: 18, + symbol: 'HLN', + name: 'Helion', +}) + +export const ENOSYS_APS = new Token({ + chainId: ChainId.FLARE, + address: '0xff56eb5b1a7faa972291117e5e9565da29bc808d', + decimals: 18, + symbol: 'APS', + name: 'Apsis', +}) + +export const ENOSYS_EETH = new Token({ + chainId: 14, + address: '0xa76dcddce60a442d69bac7158f3660f50921b122', + decimals: 18, + symbol: 'eETH', + name: 'Enosys ETH', +}) diff --git a/packages/sushi/src/serializer/index.ts b/packages/sushi/src/serializer/index.ts index 7da4aa67a3..cd7bda5da9 100644 --- a/packages/sushi/src/serializer/index.ts +++ b/packages/sushi/src/serializer/index.ts @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs' import path from 'path' // import { fileURLToPath } from 'url' import serializer from 'serialijse' -import { ChainId } from 'sushi/chain' +import { ChainId } from '../chain/index.js' import { Native } from '../currency/index.js' import { BentoBridgePoolCode, From f94330ef38295ffe762d106be15d39276999c51e Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 26 Apr 2024 23:56:42 +0000 Subject: [PATCH 004/140] init --- .gitignore | 1 + packages/sushi/package.json | 1 + packages/sushi/src/router/memoizer.test.ts | 51 ++++++++++++++++++++++ packages/sushi/src/router/memoizer.ts | 31 +++++++++++++ pnpm-lock.yaml | 33 +++++++++++--- 5 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 packages/sushi/src/router/memoizer.test.ts create mode 100644 packages/sushi/src/router/memoizer.ts diff --git a/.gitignore b/.gitignore index 128f57f1b7..a3f851728c 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ exports # cache cache +mem-cache # generated generated diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 6d08193e82..eb1fed84c2 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -202,6 +202,7 @@ "date-fns": "3.3.1", "decimal.js-light": "2.5.1", "lodash.flatmap": "4.5.0", + "memoize-fs": "github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5", "numeral": "2.0.6", "seedrandom": "3.0.5", "serialijse": "0.3.0", diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts new file mode 100644 index 0000000000..c4ba5aab60 --- /dev/null +++ b/packages/sushi/src/router/memoizer.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it } from 'vitest' +import { memoizer } from './memoizer.js' +import fs from 'fs'; + +describe('Memoizer', async () => { + it('should serialize, memoize, read from cache, deserialize', async () => { + + let didHitCacheOnce = false + const testFn = (value1: any) => { + didHitCacheOnce = !didHitCacheOnce + return { + ...value1, + someOtherValue: 'some data' + } + } + const testMemoizer = await memoizer.fn(testFn) + + const testValue = { + bigint: 12345n, + string: 'some text', + number: 123, + bool: true, + obj: { + prop: 'some prop' + } + } + const noCacheHitReturnedValue = await testMemoizer(testValue) + const cacheHitReturnedValue = await testMemoizer(testValue) + const expectedReturnedValue = { + bigint: 12345n, + string: 'some text', + number: 123, + bool: true, + obj: { + prop: 'some prop' + }, + someOtherValue: 'some data' + } + + expect(didHitCacheOnce).toEqual(true); + expect(noCacheHitReturnedValue).toStrictEqual(expectedReturnedValue) + expect(cacheHitReturnedValue).toStrictEqual(expectedReturnedValue) + + // read cached file content + const cacheFileContent = fs.readFileSync('./mem-cache/' + fs.readdirSync("./mem-cache")[0], { encoding: "utf-8" }); + const expectedCachedContent = + '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' + + expect(cacheFileContent).toEqual(expectedCachedContent); + }) +}) \ No newline at end of file diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts new file mode 100644 index 0000000000..34d2e7be93 --- /dev/null +++ b/packages/sushi/src/router/memoizer.ts @@ -0,0 +1,31 @@ +import memoize from 'memoize-fs'; + + const serialize = (val: any) => { + const circRefColl: any[] = []; + return JSON.stringify(val, function (_name, value) { + if (typeof value === 'function') { + return; // ignore arguments and attributes of type function silently + } + if (typeof value === 'object' && value !== null) { + if (circRefColl.indexOf(value) !== -1) { + // circular reference has been found, discard key + return; + } + // store value in collection + circRefColl.push(value); + } + if (typeof value === 'bigint') return value.toString() + 'n' + return value; + }); + } + + const deserialize = (val: string) => { + return JSON.parse(val, function(_key, value) { + if (typeof value === 'string' && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)); + } + else return value; + }).data; + } + + export const memoizer = memoize({ cachePath: './mem-cache', serialize, deserialize }) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index edd3eb462e..792cdf3a24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1820,6 +1820,9 @@ importers: lodash.flatmap: specifier: 4.5.0 version: 4.5.0 + memoize-fs: + specifier: github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5 + version: github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5 numeral: specifier: 2.0.6 version: 2.0.6 @@ -23474,7 +23477,7 @@ packages: requiresBuild: true dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 optional: true /create-hash@1.2.0: @@ -25003,7 +25006,6 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - optional: true /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -26639,7 +26641,7 @@ packages: deprecated: Deprecated in favor of '@metamask/eth-sig-util' dependencies: buffer: 5.7.1 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereumjs-abi: 0.6.5 ethereumjs-util: 5.2.1 tweetnacl: 1.0.3 @@ -26816,7 +26818,7 @@ packages: dependencies: bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -26825,7 +26827,7 @@ packages: dependencies: bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -32203,6 +32205,11 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /meriyah@4.4.2: + resolution: {integrity: sha512-fENZIbs4tscI3IGRGtPrCoW4H4oGzVQrQCVCGRv+92kFXKkvxr52ZNR684ICvDC/UBWg9ioGc2X6pMnWOtRYwA==} + engines: {node: '>=10.4.0'} + dev: false + /merkle-patricia-tree@2.3.2: resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} dependencies: @@ -40263,12 +40270,12 @@ packages: resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 + define-properties: 1.2.1 for-each: 0.3.3 has-proto: 1.0.3 has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.6 - safe-array-concat: 1.0.0 + safe-array-concat: 1.1.2 /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} @@ -41316,6 +41323,7 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} + deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' dependencies: async: 2.6.4 backoff: 2.5.0 @@ -42355,3 +42363,14 @@ packages: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 + + github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5: + resolution: {tarball: https://codeload.github.com/rouzwelt/memoize-fs/tar.gz/e5fcc9f6effc4ad087514372a53a49d380520ad5} + name: memoize-fs + version: 3.0.0 + engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} + prepare: true + requiresBuild: true + dependencies: + meriyah: 4.4.2 + dev: false From 01cfaec791ca78d6becdbed64120779672530e6f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:13:13 +0000 Subject: [PATCH 005/140] add rain ci workflow --- .github/workflows/rain-ci.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/rain-ci.yml diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml new file mode 100644 index 0000000000..360e5eba8b --- /dev/null +++ b/.github/workflows/rain-ci.yml @@ -0,0 +1,20 @@ +name: Rain CI +on: [push] + +jobs: + fmt-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + + - name: Install deps + run: nix develop -c pnpm install --frozen-lockfile + + - name: Build Sushi Lib + run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi + + - name: Test Sushi Lib + run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file From 419758ccd5883aaef672eb55309ca64a008862d7 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:27:21 +0000 Subject: [PATCH 006/140] lint - update workflows --- .github/workflows/apps-evm-e2e.yml | 150 +- .github/workflows/chromatic.yml | 60 +- .github/workflows/rain-ci.yml | 6 + .github/workflows/verify.yml | 182 +-- packages/sushi/src/chain/generated.ts | 1469 ++++++++++---------- packages/sushi/src/config/viem.ts | 2 +- packages/sushi/src/router/memoizer.test.ts | 26 +- packages/sushi/src/router/memoizer.ts | 59 +- 8 files changed, 982 insertions(+), 972 deletions(-) diff --git a/.github/workflows/apps-evm-e2e.yml b/.github/workflows/apps-evm-e2e.yml index f904322af4..652fd14232 100644 --- a/.github/workflows/apps-evm-e2e.yml +++ b/.github/workflows/apps-evm-e2e.yml @@ -1,84 +1,84 @@ -name: Sushi - apps / evm +# name: Sushi - apps / evm -on: - pull_request: - types: [opened, synchronize] - paths: - - ".github/workflows/apps-evm-e2e.yml" - - "apps/evm/**" - - "config/nextjs/**" - - "config/router/**" - - "config/tailwindcss/**" - - "config/typescript/**" - - "config/viem/**" - - "config/wagmi/**" - - "packages/**" - workflow_dispatch: +# on: +# pull_request: +# types: [opened, synchronize] +# paths: +# - ".github/workflows/apps-evm-e2e.yml" +# - "apps/evm/**" +# - "config/nextjs/**" +# - "config/router/**" +# - "config/tailwindcss/**" +# - "config/typescript/**" +# - "config/viem/**" +# - "config/wagmi/**" +# - "packages/**" +# workflow_dispatch: -env: - CI: true - NODE_OPTIONS: --max-old-space-size=8192 - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - TURBO_FORCE: false -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - e2e: - runs-on: buildjet-4vcpu-ubuntu-2204 - timeout-minutes: 15 - strategy: - matrix: - block-number: [55359656] - chain-id: [137] - node-version: [20] - pnpm-version: [8.15.3] - steps: - - name: Clone repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - submodules: true +# env: +# CI: true +# NODE_OPTIONS: --max-old-space-size=8192 +# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} +# TURBO_TEAM: ${{ secrets.TURBO_TEAM }} +# TURBO_FORCE: false +# concurrency: +# group: ${{ github.workflow }}-${{ github.ref }} +# cancel-in-progress: true +# jobs: +# e2e: +# runs-on: buildjet-4vcpu-ubuntu-2204 +# timeout-minutes: 15 +# strategy: +# matrix: +# block-number: [55359656] +# chain-id: [137] +# node-version: [20] +# pnpm-version: [8.15.3] +# steps: +# - name: Clone repository +# uses: actions/checkout@v4 +# with: +# fetch-depth: 2 +# submodules: true - # Has to be before setup node for caching to work - - uses: pnpm/action-setup@v2 - with: - version: ${{ matrix.pnpm-version }} +# # Has to be before setup node for caching to work +# - uses: pnpm/action-setup@v2 +# with: +# version: ${{ matrix.pnpm-version }} - - name: Setup Node.js - uses: buildjet/setup-node@v3 - with: - cache: 'pnpm' - node-version: ${{ matrix.node-version }} +# - name: Setup Node.js +# uses: buildjet/setup-node@v3 +# with: +# cache: 'pnpm' +# node-version: ${{ matrix.node-version }} - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 +# - name: Install Foundry +# uses: foundry-rs/foundry-toolchain@v1 - - name: Install dependencies - run: pnpm install --frozen-lockfile --prefer-offline +# - name: Install dependencies +# run: pnpm install --frozen-lockfile --prefer-offline - - name: Install Playwright Browsers - run: npx playwright@1.37.0 install --with-deps chromium +# - name: Install Playwright Browsers +# run: npx playwright@1.37.0 install --with-deps chromium - - name: Test - run: pnpm exec turbo run test --filter evm - env: - ANVIL_FORK_URL: ${{ secrets.ANVIL_FORK_URL }} - ANVIL_BLOCK_NUMBER: ${{ matrix.block-number }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - REDIS_URL: ${{ secrets.REDIS_URL }} - EDGE_CONFIG: ${{ secrets.EDGE_CONFIG }} - NEXT_PUBLIC_APP_ENV: 'test' - NEXT_PUBLIC_ALCHEMY_ID: ${{ secrets.NEXT_PUBLIC_ALCHEMY_ID }} - NEXT_PUBLIC_CHAIN_ID: ${{ matrix.chain-id }} - NEXT_PUBLIC_API_BASE_URL: 'https://mock-swap-api' - NEXT_TELEMETRY_DISABLED: 1 +# - name: Test +# run: pnpm exec turbo run test --filter evm +# env: +# ANVIL_FORK_URL: ${{ secrets.ANVIL_FORK_URL }} +# ANVIL_BLOCK_NUMBER: ${{ matrix.block-number }} +# DATABASE_URL: ${{ secrets.DATABASE_URL }} +# REDIS_URL: ${{ secrets.REDIS_URL }} +# EDGE_CONFIG: ${{ secrets.EDGE_CONFIG }} +# NEXT_PUBLIC_APP_ENV: 'test' +# NEXT_PUBLIC_ALCHEMY_ID: ${{ secrets.NEXT_PUBLIC_ALCHEMY_ID }} +# NEXT_PUBLIC_CHAIN_ID: ${{ matrix.chain-id }} +# NEXT_PUBLIC_API_BASE_URL: 'https://mock-swap-api' +# NEXT_TELEMETRY_DISABLED: 1 - - name: Upload test results - if: always() - uses: actions/upload-artifact@v3 - with: - name: playwright-report - path: ./apps/evm/test-results/ - retention-days: 30 \ No newline at end of file +# - name: Upload test results +# if: always() +# uses: actions/upload-artifact@v3 +# with: +# name: playwright-report +# path: ./apps/evm/test-results/ +# retention-days: 30 \ No newline at end of file diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 150bed71ea..9c721898ec 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -1,32 +1,32 @@ -name: 'Chromatic' +# name: 'Chromatic' -on: - pull_request: - types: [opened, synchronize] - paths: - - ".github/workflows/chromatic.yml" - - "config/tailwindcss/**" - - "packages/ui/**" -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - submodules: true - fetch-depth: 0 - - name: Install dependencies - uses: ./.github/actions/install - - name: Build storybook - run: pnpm exec turbo run build --filter=storybook^... - - name: Publish to Chromatic - uses: chromaui/action@v1 - with: - projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - workingDir: apps/storybook - buildScriptName: build - exitOnceUploaded: true +# on: +# pull_request: +# types: [opened, synchronize] +# paths: +# - ".github/workflows/chromatic.yml" +# - "config/tailwindcss/**" +# - "packages/ui/**" +# concurrency: +# group: ${{ github.workflow }}-${{ github.ref }} +# cancel-in-progress: true +# jobs: +# publish: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# with: +# submodules: true +# fetch-depth: 0 +# - name: Install dependencies +# uses: ./.github/actions/install +# - name: Build storybook +# run: pnpm exec turbo run build --filter=storybook^... +# - name: Publish to Chromatic +# uses: chromaui/action@v1 +# with: +# projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} +# workingDir: apps/storybook +# buildScriptName: build +# exitOnceUploaded: true diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 360e5eba8b..59b36ef9cc 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -16,5 +16,11 @@ jobs: - name: Build Sushi Lib run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi + - name: Lint Sushi Lib + run: nix develop -c pnpm lint + + - name: Check + run: nix develop -c pnpm check + - name: Test Sushi Lib run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index fc63f6dbc4..4028056f03 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -1,97 +1,97 @@ -name: Sushi - verify +# name: Sushi - verify +# # on: +# # workflow_call: +# # workflow_dispatch: # on: -# workflow_call: -# workflow_dispatch: -on: - pull_request: - types: [opened, synchronize] -env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - format: - name: Format - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Clone repository - uses: actions/checkout@v4 - with: - token: ${{ secrets.PAT }} - ref: ${{ github.head_ref }} - - name: Install dependencies - uses: ./.github/actions/install - - name: Format - run: pnpm format - - uses: stefanzweifel/git-auto-commit-action@v4 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - commit_message: 'chore: format' - commit_user_name: 'github-actions[bot]' - commit_user_email: 'github-actions[bot]@users.noreply.github.com' +# pull_request: +# types: [opened, synchronize] +# env: +# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} +# TURBO_TEAM: ${{ secrets.TURBO_TEAM }} +# concurrency: +# group: ${{ github.workflow }}-${{ github.ref }} +# cancel-in-progress: true +# jobs: +# format: +# name: Format +# runs-on: ubuntu-latest +# timeout-minutes: 5 +# steps: +# - name: Clone repository +# uses: actions/checkout@v4 +# with: +# token: ${{ secrets.PAT }} +# ref: ${{ github.head_ref }} +# - name: Install dependencies +# uses: ./.github/actions/install +# - name: Format +# run: pnpm format +# - uses: stefanzweifel/git-auto-commit-action@v4 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# commit_message: 'chore: format' +# commit_user_name: 'github-actions[bot]' +# commit_user_email: 'github-actions[bot]@users.noreply.github.com' - lint: - name: Lint - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Clone repository - uses: actions/checkout@v4 - with: - token: ${{ secrets.PAT }} - ref: ${{ github.head_ref }} - - name: Install dependencies - uses: ./.github/actions/install - - name: Lint - run: pnpm lint --apply - - uses: stefanzweifel/git-auto-commit-action@v4 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - commit_message: 'chore: lint' - commit_user_name: 'github-actions[bot]' - commit_user_email: 'github-actions[bot]@users.noreply.github.com' +# lint: +# name: Lint +# runs-on: ubuntu-latest +# timeout-minutes: 5 +# steps: +# - name: Clone repository +# uses: actions/checkout@v4 +# with: +# token: ${{ secrets.PAT }} +# ref: ${{ github.head_ref }} +# - name: Install dependencies +# uses: ./.github/actions/install +# - name: Lint +# run: pnpm lint --apply +# - uses: stefanzweifel/git-auto-commit-action@v4 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# commit_message: 'chore: lint' +# commit_user_name: 'github-actions[bot]' +# commit_user_email: 'github-actions[bot]@users.noreply.github.com' - # build: - # name: Build - # needs: [lint, format] - # runs-on: ubuntu-latest - # timeout-minutes: 5 - # steps: - # - uses: actions/checkout@v3 - # with: - # submodules: true - # - name: Install dependencies - # uses: ./.github/actions/install - # - name: Build - # run: pnpm build +# # build: +# # name: Build +# # needs: [lint, format] +# # runs-on: ubuntu-latest +# # timeout-minutes: 5 +# # steps: +# # - uses: actions/checkout@v3 +# # with: +# # submodules: true +# # - name: Install dependencies +# # uses: ./.github/actions/install +# # - name: Build +# # run: pnpm build - types: - name: Types - needs: [lint, format] - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Clone repository - uses: actions/checkout@v4 +# types: +# name: Types +# needs: [lint, format] +# runs-on: ubuntu-latest +# timeout-minutes: 5 +# steps: +# - name: Clone repository +# uses: actions/checkout@v4 - - name: Install dependencies - uses: ./.github/actions/install - - name: Check types - run: pnpm check +# - name: Install dependencies +# uses: ./.github/actions/install +# - name: Check types +# run: pnpm check - test: - name: Test - runs-on: ubuntu-latest - needs: [lint, format] - steps: - - name: Clone repository - uses: actions/checkout@v4 - - name: Install dependencies - uses: ./.github/actions/install - - name: Test packages - run: pnpm exec turbo run test --filter=./packages/* \ No newline at end of file +# test: +# name: Test +# runs-on: ubuntu-latest +# needs: [lint, format] +# steps: +# - name: Clone repository +# uses: actions/checkout@v4 +# - name: Install dependencies +# uses: ./.github/actions/install +# - name: Test packages +# run: pnpm exec turbo run test --filter=./packages/* \ No newline at end of file diff --git a/packages/sushi/src/chain/generated.ts b/packages/sushi/src/chain/generated.ts index 563ae5bfc3..6a7bec1536 100644 --- a/packages/sushi/src/chain/generated.ts +++ b/packages/sushi/src/chain/generated.ts @@ -1,984 +1,983 @@ export default [ { - "chainId": 1, - "explorers": [ + chainId: 1, + explorers: [ { - "name": "etherscan", - "url": "https://etherscan.io", - "standard": "EIP3091" + name: 'etherscan', + url: 'https://etherscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://eth.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://eth.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://ethereum.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://ethereum.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Ethereum Mainnet", - "shortName": "eth" + name: 'Ethereum Mainnet', + shortName: 'eth', }, { - "chainId": 10, - "explorers": [ + chainId: 10, + explorers: [ { - "name": "etherscan", - "url": "https://optimistic.etherscan.io", - "standard": "EIP3091" + name: 'etherscan', + url: 'https://optimistic.etherscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://optimism.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://optimism.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://optimism.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://optimism.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "OP Mainnet", - "shortName": "oeth" + name: 'OP Mainnet', + shortName: 'oeth', }, { - "chainId": 14, - "explorers": [ + chainId: 14, + explorers: [ { - "name": "blockscout", - "url": "https://flare-explorer.flare.network", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://flare-explorer.flare.network', + standard: 'EIP3091', }, { - "name": "flarescan", - "url": "https://mainnet.flarescan.com", - "standard": "EIP3091" - } + name: 'flarescan', + url: 'https://mainnet.flarescan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Flare", - "symbol": "FLR", - "decimals": 18 + nativeCurrency: { + name: 'Flare', + symbol: 'FLR', + decimals: 18, }, - "name": "Flare Mainnet", - "shortName": "flr" + name: 'Flare Mainnet', + shortName: 'flr', }, { - "chainId": 25, - "explorers": [ + chainId: 25, + explorers: [ { - "name": "Cronos Explorer", - "url": "https://explorer.cronos.org", - "standard": "none" - } + name: 'Cronos Explorer', + url: 'https://explorer.cronos.org', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Cronos", - "symbol": "CRO", - "decimals": 18 + nativeCurrency: { + name: 'Cronos', + symbol: 'CRO', + decimals: 18, }, - "name": "Cronos Mainnet", - "shortName": "cro" + name: 'Cronos Mainnet', + shortName: 'cro', }, { - "chainId": 40, - "explorers": [ + chainId: 40, + explorers: [ { - "name": "teloscan", - "url": "https://teloscan.io", - "standard": "EIP3091" - } + name: 'teloscan', + url: 'https://teloscan.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Telos", - "symbol": "TLOS", - "decimals": 18 + nativeCurrency: { + name: 'Telos', + symbol: 'TLOS', + decimals: 18, }, - "name": "Telos EVM Mainnet", - "shortName": "TelosEVM" + name: 'Telos EVM Mainnet', + shortName: 'TelosEVM', }, { - "chainId": 56, - "explorers": [ + chainId: 56, + explorers: [ { - "name": "bscscan", - "url": "https://bscscan.com", - "standard": "EIP3091" + name: 'bscscan', + url: 'https://bscscan.com', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://bnb.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://bnb.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BNB Chain Native Token", - "symbol": "BNB", - "decimals": 18 + nativeCurrency: { + name: 'BNB Chain Native Token', + symbol: 'BNB', + decimals: 18, }, - "name": "BNB Smart Chain Mainnet", - "shortName": "bnb" + name: 'BNB Smart Chain Mainnet', + shortName: 'bnb', }, { - "chainId": 66, - "explorers": [ + chainId: 66, + explorers: [ { - "name": "OKLink", - "url": "https://www.oklink.com/en/okc", - "standard": "EIP3091" - } + name: 'OKLink', + url: 'https://www.oklink.com/en/okc', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "OKXChain Global Utility Token", - "symbol": "OKT", - "decimals": 18 + nativeCurrency: { + name: 'OKXChain Global Utility Token', + symbol: 'OKT', + decimals: 18, }, - "name": "OKXChain Mainnet", - "shortName": "okt" + name: 'OKXChain Mainnet', + shortName: 'okt', }, { - "chainId": 97, - "explorers": [ + chainId: 97, + explorers: [ { - "name": "bscscan-testnet", - "url": "https://testnet.bscscan.com", - "standard": "EIP3091" - } + name: 'bscscan-testnet', + url: 'https://testnet.bscscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BNB Chain Native Token", - "symbol": "tBNB", - "decimals": 18 + nativeCurrency: { + name: 'BNB Chain Native Token', + symbol: 'tBNB', + decimals: 18, }, - "name": "BNB Smart Chain Testnet", - "shortName": "bnbt" + name: 'BNB Smart Chain Testnet', + shortName: 'bnbt', }, { - "chainId": 100, - "explorers": [ + chainId: 100, + explorers: [ { - "name": "gnosisscan", - "url": "https://gnosisscan.io", - "standard": "EIP3091" + name: 'gnosisscan', + url: 'https://gnosisscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://gnosis.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://gnosis.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://gnosis.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://gnosis.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "xDAI", - "symbol": "XDAI", - "decimals": 18 + nativeCurrency: { + name: 'xDAI', + symbol: 'XDAI', + decimals: 18, }, - "name": "Gnosis", - "shortName": "gno" + name: 'Gnosis', + shortName: 'gno', }, { - "chainId": 108, - "explorers": [ + chainId: 108, + explorers: [ { - "name": "thundercore-viewblock", - "url": "https://viewblock.io/thundercore", - "standard": "EIP3091" - } + name: 'thundercore-viewblock', + url: 'https://viewblock.io/thundercore', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "ThunderCore Token", - "symbol": "TT", - "decimals": 18 + nativeCurrency: { + name: 'ThunderCore Token', + symbol: 'TT', + decimals: 18, }, - "name": "ThunderCore Mainnet", - "shortName": "TT" + name: 'ThunderCore Mainnet', + shortName: 'TT', }, { - "chainId": 122, - "explorers": [ + chainId: 122, + explorers: [ { - "name": "blockscout", - "url": "https://explorer.fuse.io", - "icon": "blockscout", - "standard": "EIP3091" - } + name: 'blockscout', + url: 'https://explorer.fuse.io', + icon: 'blockscout', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fuse", - "symbol": "FUSE", - "decimals": 18 + nativeCurrency: { + name: 'Fuse', + symbol: 'FUSE', + decimals: 18, }, - "name": "Fuse Mainnet", - "shortName": "fuse" + name: 'Fuse Mainnet', + shortName: 'fuse', }, { - "chainId": 128, - "explorers": [ + chainId: 128, + explorers: [ { - "name": "hecoinfo", - "url": "https://hecoinfo.com", - "standard": "EIP3091" - } + name: 'hecoinfo', + url: 'https://hecoinfo.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Huobi ECO Chain Native Token", - "symbol": "HT", - "decimals": 18 + nativeCurrency: { + name: 'Huobi ECO Chain Native Token', + symbol: 'HT', + decimals: 18, }, - "name": "Huobi ECO Chain Mainnet", - "shortName": "heco" + name: 'Huobi ECO Chain Mainnet', + shortName: 'heco', }, { - "chainId": 137, - "explorers": [ + chainId: 137, + explorers: [ { - "name": "polygonscan", - "url": "https://polygonscan.com", - "standard": "EIP3091" + name: 'polygonscan', + url: 'https://polygonscan.com', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://polygon.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://polygon.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "MATIC", - "symbol": "MATIC", - "decimals": 18 + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18, }, - "name": "Polygon Mainnet", - "shortName": "matic" + name: 'Polygon Mainnet', + shortName: 'matic', }, { - "chainId": 199, - "explorers": [ + chainId: 199, + explorers: [ { - "name": "BitTorrent Chain Explorer", - "url": "https://bttcscan.com", - "standard": "EIP3091" - } + name: 'BitTorrent Chain Explorer', + url: 'https://bttcscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BitTorrent", - "symbol": "BTT", - "decimals": 18 + nativeCurrency: { + name: 'BitTorrent', + symbol: 'BTT', + decimals: 18, }, - "name": "BitTorrent Chain Mainnet", - "shortName": "BTT" + name: 'BitTorrent Chain Mainnet', + shortName: 'BTT', }, { - "chainId": 250, - "explorers": [ + chainId: 250, + explorers: [ { - "name": "ftmscan", - "url": "https://ftmscan.com", - "icon": "ftmscan", - "standard": "EIP3091" + name: 'ftmscan', + url: 'https://ftmscan.com', + icon: 'ftmscan', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://fantom.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://fantom.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fantom", - "symbol": "FTM", - "decimals": 18 + nativeCurrency: { + name: 'Fantom', + symbol: 'FTM', + decimals: 18, }, - "name": "Fantom Opera", - "shortName": "ftm" + name: 'Fantom Opera', + shortName: 'ftm', }, { - "chainId": 288, - "explorers": [ + chainId: 288, + explorers: [ { - "name": "Bobascan", - "url": "https://bobascan.com", - "standard": "none" - } + name: 'Bobascan', + url: 'https://bobascan.com', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Boba Network", - "shortName": "Boba", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Boba Network', + shortName: 'Boba', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://gateway.boba.network" - } - ] - } + url: 'https://gateway.boba.network', + }, + ], + }, }, { - "chainId": 314, - "explorers": [ + chainId: 314, + explorers: [ { - "name": "Filfox", - "url": "https://filfox.info/en", - "standard": "none" + name: 'Filfox', + url: 'https://filfox.info/en', + standard: 'none', }, { - "name": "Beryx", - "url": "https://beryx.zondax.ch", - "standard": "none" + name: 'Beryx', + url: 'https://beryx.zondax.ch', + standard: 'none', }, { - "name": "Glif Explorer", - "url": "https://explorer.glif.io", - "standard": "EIP3091" + name: 'Glif Explorer', + url: 'https://explorer.glif.io', + standard: 'EIP3091', }, { - "name": "Dev.storage", - "url": "https://dev.storage", - "standard": "none" + name: 'Dev.storage', + url: 'https://dev.storage', + standard: 'none', }, { - "name": "Filscan", - "url": "https://filscan.io", - "standard": "none" + name: 'Filscan', + url: 'https://filscan.io', + standard: 'none', }, { - "name": "Filscout", - "url": "https://filscout.io/en", - "standard": "none" - } + name: 'Filscout', + url: 'https://filscout.io/en', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "filecoin", - "symbol": "FIL", - "decimals": 18 + nativeCurrency: { + name: 'filecoin', + symbol: 'FIL', + decimals: 18, }, - "name": "Filecoin - Mainnet", - "shortName": "filecoin" + name: 'Filecoin - Mainnet', + shortName: 'filecoin', }, { - "chainId": 324, - "explorers": [ + chainId: 324, + explorers: [ { - "name": "zkSync Era Block Explorer", - "url": "https://explorer.zksync.io", - "icon": "zksync-era", - "standard": "EIP3091" - } + name: 'zkSync Era Block Explorer', + url: 'https://explorer.zksync.io', + icon: 'zksync-era', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "zkSync Mainnet", - "shortName": "zksync", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'zkSync Mainnet', + shortName: 'zksync', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.zksync.io/" - } - ] - } - }, - { - "chainId": 1088, - "explorers": [ - { - "name": "blockscout", - "url": "https://andromeda-explorer.metis.io", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Metis", - "symbol": "METIS", - "decimals": 18 - }, - "name": "Metis Andromeda Mainnet", - "shortName": "metis-andromeda", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.zksync.io/', + }, + ], + }, + }, + { + chainId: 1088, + explorers: [ + { + name: 'blockscout', + url: 'https://andromeda-explorer.metis.io', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Metis', + symbol: 'METIS', + decimals: 18, + }, + name: 'Metis Andromeda Mainnet', + shortName: 'metis-andromeda', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.metis.io" - } - ] - } - }, - { - "chainId": 1101, - "explorers": [ - { - "name": "blockscout", - "url": "https://zkevm.polygonscan.com", - "icon": "zkevm", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Polygon zkEVM", - "shortName": "zkevm", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.metis.io', + }, + ], + }, + }, + { + chainId: 1101, + explorers: [ + { + name: 'blockscout', + url: 'https://zkevm.polygonscan.com', + icon: 'zkevm', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Polygon zkEVM', + shortName: 'zkevm', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.zkevm-rpc.com" - } - ] - } + url: 'https://bridge.zkevm-rpc.com', + }, + ], + }, }, { - "chainId": 1116, - "explorers": [ + chainId: 1116, + explorers: [ { - "name": "Core Scan", - "url": "https://scan.coredao.org", - "icon": "core", - "standard": "EIP3091" - } + name: 'Core Scan', + url: 'https://scan.coredao.org', + icon: 'core', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Core Blockchain Native Token", - "symbol": "CORE", - "decimals": 18 + nativeCurrency: { + name: 'Core Blockchain Native Token', + symbol: 'CORE', + decimals: 18, }, - "name": "Core Blockchain Mainnet", - "shortName": "core" + name: 'Core Blockchain Mainnet', + shortName: 'core', }, { - "chainId": 1284, - "explorers": [ + chainId: 1284, + explorers: [ { - "name": "moonscan", - "url": "https://moonbeam.moonscan.io", - "standard": "none" - } + name: 'moonscan', + url: 'https://moonbeam.moonscan.io', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Glimmer", - "symbol": "GLMR", - "decimals": 18 + nativeCurrency: { + name: 'Glimmer', + symbol: 'GLMR', + decimals: 18, }, - "name": "Moonbeam", - "shortName": "mbeam" + name: 'Moonbeam', + shortName: 'mbeam', }, { - "chainId": 1285, - "explorers": [ + chainId: 1285, + explorers: [ { - "name": "moonscan", - "url": "https://moonriver.moonscan.io", - "standard": "none" - } + name: 'moonscan', + url: 'https://moonriver.moonscan.io', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Moonriver", - "symbol": "MOVR", - "decimals": 18 + nativeCurrency: { + name: 'Moonriver', + symbol: 'MOVR', + decimals: 18, }, - "name": "Moonriver", - "shortName": "mriver" + name: 'Moonriver', + shortName: 'mriver', }, { - "chainId": 2222, - "explorers": [ + chainId: 2222, + explorers: [ { - "name": "Kava EVM Explorer", - "url": "https://kavascan.com", - "standard": "EIP3091", - "icon": "kava" - } + name: 'Kava EVM Explorer', + url: 'https://kavascan.com', + standard: 'EIP3091', + icon: 'kava', + }, ], - "nativeCurrency": { - "name": "Kava", - "symbol": "KAVA", - "decimals": 18 + nativeCurrency: { + name: 'Kava', + symbol: 'KAVA', + decimals: 18, }, - "name": "Kava", - "shortName": "kava" + name: 'Kava', + shortName: 'kava', }, { - "chainId": 4002, - "explorers": [ + chainId: 4002, + explorers: [ { - "name": "ftmscan", - "url": "https://testnet.ftmscan.com", - "icon": "ftmscan", - "standard": "EIP3091" - } + name: 'ftmscan', + url: 'https://testnet.ftmscan.com', + icon: 'ftmscan', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fantom", - "symbol": "FTM", - "decimals": 18 + nativeCurrency: { + name: 'Fantom', + symbol: 'FTM', + decimals: 18, }, - "name": "Fantom Testnet", - "shortName": "tftm" + name: 'Fantom Testnet', + shortName: 'tftm', }, { - "chainId": 7000, - "explorers": [ + chainId: 7000, + explorers: [ { - "name": "ZetaChain Mainnet Explorer", - "url": "https://explorer.mainnet.zetachain.com", - "standard": "none" - } + name: 'ZetaChain Mainnet Explorer', + url: 'https://explorer.mainnet.zetachain.com', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Zeta", - "symbol": "ZETA", - "decimals": 18 + nativeCurrency: { + name: 'Zeta', + symbol: 'ZETA', + decimals: 18, }, - "name": "ZetaChain Mainnet", - "shortName": "zetachain-mainnet" + name: 'ZetaChain Mainnet', + shortName: 'zetachain-mainnet', }, { - "chainId": 8453, - "explorers": [ + chainId: 8453, + explorers: [ { - "name": "basescan", - "url": "https://basescan.org", - "standard": "none" + name: 'basescan', + url: 'https://basescan.org', + standard: 'none', }, { - "name": "basescout", - "url": "https://base.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'basescout', + url: 'https://base.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://base.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://base.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Base", - "shortName": "base" + name: 'Base', + shortName: 'base', }, { - "chainId": 11235, - "explorers": [ + chainId: 11235, + explorers: [ { - "name": "Mainnet HAQQ Explorer", - "url": "https://explorer.haqq.network", - "standard": "EIP3091" - } + name: 'Mainnet HAQQ Explorer', + url: 'https://explorer.haqq.network', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Islamic Coin", - "symbol": "ISLM", - "decimals": 18 + nativeCurrency: { + name: 'Islamic Coin', + symbol: 'ISLM', + decimals: 18, }, - "name": "Haqq Network", - "shortName": "ISLM" + name: 'Haqq Network', + shortName: 'ISLM', }, { - "chainId": 42161, - "explorers": [ + chainId: 42161, + explorers: [ { - "name": "Arbiscan", - "url": "https://arbiscan.io", - "standard": "EIP3091" + name: 'Arbiscan', + url: 'https://arbiscan.io', + standard: 'EIP3091', }, { - "name": "Arbitrum Explorer", - "url": "https://explorer.arbitrum.io", - "standard": "EIP3091" + name: 'Arbitrum Explorer', + url: 'https://explorer.arbitrum.io', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://arbitrum.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://arbitrum.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum One", - "shortName": "arb1", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ - { - "url": "https://bridge.arbitrum.io" - } - ] - } - }, - { - "chainId": 42170, - "explorers": [ - { - "name": "Arbitrum Nova Chain Explorer", - "url": "https://nova-explorer.arbitrum.io", - "icon": "blockscout", - "standard": "EIP3091" - }, - { - "name": "dexguru", - "url": "https://nova.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum Nova", - "shortName": "arb-nova", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum One', + shortName: 'arb1', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.arbitrum.io" - } - ] - } + url: 'https://bridge.arbitrum.io', + }, + ], + }, }, { - "chainId": 42220, - "explorers": [ + chainId: 42170, + explorers: [ { - "name": "Celoscan", - "url": "https://celoscan.io", - "standard": "EIP3091" + name: 'Arbitrum Nova Chain Explorer', + url: 'https://nova-explorer.arbitrum.io', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://explorer.celo.org", - "standard": "none" - } + name: 'dexguru', + url: 'https://nova.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "CELO", - "symbol": "CELO", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum Nova', + shortName: 'arb-nova', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ + { + url: 'https://bridge.arbitrum.io', + }, + ], }, - "name": "Celo Mainnet", - "shortName": "celo" }, { - "chainId": 43113, - "explorers": [ + chainId: 42220, + explorers: [ + { + name: 'Celoscan', + url: 'https://celoscan.io', + standard: 'EIP3091', + }, { - "name": "snowtrace", - "url": "https://testnet.snowtrace.io", - "standard": "EIP3091" - } + name: 'blockscout', + url: 'https://explorer.celo.org', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", - "decimals": 18 + nativeCurrency: { + name: 'CELO', + symbol: 'CELO', + decimals: 18, }, - "name": "Avalanche Fuji Testnet", - "shortName": "Fuji" + name: 'Celo Mainnet', + shortName: 'celo', }, { - "chainId": 43114, - "explorers": [ + chainId: 43113, + explorers: [ { - "name": "snowtrace", - "url": "https://snowtrace.io", - "standard": "EIP3091" - } + name: 'snowtrace', + url: 'https://testnet.snowtrace.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", - "decimals": 18 + nativeCurrency: { + name: 'Avalanche', + symbol: 'AVAX', + decimals: 18, }, - "name": "Avalanche C-Chain", - "shortName": "avax" + name: 'Avalanche Fuji Testnet', + shortName: 'Fuji', }, { - "chainId": 43288, - "explorers": [ + chainId: 43114, + explorers: [ { - "name": "Boba Avax Explorer", - "url": "https://blockexplorer.avax.boba.network", - "standard": "none" - } + name: 'snowtrace', + url: 'https://snowtrace.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Boba Token", - "symbol": "BOBA", - "decimals": 18 + nativeCurrency: { + name: 'Avalanche', + symbol: 'AVAX', + decimals: 18, }, - "name": "Boba Avax", - "shortName": "bobaavax" + name: 'Avalanche C-Chain', + shortName: 'avax', }, { - "chainId": 56288, - "explorers": [ + chainId: 43288, + explorers: [ { - "name": "Boba BNB block explorer", - "url": "https://bobascan.com", - "standard": "none" - } + name: 'Boba Avax Explorer', + url: 'https://blockexplorer.avax.boba.network', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Boba Token", - "symbol": "BOBA", - "decimals": 18 + nativeCurrency: { + name: 'Boba Token', + symbol: 'BOBA', + decimals: 18, }, - "name": "Boba BNB Mainnet", - "shortName": "BobaBnb", - "parent": { - "type": "L2", - "chain": "eip155-5", - "bridges": [ + name: 'Boba Avax', + shortName: 'bobaavax', + }, + { + chainId: 56288, + explorers: [ + { + name: 'Boba BNB block explorer', + url: 'https://bobascan.com', + standard: 'none', + }, + ], + nativeCurrency: { + name: 'Boba Token', + symbol: 'BOBA', + decimals: 18, + }, + name: 'Boba BNB Mainnet', + shortName: 'BobaBnb', + parent: { + type: 'L2', + chain: 'eip155-5', + bridges: [ { - "url": "https://gateway.boba.network" - } - ] - } + url: 'https://gateway.boba.network', + }, + ], + }, }, { - "chainId": 59144, - "explorers": [ + chainId: 59144, + explorers: [ { - "name": "Etherscan", - "url": "https://lineascan.build", - "standard": "EIP3091", - "icon": "linea" + name: 'Etherscan', + url: 'https://lineascan.build', + standard: 'EIP3091', + icon: 'linea', }, { - "name": "Blockscout", - "url": "https://explorer.linea.build", - "standard": "EIP3091", - "icon": "linea" + name: 'Blockscout', + url: 'https://explorer.linea.build', + standard: 'EIP3091', + icon: 'linea', }, { - "name": "L2scan", - "url": "https://linea.l2scan.co", - "standard": "EIP3091", - "icon": "linea" - } + name: 'L2scan', + url: 'https://linea.l2scan.co', + standard: 'EIP3091', + icon: 'linea', + }, ], - "nativeCurrency": { - "name": "Linea Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Linea", - "shortName": "linea", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Linea Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Linea', + shortName: 'linea', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.linea.build" - } - ] - } + url: 'https://bridge.linea.build', + }, + ], + }, }, { - "chainId": 80001, - "explorers": [ + chainId: 80001, + explorers: [ { - "name": "polygonscan", - "url": "https://mumbai.polygonscan.com", - "standard": "EIP3091" - } + name: 'polygonscan', + url: 'https://mumbai.polygonscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "MATIC", - "symbol": "MATIC", - "decimals": 18 + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18, }, - "name": "Mumbai", - "shortName": "maticmum" + name: 'Mumbai', + shortName: 'maticmum', }, { - "chainId": 81457, - "explorers": [ + chainId: 81457, + explorers: [ { - "name": "Blastscan", - "url": "https://blastscan.io", - "icon": "blast", - "standard": "EIP3091" + name: 'Blastscan', + url: 'https://blastscan.io', + icon: 'blast', + standard: 'EIP3091', }, { - "name": "Blast Explorer", - "url": "https://blastexplorer.io", - "icon": "blast", - "standard": "EIP3091" - } + name: 'Blast Explorer', + url: 'https://blastexplorer.io', + icon: 'blast', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Blast', + shortName: 'blastmainnet', + parent: { + type: 'L2', + chain: 'eip155-1', }, - "name": "Blast", - "shortName": "blastmainnet", - "parent": { - "type": "L2", - "chain": "eip155-1" - } }, { - "chainId": 421614, - "explorers": [ + chainId: 421614, + explorers: [ { - "name": "Arbitrum Sepolia Rollup Testnet Explorer", - "url": "https://sepolia-explorer.arbitrum.io", - "standard": "EIP3091" - } + name: 'Arbitrum Sepolia Rollup Testnet Explorer', + url: 'https://sepolia-explorer.arbitrum.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Sepolia Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum Sepolia", - "shortName": "arb-sep", - "parent": { - "type": "L2", - "chain": "eip155-11155111", - "bridges": [ + nativeCurrency: { + name: 'Sepolia Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum Sepolia', + shortName: 'arb-sep', + parent: { + type: 'L2', + chain: 'eip155-11155111', + bridges: [ { - "url": "https://bridge.arbitrum.io" - } - ] - } - }, - { - "chainId": 534352, - "explorers": [ - { - "name": "Scrollscan", - "url": "https://scrollscan.com", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Scroll", - "shortName": "scr", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.arbitrum.io', + }, + ], + }, + }, + { + chainId: 534352, + explorers: [ + { + name: 'Scrollscan', + url: 'https://scrollscan.com', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Scroll', + shortName: 'scr', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://scroll.io/bridge" - } - ] - } + url: 'https://scroll.io/bridge', + }, + ], + }, }, { - "chainId": 11155111, - "explorers": [ + chainId: 11155111, + explorers: [ { - "name": "etherscan-sepolia", - "url": "https://sepolia.etherscan.io", - "standard": "EIP3091" + name: 'etherscan-sepolia', + url: 'https://sepolia.etherscan.io', + standard: 'EIP3091', }, { - "name": "otterscan-sepolia", - "url": "https://sepolia.otterscan.io", - "standard": "EIP3091" - } + name: 'otterscan-sepolia', + url: 'https://sepolia.otterscan.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Sepolia Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Sepolia Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Sepolia", - "shortName": "sep" + name: 'Sepolia', + shortName: 'sep', }, { - "chainId": 1666600000, - "explorers": [ + chainId: 1666600000, + explorers: [ { - "name": "Harmony Block Explorer", - "url": "https://explorer.harmony.one", - "standard": "EIP3091" - } + name: 'Harmony Block Explorer', + url: 'https://explorer.harmony.one', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "ONE", - "symbol": "ONE", - "decimals": 18 + nativeCurrency: { + name: 'ONE', + symbol: 'ONE', + decimals: 18, }, - "name": "Harmony Mainnet Shard 0", - "shortName": "hmy-s0" + name: 'Harmony Mainnet Shard 0', + shortName: 'hmy-s0', }, { - "chainId": 11297108109, - "explorers": [ + chainId: 11297108109, + explorers: [ { - "name": "Chainlens", - "url": "https://palm.chainlens.com", - "standard": "EIP3091" + name: 'Chainlens', + url: 'https://palm.chainlens.com', + standard: 'EIP3091', }, { - "name": "Dora", - "url": "https://www.ondora.xyz/network/palm", - "standard": "none" - } + name: 'Dora', + url: 'https://www.ondora.xyz/network/palm', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "PALM", - "symbol": "PALM", - "decimals": 18 + nativeCurrency: { + name: 'PALM', + symbol: 'PALM', + decimals: 18, }, - "name": "Palm", - "shortName": "palm" - } -] as const; - + name: 'Palm', + shortName: 'palm', + }, +] as const diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index bcf69a7184..fbf29f3516 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -146,7 +146,7 @@ const flare = { ..._flare, contracts: { multicall3: { - address: "0xcA11bde05977b3631167028862bE2a173976CA11", + address: '0xcA11bde05977b3631167028862bE2a173976CA11', blockCreated: 3002461, }, }, diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts index c4ba5aab60..d1f9a07eaa 100644 --- a/packages/sushi/src/router/memoizer.test.ts +++ b/packages/sushi/src/router/memoizer.test.ts @@ -1,16 +1,15 @@ +import fs from 'fs' import { describe, expect, it } from 'vitest' import { memoizer } from './memoizer.js' -import fs from 'fs'; describe('Memoizer', async () => { it('should serialize, memoize, read from cache, deserialize', async () => { - let didHitCacheOnce = false const testFn = (value1: any) => { didHitCacheOnce = !didHitCacheOnce return { ...value1, - someOtherValue: 'some data' + someOtherValue: 'some data', } } const testMemoizer = await memoizer.fn(testFn) @@ -21,8 +20,8 @@ describe('Memoizer', async () => { number: 123, bool: true, obj: { - prop: 'some prop' - } + prop: 'some prop', + }, } const noCacheHitReturnedValue = await testMemoizer(testValue) const cacheHitReturnedValue = await testMemoizer(testValue) @@ -32,20 +31,23 @@ describe('Memoizer', async () => { number: 123, bool: true, obj: { - prop: 'some prop' + prop: 'some prop', }, - someOtherValue: 'some data' + someOtherValue: 'some data', } - expect(didHitCacheOnce).toEqual(true); + expect(didHitCacheOnce).toEqual(true) expect(noCacheHitReturnedValue).toStrictEqual(expectedReturnedValue) expect(cacheHitReturnedValue).toStrictEqual(expectedReturnedValue) // read cached file content - const cacheFileContent = fs.readFileSync('./mem-cache/' + fs.readdirSync("./mem-cache")[0], { encoding: "utf-8" }); - const expectedCachedContent = + const cacheFileContent = fs.readFileSync( + `./mem-cache/${fs.readdirSync('./mem-cache')[0]}`, + { encoding: 'utf-8' }, + ) + const expectedCachedContent = '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' - expect(cacheFileContent).toEqual(expectedCachedContent); + expect(cacheFileContent).toEqual(expectedCachedContent) }) -}) \ No newline at end of file +}) diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts index 34d2e7be93..a8810d85f4 100644 --- a/packages/sushi/src/router/memoizer.ts +++ b/packages/sushi/src/router/memoizer.ts @@ -1,31 +1,34 @@ -import memoize from 'memoize-fs'; +import memoize from 'memoize-fs' - const serialize = (val: any) => { - const circRefColl: any[] = []; - return JSON.stringify(val, function (_name, value) { - if (typeof value === 'function') { - return; // ignore arguments and attributes of type function silently - } - if (typeof value === 'object' && value !== null) { - if (circRefColl.indexOf(value) !== -1) { - // circular reference has been found, discard key - return; - } - // store value in collection - circRefColl.push(value); - } - if (typeof value === 'bigint') return value.toString() + 'n' - return value; - }); - } +const serialize = (val: any) => { + const circRefColl: any[] = [] + return JSON.stringify(val, (_name, value) => { + if (typeof value === 'function') { + return // ignore arguments and attributes of type function silently + } + if (typeof value === 'object' && value !== null) { + if (circRefColl.indexOf(value) !== -1) { + // circular reference has been found, discard key + return + } + // store value in collection + circRefColl.push(value) + } + if (typeof value === 'bigint') return `${value.toString()}n` + return value + }) +} - const deserialize = (val: string) => { - return JSON.parse(val, function(_key, value) { - if (typeof value === 'string' && /^\d+n$/.test(value)) { - return BigInt(value.slice(0, -1)); - } - else return value; - }).data; - } +const deserialize = (val: string) => { + return JSON.parse(val, (_key, value) => { + if (typeof value === 'string' && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)) + } else return value + }).data +} - export const memoizer = memoize({ cachePath: './mem-cache', serialize, deserialize }) \ No newline at end of file +export const memoizer = memoize({ + cachePath: './mem-cache', + serialize, + deserialize, +}) From ec77bde32ab4292d51df88e19fd592dfbf474b30 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:28:47 +0000 Subject: [PATCH 007/140] update --- packages/sushi/src/chain/generated.ts | 1469 ++++++++++++------------- packages/sushi/src/config/viem.ts | 2 +- 2 files changed, 735 insertions(+), 736 deletions(-) diff --git a/packages/sushi/src/chain/generated.ts b/packages/sushi/src/chain/generated.ts index 563ae5bfc3..6a7bec1536 100644 --- a/packages/sushi/src/chain/generated.ts +++ b/packages/sushi/src/chain/generated.ts @@ -1,984 +1,983 @@ export default [ { - "chainId": 1, - "explorers": [ + chainId: 1, + explorers: [ { - "name": "etherscan", - "url": "https://etherscan.io", - "standard": "EIP3091" + name: 'etherscan', + url: 'https://etherscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://eth.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://eth.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://ethereum.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://ethereum.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Ethereum Mainnet", - "shortName": "eth" + name: 'Ethereum Mainnet', + shortName: 'eth', }, { - "chainId": 10, - "explorers": [ + chainId: 10, + explorers: [ { - "name": "etherscan", - "url": "https://optimistic.etherscan.io", - "standard": "EIP3091" + name: 'etherscan', + url: 'https://optimistic.etherscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://optimism.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://optimism.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://optimism.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://optimism.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "OP Mainnet", - "shortName": "oeth" + name: 'OP Mainnet', + shortName: 'oeth', }, { - "chainId": 14, - "explorers": [ + chainId: 14, + explorers: [ { - "name": "blockscout", - "url": "https://flare-explorer.flare.network", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://flare-explorer.flare.network', + standard: 'EIP3091', }, { - "name": "flarescan", - "url": "https://mainnet.flarescan.com", - "standard": "EIP3091" - } + name: 'flarescan', + url: 'https://mainnet.flarescan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Flare", - "symbol": "FLR", - "decimals": 18 + nativeCurrency: { + name: 'Flare', + symbol: 'FLR', + decimals: 18, }, - "name": "Flare Mainnet", - "shortName": "flr" + name: 'Flare Mainnet', + shortName: 'flr', }, { - "chainId": 25, - "explorers": [ + chainId: 25, + explorers: [ { - "name": "Cronos Explorer", - "url": "https://explorer.cronos.org", - "standard": "none" - } + name: 'Cronos Explorer', + url: 'https://explorer.cronos.org', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Cronos", - "symbol": "CRO", - "decimals": 18 + nativeCurrency: { + name: 'Cronos', + symbol: 'CRO', + decimals: 18, }, - "name": "Cronos Mainnet", - "shortName": "cro" + name: 'Cronos Mainnet', + shortName: 'cro', }, { - "chainId": 40, - "explorers": [ + chainId: 40, + explorers: [ { - "name": "teloscan", - "url": "https://teloscan.io", - "standard": "EIP3091" - } + name: 'teloscan', + url: 'https://teloscan.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Telos", - "symbol": "TLOS", - "decimals": 18 + nativeCurrency: { + name: 'Telos', + symbol: 'TLOS', + decimals: 18, }, - "name": "Telos EVM Mainnet", - "shortName": "TelosEVM" + name: 'Telos EVM Mainnet', + shortName: 'TelosEVM', }, { - "chainId": 56, - "explorers": [ + chainId: 56, + explorers: [ { - "name": "bscscan", - "url": "https://bscscan.com", - "standard": "EIP3091" + name: 'bscscan', + url: 'https://bscscan.com', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://bnb.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://bnb.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BNB Chain Native Token", - "symbol": "BNB", - "decimals": 18 + nativeCurrency: { + name: 'BNB Chain Native Token', + symbol: 'BNB', + decimals: 18, }, - "name": "BNB Smart Chain Mainnet", - "shortName": "bnb" + name: 'BNB Smart Chain Mainnet', + shortName: 'bnb', }, { - "chainId": 66, - "explorers": [ + chainId: 66, + explorers: [ { - "name": "OKLink", - "url": "https://www.oklink.com/en/okc", - "standard": "EIP3091" - } + name: 'OKLink', + url: 'https://www.oklink.com/en/okc', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "OKXChain Global Utility Token", - "symbol": "OKT", - "decimals": 18 + nativeCurrency: { + name: 'OKXChain Global Utility Token', + symbol: 'OKT', + decimals: 18, }, - "name": "OKXChain Mainnet", - "shortName": "okt" + name: 'OKXChain Mainnet', + shortName: 'okt', }, { - "chainId": 97, - "explorers": [ + chainId: 97, + explorers: [ { - "name": "bscscan-testnet", - "url": "https://testnet.bscscan.com", - "standard": "EIP3091" - } + name: 'bscscan-testnet', + url: 'https://testnet.bscscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BNB Chain Native Token", - "symbol": "tBNB", - "decimals": 18 + nativeCurrency: { + name: 'BNB Chain Native Token', + symbol: 'tBNB', + decimals: 18, }, - "name": "BNB Smart Chain Testnet", - "shortName": "bnbt" + name: 'BNB Smart Chain Testnet', + shortName: 'bnbt', }, { - "chainId": 100, - "explorers": [ + chainId: 100, + explorers: [ { - "name": "gnosisscan", - "url": "https://gnosisscan.io", - "standard": "EIP3091" + name: 'gnosisscan', + url: 'https://gnosisscan.io', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://gnosis.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'blockscout', + url: 'https://gnosis.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://gnosis.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://gnosis.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "xDAI", - "symbol": "XDAI", - "decimals": 18 + nativeCurrency: { + name: 'xDAI', + symbol: 'XDAI', + decimals: 18, }, - "name": "Gnosis", - "shortName": "gno" + name: 'Gnosis', + shortName: 'gno', }, { - "chainId": 108, - "explorers": [ + chainId: 108, + explorers: [ { - "name": "thundercore-viewblock", - "url": "https://viewblock.io/thundercore", - "standard": "EIP3091" - } + name: 'thundercore-viewblock', + url: 'https://viewblock.io/thundercore', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "ThunderCore Token", - "symbol": "TT", - "decimals": 18 + nativeCurrency: { + name: 'ThunderCore Token', + symbol: 'TT', + decimals: 18, }, - "name": "ThunderCore Mainnet", - "shortName": "TT" + name: 'ThunderCore Mainnet', + shortName: 'TT', }, { - "chainId": 122, - "explorers": [ + chainId: 122, + explorers: [ { - "name": "blockscout", - "url": "https://explorer.fuse.io", - "icon": "blockscout", - "standard": "EIP3091" - } + name: 'blockscout', + url: 'https://explorer.fuse.io', + icon: 'blockscout', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fuse", - "symbol": "FUSE", - "decimals": 18 + nativeCurrency: { + name: 'Fuse', + symbol: 'FUSE', + decimals: 18, }, - "name": "Fuse Mainnet", - "shortName": "fuse" + name: 'Fuse Mainnet', + shortName: 'fuse', }, { - "chainId": 128, - "explorers": [ + chainId: 128, + explorers: [ { - "name": "hecoinfo", - "url": "https://hecoinfo.com", - "standard": "EIP3091" - } + name: 'hecoinfo', + url: 'https://hecoinfo.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Huobi ECO Chain Native Token", - "symbol": "HT", - "decimals": 18 + nativeCurrency: { + name: 'Huobi ECO Chain Native Token', + symbol: 'HT', + decimals: 18, }, - "name": "Huobi ECO Chain Mainnet", - "shortName": "heco" + name: 'Huobi ECO Chain Mainnet', + shortName: 'heco', }, { - "chainId": 137, - "explorers": [ + chainId: 137, + explorers: [ { - "name": "polygonscan", - "url": "https://polygonscan.com", - "standard": "EIP3091" + name: 'polygonscan', + url: 'https://polygonscan.com', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://polygon.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://polygon.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "MATIC", - "symbol": "MATIC", - "decimals": 18 + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18, }, - "name": "Polygon Mainnet", - "shortName": "matic" + name: 'Polygon Mainnet', + shortName: 'matic', }, { - "chainId": 199, - "explorers": [ + chainId: 199, + explorers: [ { - "name": "BitTorrent Chain Explorer", - "url": "https://bttcscan.com", - "standard": "EIP3091" - } + name: 'BitTorrent Chain Explorer', + url: 'https://bttcscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "BitTorrent", - "symbol": "BTT", - "decimals": 18 + nativeCurrency: { + name: 'BitTorrent', + symbol: 'BTT', + decimals: 18, }, - "name": "BitTorrent Chain Mainnet", - "shortName": "BTT" + name: 'BitTorrent Chain Mainnet', + shortName: 'BTT', }, { - "chainId": 250, - "explorers": [ + chainId: 250, + explorers: [ { - "name": "ftmscan", - "url": "https://ftmscan.com", - "icon": "ftmscan", - "standard": "EIP3091" + name: 'ftmscan', + url: 'https://ftmscan.com', + icon: 'ftmscan', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://fantom.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://fantom.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fantom", - "symbol": "FTM", - "decimals": 18 + nativeCurrency: { + name: 'Fantom', + symbol: 'FTM', + decimals: 18, }, - "name": "Fantom Opera", - "shortName": "ftm" + name: 'Fantom Opera', + shortName: 'ftm', }, { - "chainId": 288, - "explorers": [ + chainId: 288, + explorers: [ { - "name": "Bobascan", - "url": "https://bobascan.com", - "standard": "none" - } + name: 'Bobascan', + url: 'https://bobascan.com', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Boba Network", - "shortName": "Boba", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Boba Network', + shortName: 'Boba', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://gateway.boba.network" - } - ] - } + url: 'https://gateway.boba.network', + }, + ], + }, }, { - "chainId": 314, - "explorers": [ + chainId: 314, + explorers: [ { - "name": "Filfox", - "url": "https://filfox.info/en", - "standard": "none" + name: 'Filfox', + url: 'https://filfox.info/en', + standard: 'none', }, { - "name": "Beryx", - "url": "https://beryx.zondax.ch", - "standard": "none" + name: 'Beryx', + url: 'https://beryx.zondax.ch', + standard: 'none', }, { - "name": "Glif Explorer", - "url": "https://explorer.glif.io", - "standard": "EIP3091" + name: 'Glif Explorer', + url: 'https://explorer.glif.io', + standard: 'EIP3091', }, { - "name": "Dev.storage", - "url": "https://dev.storage", - "standard": "none" + name: 'Dev.storage', + url: 'https://dev.storage', + standard: 'none', }, { - "name": "Filscan", - "url": "https://filscan.io", - "standard": "none" + name: 'Filscan', + url: 'https://filscan.io', + standard: 'none', }, { - "name": "Filscout", - "url": "https://filscout.io/en", - "standard": "none" - } + name: 'Filscout', + url: 'https://filscout.io/en', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "filecoin", - "symbol": "FIL", - "decimals": 18 + nativeCurrency: { + name: 'filecoin', + symbol: 'FIL', + decimals: 18, }, - "name": "Filecoin - Mainnet", - "shortName": "filecoin" + name: 'Filecoin - Mainnet', + shortName: 'filecoin', }, { - "chainId": 324, - "explorers": [ + chainId: 324, + explorers: [ { - "name": "zkSync Era Block Explorer", - "url": "https://explorer.zksync.io", - "icon": "zksync-era", - "standard": "EIP3091" - } + name: 'zkSync Era Block Explorer', + url: 'https://explorer.zksync.io', + icon: 'zksync-era', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "zkSync Mainnet", - "shortName": "zksync", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'zkSync Mainnet', + shortName: 'zksync', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.zksync.io/" - } - ] - } - }, - { - "chainId": 1088, - "explorers": [ - { - "name": "blockscout", - "url": "https://andromeda-explorer.metis.io", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Metis", - "symbol": "METIS", - "decimals": 18 - }, - "name": "Metis Andromeda Mainnet", - "shortName": "metis-andromeda", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.zksync.io/', + }, + ], + }, + }, + { + chainId: 1088, + explorers: [ + { + name: 'blockscout', + url: 'https://andromeda-explorer.metis.io', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Metis', + symbol: 'METIS', + decimals: 18, + }, + name: 'Metis Andromeda Mainnet', + shortName: 'metis-andromeda', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.metis.io" - } - ] - } - }, - { - "chainId": 1101, - "explorers": [ - { - "name": "blockscout", - "url": "https://zkevm.polygonscan.com", - "icon": "zkevm", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Polygon zkEVM", - "shortName": "zkevm", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.metis.io', + }, + ], + }, + }, + { + chainId: 1101, + explorers: [ + { + name: 'blockscout', + url: 'https://zkevm.polygonscan.com', + icon: 'zkevm', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Polygon zkEVM', + shortName: 'zkevm', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.zkevm-rpc.com" - } - ] - } + url: 'https://bridge.zkevm-rpc.com', + }, + ], + }, }, { - "chainId": 1116, - "explorers": [ + chainId: 1116, + explorers: [ { - "name": "Core Scan", - "url": "https://scan.coredao.org", - "icon": "core", - "standard": "EIP3091" - } + name: 'Core Scan', + url: 'https://scan.coredao.org', + icon: 'core', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Core Blockchain Native Token", - "symbol": "CORE", - "decimals": 18 + nativeCurrency: { + name: 'Core Blockchain Native Token', + symbol: 'CORE', + decimals: 18, }, - "name": "Core Blockchain Mainnet", - "shortName": "core" + name: 'Core Blockchain Mainnet', + shortName: 'core', }, { - "chainId": 1284, - "explorers": [ + chainId: 1284, + explorers: [ { - "name": "moonscan", - "url": "https://moonbeam.moonscan.io", - "standard": "none" - } + name: 'moonscan', + url: 'https://moonbeam.moonscan.io', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Glimmer", - "symbol": "GLMR", - "decimals": 18 + nativeCurrency: { + name: 'Glimmer', + symbol: 'GLMR', + decimals: 18, }, - "name": "Moonbeam", - "shortName": "mbeam" + name: 'Moonbeam', + shortName: 'mbeam', }, { - "chainId": 1285, - "explorers": [ + chainId: 1285, + explorers: [ { - "name": "moonscan", - "url": "https://moonriver.moonscan.io", - "standard": "none" - } + name: 'moonscan', + url: 'https://moonriver.moonscan.io', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Moonriver", - "symbol": "MOVR", - "decimals": 18 + nativeCurrency: { + name: 'Moonriver', + symbol: 'MOVR', + decimals: 18, }, - "name": "Moonriver", - "shortName": "mriver" + name: 'Moonriver', + shortName: 'mriver', }, { - "chainId": 2222, - "explorers": [ + chainId: 2222, + explorers: [ { - "name": "Kava EVM Explorer", - "url": "https://kavascan.com", - "standard": "EIP3091", - "icon": "kava" - } + name: 'Kava EVM Explorer', + url: 'https://kavascan.com', + standard: 'EIP3091', + icon: 'kava', + }, ], - "nativeCurrency": { - "name": "Kava", - "symbol": "KAVA", - "decimals": 18 + nativeCurrency: { + name: 'Kava', + symbol: 'KAVA', + decimals: 18, }, - "name": "Kava", - "shortName": "kava" + name: 'Kava', + shortName: 'kava', }, { - "chainId": 4002, - "explorers": [ + chainId: 4002, + explorers: [ { - "name": "ftmscan", - "url": "https://testnet.ftmscan.com", - "icon": "ftmscan", - "standard": "EIP3091" - } + name: 'ftmscan', + url: 'https://testnet.ftmscan.com', + icon: 'ftmscan', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Fantom", - "symbol": "FTM", - "decimals": 18 + nativeCurrency: { + name: 'Fantom', + symbol: 'FTM', + decimals: 18, }, - "name": "Fantom Testnet", - "shortName": "tftm" + name: 'Fantom Testnet', + shortName: 'tftm', }, { - "chainId": 7000, - "explorers": [ + chainId: 7000, + explorers: [ { - "name": "ZetaChain Mainnet Explorer", - "url": "https://explorer.mainnet.zetachain.com", - "standard": "none" - } + name: 'ZetaChain Mainnet Explorer', + url: 'https://explorer.mainnet.zetachain.com', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Zeta", - "symbol": "ZETA", - "decimals": 18 + nativeCurrency: { + name: 'Zeta', + symbol: 'ZETA', + decimals: 18, }, - "name": "ZetaChain Mainnet", - "shortName": "zetachain-mainnet" + name: 'ZetaChain Mainnet', + shortName: 'zetachain-mainnet', }, { - "chainId": 8453, - "explorers": [ + chainId: 8453, + explorers: [ { - "name": "basescan", - "url": "https://basescan.org", - "standard": "none" + name: 'basescan', + url: 'https://basescan.org', + standard: 'none', }, { - "name": "basescout", - "url": "https://base.blockscout.com", - "icon": "blockscout", - "standard": "EIP3091" + name: 'basescout', + url: 'https://base.blockscout.com', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://base.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://base.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Base", - "shortName": "base" + name: 'Base', + shortName: 'base', }, { - "chainId": 11235, - "explorers": [ + chainId: 11235, + explorers: [ { - "name": "Mainnet HAQQ Explorer", - "url": "https://explorer.haqq.network", - "standard": "EIP3091" - } + name: 'Mainnet HAQQ Explorer', + url: 'https://explorer.haqq.network', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Islamic Coin", - "symbol": "ISLM", - "decimals": 18 + nativeCurrency: { + name: 'Islamic Coin', + symbol: 'ISLM', + decimals: 18, }, - "name": "Haqq Network", - "shortName": "ISLM" + name: 'Haqq Network', + shortName: 'ISLM', }, { - "chainId": 42161, - "explorers": [ + chainId: 42161, + explorers: [ { - "name": "Arbiscan", - "url": "https://arbiscan.io", - "standard": "EIP3091" + name: 'Arbiscan', + url: 'https://arbiscan.io', + standard: 'EIP3091', }, { - "name": "Arbitrum Explorer", - "url": "https://explorer.arbitrum.io", - "standard": "EIP3091" + name: 'Arbitrum Explorer', + url: 'https://explorer.arbitrum.io', + standard: 'EIP3091', }, { - "name": "dexguru", - "url": "https://arbitrum.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } + name: 'dexguru', + url: 'https://arbitrum.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum One", - "shortName": "arb1", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ - { - "url": "https://bridge.arbitrum.io" - } - ] - } - }, - { - "chainId": 42170, - "explorers": [ - { - "name": "Arbitrum Nova Chain Explorer", - "url": "https://nova-explorer.arbitrum.io", - "icon": "blockscout", - "standard": "EIP3091" - }, - { - "name": "dexguru", - "url": "https://nova.dex.guru", - "icon": "dexguru", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum Nova", - "shortName": "arb-nova", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum One', + shortName: 'arb1', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.arbitrum.io" - } - ] - } + url: 'https://bridge.arbitrum.io', + }, + ], + }, }, { - "chainId": 42220, - "explorers": [ + chainId: 42170, + explorers: [ { - "name": "Celoscan", - "url": "https://celoscan.io", - "standard": "EIP3091" + name: 'Arbitrum Nova Chain Explorer', + url: 'https://nova-explorer.arbitrum.io', + icon: 'blockscout', + standard: 'EIP3091', }, { - "name": "blockscout", - "url": "https://explorer.celo.org", - "standard": "none" - } + name: 'dexguru', + url: 'https://nova.dex.guru', + icon: 'dexguru', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "CELO", - "symbol": "CELO", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum Nova', + shortName: 'arb-nova', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ + { + url: 'https://bridge.arbitrum.io', + }, + ], }, - "name": "Celo Mainnet", - "shortName": "celo" }, { - "chainId": 43113, - "explorers": [ + chainId: 42220, + explorers: [ + { + name: 'Celoscan', + url: 'https://celoscan.io', + standard: 'EIP3091', + }, { - "name": "snowtrace", - "url": "https://testnet.snowtrace.io", - "standard": "EIP3091" - } + name: 'blockscout', + url: 'https://explorer.celo.org', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", - "decimals": 18 + nativeCurrency: { + name: 'CELO', + symbol: 'CELO', + decimals: 18, }, - "name": "Avalanche Fuji Testnet", - "shortName": "Fuji" + name: 'Celo Mainnet', + shortName: 'celo', }, { - "chainId": 43114, - "explorers": [ + chainId: 43113, + explorers: [ { - "name": "snowtrace", - "url": "https://snowtrace.io", - "standard": "EIP3091" - } + name: 'snowtrace', + url: 'https://testnet.snowtrace.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Avalanche", - "symbol": "AVAX", - "decimals": 18 + nativeCurrency: { + name: 'Avalanche', + symbol: 'AVAX', + decimals: 18, }, - "name": "Avalanche C-Chain", - "shortName": "avax" + name: 'Avalanche Fuji Testnet', + shortName: 'Fuji', }, { - "chainId": 43288, - "explorers": [ + chainId: 43114, + explorers: [ { - "name": "Boba Avax Explorer", - "url": "https://blockexplorer.avax.boba.network", - "standard": "none" - } + name: 'snowtrace', + url: 'https://snowtrace.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Boba Token", - "symbol": "BOBA", - "decimals": 18 + nativeCurrency: { + name: 'Avalanche', + symbol: 'AVAX', + decimals: 18, }, - "name": "Boba Avax", - "shortName": "bobaavax" + name: 'Avalanche C-Chain', + shortName: 'avax', }, { - "chainId": 56288, - "explorers": [ + chainId: 43288, + explorers: [ { - "name": "Boba BNB block explorer", - "url": "https://bobascan.com", - "standard": "none" - } + name: 'Boba Avax Explorer', + url: 'https://blockexplorer.avax.boba.network', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "Boba Token", - "symbol": "BOBA", - "decimals": 18 + nativeCurrency: { + name: 'Boba Token', + symbol: 'BOBA', + decimals: 18, }, - "name": "Boba BNB Mainnet", - "shortName": "BobaBnb", - "parent": { - "type": "L2", - "chain": "eip155-5", - "bridges": [ + name: 'Boba Avax', + shortName: 'bobaavax', + }, + { + chainId: 56288, + explorers: [ + { + name: 'Boba BNB block explorer', + url: 'https://bobascan.com', + standard: 'none', + }, + ], + nativeCurrency: { + name: 'Boba Token', + symbol: 'BOBA', + decimals: 18, + }, + name: 'Boba BNB Mainnet', + shortName: 'BobaBnb', + parent: { + type: 'L2', + chain: 'eip155-5', + bridges: [ { - "url": "https://gateway.boba.network" - } - ] - } + url: 'https://gateway.boba.network', + }, + ], + }, }, { - "chainId": 59144, - "explorers": [ + chainId: 59144, + explorers: [ { - "name": "Etherscan", - "url": "https://lineascan.build", - "standard": "EIP3091", - "icon": "linea" + name: 'Etherscan', + url: 'https://lineascan.build', + standard: 'EIP3091', + icon: 'linea', }, { - "name": "Blockscout", - "url": "https://explorer.linea.build", - "standard": "EIP3091", - "icon": "linea" + name: 'Blockscout', + url: 'https://explorer.linea.build', + standard: 'EIP3091', + icon: 'linea', }, { - "name": "L2scan", - "url": "https://linea.l2scan.co", - "standard": "EIP3091", - "icon": "linea" - } + name: 'L2scan', + url: 'https://linea.l2scan.co', + standard: 'EIP3091', + icon: 'linea', + }, ], - "nativeCurrency": { - "name": "Linea Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Linea", - "shortName": "linea", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + nativeCurrency: { + name: 'Linea Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Linea', + shortName: 'linea', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://bridge.linea.build" - } - ] - } + url: 'https://bridge.linea.build', + }, + ], + }, }, { - "chainId": 80001, - "explorers": [ + chainId: 80001, + explorers: [ { - "name": "polygonscan", - "url": "https://mumbai.polygonscan.com", - "standard": "EIP3091" - } + name: 'polygonscan', + url: 'https://mumbai.polygonscan.com', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "MATIC", - "symbol": "MATIC", - "decimals": 18 + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18, }, - "name": "Mumbai", - "shortName": "maticmum" + name: 'Mumbai', + shortName: 'maticmum', }, { - "chainId": 81457, - "explorers": [ + chainId: 81457, + explorers: [ { - "name": "Blastscan", - "url": "https://blastscan.io", - "icon": "blast", - "standard": "EIP3091" + name: 'Blastscan', + url: 'https://blastscan.io', + icon: 'blast', + standard: 'EIP3091', }, { - "name": "Blast Explorer", - "url": "https://blastexplorer.io", - "icon": "blast", - "standard": "EIP3091" - } + name: 'Blast Explorer', + url: 'https://blastexplorer.io', + icon: 'blast', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Blast', + shortName: 'blastmainnet', + parent: { + type: 'L2', + chain: 'eip155-1', }, - "name": "Blast", - "shortName": "blastmainnet", - "parent": { - "type": "L2", - "chain": "eip155-1" - } }, { - "chainId": 421614, - "explorers": [ + chainId: 421614, + explorers: [ { - "name": "Arbitrum Sepolia Rollup Testnet Explorer", - "url": "https://sepolia-explorer.arbitrum.io", - "standard": "EIP3091" - } + name: 'Arbitrum Sepolia Rollup Testnet Explorer', + url: 'https://sepolia-explorer.arbitrum.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Sepolia Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Arbitrum Sepolia", - "shortName": "arb-sep", - "parent": { - "type": "L2", - "chain": "eip155-11155111", - "bridges": [ + nativeCurrency: { + name: 'Sepolia Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Arbitrum Sepolia', + shortName: 'arb-sep', + parent: { + type: 'L2', + chain: 'eip155-11155111', + bridges: [ { - "url": "https://bridge.arbitrum.io" - } - ] - } - }, - { - "chainId": 534352, - "explorers": [ - { - "name": "Scrollscan", - "url": "https://scrollscan.com", - "standard": "EIP3091" - } - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "name": "Scroll", - "shortName": "scr", - "parent": { - "type": "L2", - "chain": "eip155-1", - "bridges": [ + url: 'https://bridge.arbitrum.io', + }, + ], + }, + }, + { + chainId: 534352, + explorers: [ + { + name: 'Scrollscan', + url: 'https://scrollscan.com', + standard: 'EIP3091', + }, + ], + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + name: 'Scroll', + shortName: 'scr', + parent: { + type: 'L2', + chain: 'eip155-1', + bridges: [ { - "url": "https://scroll.io/bridge" - } - ] - } + url: 'https://scroll.io/bridge', + }, + ], + }, }, { - "chainId": 11155111, - "explorers": [ + chainId: 11155111, + explorers: [ { - "name": "etherscan-sepolia", - "url": "https://sepolia.etherscan.io", - "standard": "EIP3091" + name: 'etherscan-sepolia', + url: 'https://sepolia.etherscan.io', + standard: 'EIP3091', }, { - "name": "otterscan-sepolia", - "url": "https://sepolia.otterscan.io", - "standard": "EIP3091" - } + name: 'otterscan-sepolia', + url: 'https://sepolia.otterscan.io', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "Sepolia Ether", - "symbol": "ETH", - "decimals": 18 + nativeCurrency: { + name: 'Sepolia Ether', + symbol: 'ETH', + decimals: 18, }, - "name": "Sepolia", - "shortName": "sep" + name: 'Sepolia', + shortName: 'sep', }, { - "chainId": 1666600000, - "explorers": [ + chainId: 1666600000, + explorers: [ { - "name": "Harmony Block Explorer", - "url": "https://explorer.harmony.one", - "standard": "EIP3091" - } + name: 'Harmony Block Explorer', + url: 'https://explorer.harmony.one', + standard: 'EIP3091', + }, ], - "nativeCurrency": { - "name": "ONE", - "symbol": "ONE", - "decimals": 18 + nativeCurrency: { + name: 'ONE', + symbol: 'ONE', + decimals: 18, }, - "name": "Harmony Mainnet Shard 0", - "shortName": "hmy-s0" + name: 'Harmony Mainnet Shard 0', + shortName: 'hmy-s0', }, { - "chainId": 11297108109, - "explorers": [ + chainId: 11297108109, + explorers: [ { - "name": "Chainlens", - "url": "https://palm.chainlens.com", - "standard": "EIP3091" + name: 'Chainlens', + url: 'https://palm.chainlens.com', + standard: 'EIP3091', }, { - "name": "Dora", - "url": "https://www.ondora.xyz/network/palm", - "standard": "none" - } + name: 'Dora', + url: 'https://www.ondora.xyz/network/palm', + standard: 'none', + }, ], - "nativeCurrency": { - "name": "PALM", - "symbol": "PALM", - "decimals": 18 + nativeCurrency: { + name: 'PALM', + symbol: 'PALM', + decimals: 18, }, - "name": "Palm", - "shortName": "palm" - } -] as const; - + name: 'Palm', + shortName: 'palm', + }, +] as const diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index bcf69a7184..fbf29f3516 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -146,7 +146,7 @@ const flare = { ..._flare, contracts: { multicall3: { - address: "0xcA11bde05977b3631167028862bE2a173976CA11", + address: '0xcA11bde05977b3631167028862bE2a173976CA11', blockCreated: 3002461, }, }, From ef32759e86aed7e20f8ef7559d487a00c48982ba Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:33:54 +0000 Subject: [PATCH 008/140] update --- .github/workflows/apps-evm-e2e.yml | 150 ++++++++++++------------ .github/workflows/chromatic.yml | 60 +++++----- .github/workflows/verify.yml | 182 ++++++++++++++--------------- 3 files changed, 196 insertions(+), 196 deletions(-) diff --git a/.github/workflows/apps-evm-e2e.yml b/.github/workflows/apps-evm-e2e.yml index 652fd14232..f904322af4 100644 --- a/.github/workflows/apps-evm-e2e.yml +++ b/.github/workflows/apps-evm-e2e.yml @@ -1,84 +1,84 @@ -# name: Sushi - apps / evm +name: Sushi - apps / evm -# on: -# pull_request: -# types: [opened, synchronize] -# paths: -# - ".github/workflows/apps-evm-e2e.yml" -# - "apps/evm/**" -# - "config/nextjs/**" -# - "config/router/**" -# - "config/tailwindcss/**" -# - "config/typescript/**" -# - "config/viem/**" -# - "config/wagmi/**" -# - "packages/**" -# workflow_dispatch: +on: + pull_request: + types: [opened, synchronize] + paths: + - ".github/workflows/apps-evm-e2e.yml" + - "apps/evm/**" + - "config/nextjs/**" + - "config/router/**" + - "config/tailwindcss/**" + - "config/typescript/**" + - "config/viem/**" + - "config/wagmi/**" + - "packages/**" + workflow_dispatch: -# env: -# CI: true -# NODE_OPTIONS: --max-old-space-size=8192 -# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} -# TURBO_TEAM: ${{ secrets.TURBO_TEAM }} -# TURBO_FORCE: false -# concurrency: -# group: ${{ github.workflow }}-${{ github.ref }} -# cancel-in-progress: true -# jobs: -# e2e: -# runs-on: buildjet-4vcpu-ubuntu-2204 -# timeout-minutes: 15 -# strategy: -# matrix: -# block-number: [55359656] -# chain-id: [137] -# node-version: [20] -# pnpm-version: [8.15.3] -# steps: -# - name: Clone repository -# uses: actions/checkout@v4 -# with: -# fetch-depth: 2 -# submodules: true +env: + CI: true + NODE_OPTIONS: --max-old-space-size=8192 + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_FORCE: false +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + e2e: + runs-on: buildjet-4vcpu-ubuntu-2204 + timeout-minutes: 15 + strategy: + matrix: + block-number: [55359656] + chain-id: [137] + node-version: [20] + pnpm-version: [8.15.3] + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + submodules: true -# # Has to be before setup node for caching to work -# - uses: pnpm/action-setup@v2 -# with: -# version: ${{ matrix.pnpm-version }} + # Has to be before setup node for caching to work + - uses: pnpm/action-setup@v2 + with: + version: ${{ matrix.pnpm-version }} -# - name: Setup Node.js -# uses: buildjet/setup-node@v3 -# with: -# cache: 'pnpm' -# node-version: ${{ matrix.node-version }} + - name: Setup Node.js + uses: buildjet/setup-node@v3 + with: + cache: 'pnpm' + node-version: ${{ matrix.node-version }} -# - name: Install Foundry -# uses: foundry-rs/foundry-toolchain@v1 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 -# - name: Install dependencies -# run: pnpm install --frozen-lockfile --prefer-offline + - name: Install dependencies + run: pnpm install --frozen-lockfile --prefer-offline -# - name: Install Playwright Browsers -# run: npx playwright@1.37.0 install --with-deps chromium + - name: Install Playwright Browsers + run: npx playwright@1.37.0 install --with-deps chromium -# - name: Test -# run: pnpm exec turbo run test --filter evm -# env: -# ANVIL_FORK_URL: ${{ secrets.ANVIL_FORK_URL }} -# ANVIL_BLOCK_NUMBER: ${{ matrix.block-number }} -# DATABASE_URL: ${{ secrets.DATABASE_URL }} -# REDIS_URL: ${{ secrets.REDIS_URL }} -# EDGE_CONFIG: ${{ secrets.EDGE_CONFIG }} -# NEXT_PUBLIC_APP_ENV: 'test' -# NEXT_PUBLIC_ALCHEMY_ID: ${{ secrets.NEXT_PUBLIC_ALCHEMY_ID }} -# NEXT_PUBLIC_CHAIN_ID: ${{ matrix.chain-id }} -# NEXT_PUBLIC_API_BASE_URL: 'https://mock-swap-api' -# NEXT_TELEMETRY_DISABLED: 1 + - name: Test + run: pnpm exec turbo run test --filter evm + env: + ANVIL_FORK_URL: ${{ secrets.ANVIL_FORK_URL }} + ANVIL_BLOCK_NUMBER: ${{ matrix.block-number }} + DATABASE_URL: ${{ secrets.DATABASE_URL }} + REDIS_URL: ${{ secrets.REDIS_URL }} + EDGE_CONFIG: ${{ secrets.EDGE_CONFIG }} + NEXT_PUBLIC_APP_ENV: 'test' + NEXT_PUBLIC_ALCHEMY_ID: ${{ secrets.NEXT_PUBLIC_ALCHEMY_ID }} + NEXT_PUBLIC_CHAIN_ID: ${{ matrix.chain-id }} + NEXT_PUBLIC_API_BASE_URL: 'https://mock-swap-api' + NEXT_TELEMETRY_DISABLED: 1 -# - name: Upload test results -# if: always() -# uses: actions/upload-artifact@v3 -# with: -# name: playwright-report -# path: ./apps/evm/test-results/ -# retention-days: 30 \ No newline at end of file + - name: Upload test results + if: always() + uses: actions/upload-artifact@v3 + with: + name: playwright-report + path: ./apps/evm/test-results/ + retention-days: 30 \ No newline at end of file diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 9c721898ec..150bed71ea 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -1,32 +1,32 @@ -# name: 'Chromatic' +name: 'Chromatic' -# on: -# pull_request: -# types: [opened, synchronize] -# paths: -# - ".github/workflows/chromatic.yml" -# - "config/tailwindcss/**" -# - "packages/ui/**" -# concurrency: -# group: ${{ github.workflow }}-${{ github.ref }} -# cancel-in-progress: true -# jobs: -# publish: -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 -# with: -# submodules: true -# fetch-depth: 0 -# - name: Install dependencies -# uses: ./.github/actions/install -# - name: Build storybook -# run: pnpm exec turbo run build --filter=storybook^... -# - name: Publish to Chromatic -# uses: chromaui/action@v1 -# with: -# projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} -# workingDir: apps/storybook -# buildScriptName: build -# exitOnceUploaded: true +on: + pull_request: + types: [opened, synchronize] + paths: + - ".github/workflows/chromatic.yml" + - "config/tailwindcss/**" + - "packages/ui/**" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 0 + - name: Install dependencies + uses: ./.github/actions/install + - name: Build storybook + run: pnpm exec turbo run build --filter=storybook^... + - name: Publish to Chromatic + uses: chromaui/action@v1 + with: + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + workingDir: apps/storybook + buildScriptName: build + exitOnceUploaded: true diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 4028056f03..fc63f6dbc4 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -1,97 +1,97 @@ -# name: Sushi - verify -# # on: -# # workflow_call: -# # workflow_dispatch: +name: Sushi - verify # on: -# pull_request: -# types: [opened, synchronize] -# env: -# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} -# TURBO_TEAM: ${{ secrets.TURBO_TEAM }} -# concurrency: -# group: ${{ github.workflow }}-${{ github.ref }} -# cancel-in-progress: true -# jobs: -# format: -# name: Format -# runs-on: ubuntu-latest -# timeout-minutes: 5 -# steps: -# - name: Clone repository -# uses: actions/checkout@v4 -# with: -# token: ${{ secrets.PAT }} -# ref: ${{ github.head_ref }} -# - name: Install dependencies -# uses: ./.github/actions/install -# - name: Format -# run: pnpm format -# - uses: stefanzweifel/git-auto-commit-action@v4 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# commit_message: 'chore: format' -# commit_user_name: 'github-actions[bot]' -# commit_user_email: 'github-actions[bot]@users.noreply.github.com' +# workflow_call: +# workflow_dispatch: +on: + pull_request: + types: [opened, synchronize] +env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + format: + name: Format + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.PAT }} + ref: ${{ github.head_ref }} + - name: Install dependencies + uses: ./.github/actions/install + - name: Format + run: pnpm format + - uses: stefanzweifel/git-auto-commit-action@v4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + commit_message: 'chore: format' + commit_user_name: 'github-actions[bot]' + commit_user_email: 'github-actions[bot]@users.noreply.github.com' -# lint: -# name: Lint -# runs-on: ubuntu-latest -# timeout-minutes: 5 -# steps: -# - name: Clone repository -# uses: actions/checkout@v4 -# with: -# token: ${{ secrets.PAT }} -# ref: ${{ github.head_ref }} -# - name: Install dependencies -# uses: ./.github/actions/install -# - name: Lint -# run: pnpm lint --apply -# - uses: stefanzweifel/git-auto-commit-action@v4 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# commit_message: 'chore: lint' -# commit_user_name: 'github-actions[bot]' -# commit_user_email: 'github-actions[bot]@users.noreply.github.com' + lint: + name: Lint + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.PAT }} + ref: ${{ github.head_ref }} + - name: Install dependencies + uses: ./.github/actions/install + - name: Lint + run: pnpm lint --apply + - uses: stefanzweifel/git-auto-commit-action@v4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + commit_message: 'chore: lint' + commit_user_name: 'github-actions[bot]' + commit_user_email: 'github-actions[bot]@users.noreply.github.com' -# # build: -# # name: Build -# # needs: [lint, format] -# # runs-on: ubuntu-latest -# # timeout-minutes: 5 -# # steps: -# # - uses: actions/checkout@v3 -# # with: -# # submodules: true -# # - name: Install dependencies -# # uses: ./.github/actions/install -# # - name: Build -# # run: pnpm build + # build: + # name: Build + # needs: [lint, format] + # runs-on: ubuntu-latest + # timeout-minutes: 5 + # steps: + # - uses: actions/checkout@v3 + # with: + # submodules: true + # - name: Install dependencies + # uses: ./.github/actions/install + # - name: Build + # run: pnpm build -# types: -# name: Types -# needs: [lint, format] -# runs-on: ubuntu-latest -# timeout-minutes: 5 -# steps: -# - name: Clone repository -# uses: actions/checkout@v4 + types: + name: Types + needs: [lint, format] + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Clone repository + uses: actions/checkout@v4 -# - name: Install dependencies -# uses: ./.github/actions/install -# - name: Check types -# run: pnpm check + - name: Install dependencies + uses: ./.github/actions/install + - name: Check types + run: pnpm check -# test: -# name: Test -# runs-on: ubuntu-latest -# needs: [lint, format] -# steps: -# - name: Clone repository -# uses: actions/checkout@v4 -# - name: Install dependencies -# uses: ./.github/actions/install -# - name: Test packages -# run: pnpm exec turbo run test --filter=./packages/* \ No newline at end of file + test: + name: Test + runs-on: ubuntu-latest + needs: [lint, format] + steps: + - name: Clone repository + uses: actions/checkout@v4 + - name: Install dependencies + uses: ./.github/actions/install + - name: Test packages + run: pnpm exec turbo run test --filter=./packages/* \ No newline at end of file From 21ad980e4fc15146449dc781886889a91016b2b0 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:38:30 +0000 Subject: [PATCH 009/140] add rain ci - update org repo workflows to manual dispatch --- .github/workflows/apps-evm-e2e.yml | 24 ++++++++++++------------ .github/workflows/chromatic.yml | 13 +++++++------ .github/workflows/rain-ci.yml | 26 ++++++++++++++++++++++++++ .github/workflows/verify.yml | 5 +++-- 4 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/rain-ci.yml diff --git a/.github/workflows/apps-evm-e2e.yml b/.github/workflows/apps-evm-e2e.yml index f904322af4..9d31c18446 100644 --- a/.github/workflows/apps-evm-e2e.yml +++ b/.github/workflows/apps-evm-e2e.yml @@ -1,18 +1,18 @@ name: Sushi - apps / evm on: - pull_request: - types: [opened, synchronize] - paths: - - ".github/workflows/apps-evm-e2e.yml" - - "apps/evm/**" - - "config/nextjs/**" - - "config/router/**" - - "config/tailwindcss/**" - - "config/typescript/**" - - "config/viem/**" - - "config/wagmi/**" - - "packages/**" + # pull_request: + # types: [opened, synchronize] + # paths: + # - ".github/workflows/apps-evm-e2e.yml" + # - "apps/evm/**" + # - "config/nextjs/**" + # - "config/router/**" + # - "config/tailwindcss/**" + # - "config/typescript/**" + # - "config/viem/**" + # - "config/wagmi/**" + # - "packages/**" workflow_dispatch: env: diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 150bed71ea..52dd4c8bd5 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -1,12 +1,13 @@ name: 'Chromatic' on: - pull_request: - types: [opened, synchronize] - paths: - - ".github/workflows/chromatic.yml" - - "config/tailwindcss/**" - - "packages/ui/**" + # pull_request: + # types: [opened, synchronize] + # paths: + # - ".github/workflows/chromatic.yml" + # - "config/tailwindcss/**" + # - "packages/ui/**" + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml new file mode 100644 index 0000000000..59b36ef9cc --- /dev/null +++ b/.github/workflows/rain-ci.yml @@ -0,0 +1,26 @@ +name: Rain CI +on: [push] + +jobs: + fmt-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + + - name: Install deps + run: nix develop -c pnpm install --frozen-lockfile + + - name: Build Sushi Lib + run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi + + - name: Lint Sushi Lib + run: nix develop -c pnpm lint + + - name: Check + run: nix develop -c pnpm check + + - name: Test Sushi Lib + run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index fc63f6dbc4..b696c5da82 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -3,8 +3,9 @@ name: Sushi - verify # workflow_call: # workflow_dispatch: on: - pull_request: - types: [opened, synchronize] + # pull_request: + # types: [opened, synchronize] + workflow_dispatch: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} From 84c211bc9c8f5b159dc45fc2e4f529844b8e82a4 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 00:39:36 +0000 Subject: [PATCH 010/140] Update rain-ci.yml --- .github/workflows/rain-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 59b36ef9cc..19db40f747 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -2,7 +2,7 @@ name: Rain CI on: [push] jobs: - fmt-test: + install-build-lint-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 29a884e38fea86e9bbde807277fac01df36115ff Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 01:15:13 +0000 Subject: [PATCH 011/140] add flare network bases --- .github/workflows/rain-ci.yml | 2 +- packages/hooks/src/usePinnedTokens.ts | 16 ++++++++++++++ packages/sushi/src/config/additional-bases.ts | 15 +++++++++++++ .../config/bases-to-check-trades-against.ts | 21 ++++++++++++++++++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 19db40f747..fbad241f7c 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -19,7 +19,7 @@ jobs: - name: Lint Sushi Lib run: nix develop -c pnpm lint - - name: Check + - name: Pnpm Check Types run: nix develop -c pnpm check - name: Test Sushi Lib diff --git a/packages/hooks/src/usePinnedTokens.ts b/packages/hooks/src/usePinnedTokens.ts index 7950e52b33..3b3e69f478 100644 --- a/packages/hooks/src/usePinnedTokens.ts +++ b/packages/hooks/src/usePinnedTokens.ts @@ -12,6 +12,11 @@ import { import { ARB, DAI, + ENOSYS_APS, + ENOSYS_BNZ, + ENOSYS_EETH, + ENOSYS_EQNT, + ENOSYS_HLN, FRAX, GNO, MATIC, @@ -353,6 +358,17 @@ export const DEFAULT_BASES = { USDC[ChainId.CRONOS], ], [ChainId.BLAST]: [Native.onChain(ChainId.BLAST), USDB[ChainId.BLAST]], + [ChainId.FLARE]: [ + Native.onChain(ChainId.FLARE), + WNATIVE[ChainId.FLARE], + WETH9[ChainId.FLARE], + USDT[ChainId.FLARE], + ENOSYS_BNZ, + ENOSYS_EQNT, + ENOSYS_HLN, + ENOSYS_APS, + ENOSYS_EETH, + ], // [ChainId.SEPOLIA]: [Native.onChain(ChainId.SEPOLIA), WNATIVE[ChainId.SEPOLIA]], } as const satisfies Record> diff --git a/packages/sushi/src/config/additional-bases.ts b/packages/sushi/src/config/additional-bases.ts index b14dd92d0c..02536f2641 100644 --- a/packages/sushi/src/config/additional-bases.ts +++ b/packages/sushi/src/config/additional-bases.ts @@ -14,6 +14,7 @@ import { SWISE_ADDRESS, TRIBE_ADDRESS, WBTC_ADDRESS, + WNATIVE_ADDRESS, XSUSHI_ADDRESS, rETH2_ADDRESS, renBTC_ADDRESS, @@ -26,6 +27,11 @@ import { COMP, CRV, ENJ, + ENOSYS_APS, + ENOSYS_BNZ, + ENOSYS_EETH, + ENOSYS_EQNT, + ENOSYS_HLN, FEI, FRAX, FXS, @@ -53,6 +59,7 @@ import { UNI, WAVAX, WBTC, + WNATIVE, XSUSHI, YFI, renBTC, @@ -156,4 +163,12 @@ export const ADDITIONAL_BASES: { [FRAX_ADDRESS[ChainId.OPTIMISM]]: [FXS[ChainId.OPTIMISM]], [FXS_ADDRESS[ChainId.OPTIMISM]]: [FRAX[ChainId.OPTIMISM]], }, + [ChainId.FLARE]: { + [ENOSYS_BNZ.address]: [WNATIVE[ChainId.FLARE]], + [ENOSYS_EETH.address]: [WNATIVE[ChainId.FLARE]], + [WNATIVE_ADDRESS[ChainId.FLARE]]: [ENOSYS_BNZ, ENOSYS_EETH], + [ENOSYS_EQNT.address]: [ENOSYS_HLN], + [ENOSYS_HLN.address]: [ENOSYS_APS, ENOSYS_EQNT], + [ENOSYS_APS.address]: [ENOSYS_HLN], + }, } diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index a7d9aa8bfc..f26945152e 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -1,5 +1,14 @@ import { ChainId } from '../chain/index.js' -import { MUSD, Token, USDB } from '../currency/index.js' +import { + ENOSYS_APS, + ENOSYS_BNZ, + ENOSYS_EETH, + ENOSYS_EQNT, + ENOSYS_HLN, + MUSD, + Token, + USDB, +} from '../currency/index.js' import { AAVE, BUSD, @@ -479,4 +488,14 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { USDC[ChainId.CRONOS], ], [ChainId.BLAST]: [WNATIVE[ChainId.BLAST], USDB[ChainId.BLAST], MUSD], + [ChainId.FLARE]: [ + WNATIVE[ChainId.FLARE], + WETH9[ChainId.FLARE], + USDT[ChainId.FLARE], + ENOSYS_BNZ, + ENOSYS_EQNT, + ENOSYS_HLN, + ENOSYS_APS, + ENOSYS_EETH, + ], } From b73fe9e0d60b3617398922ec65bbe90f623c7e8a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 01:26:54 +0000 Subject: [PATCH 012/140] Update rain-ci.yml --- .github/workflows/rain-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index fbad241f7c..934b3988e6 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -16,11 +16,11 @@ jobs: - name: Build Sushi Lib run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi - - name: Lint Sushi Lib + - name: Lint run: nix develop -c pnpm lint - - name: Pnpm Check Types - run: nix develop -c pnpm check + - name: Check Sushi Lib Types + run: nix develop -c pnpm exec turbo run check --filter=./packages/sushi - name: Test Sushi Lib run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file From 1f611b32eb72cefcc7dfbc352ceecb0449f6d54d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 01:38:42 +0000 Subject: [PATCH 013/140] Update additional-bases.ts --- packages/sushi/src/config/additional-bases.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/sushi/src/config/additional-bases.ts b/packages/sushi/src/config/additional-bases.ts index 02536f2641..b14dd92d0c 100644 --- a/packages/sushi/src/config/additional-bases.ts +++ b/packages/sushi/src/config/additional-bases.ts @@ -14,7 +14,6 @@ import { SWISE_ADDRESS, TRIBE_ADDRESS, WBTC_ADDRESS, - WNATIVE_ADDRESS, XSUSHI_ADDRESS, rETH2_ADDRESS, renBTC_ADDRESS, @@ -27,11 +26,6 @@ import { COMP, CRV, ENJ, - ENOSYS_APS, - ENOSYS_BNZ, - ENOSYS_EETH, - ENOSYS_EQNT, - ENOSYS_HLN, FEI, FRAX, FXS, @@ -59,7 +53,6 @@ import { UNI, WAVAX, WBTC, - WNATIVE, XSUSHI, YFI, renBTC, @@ -163,12 +156,4 @@ export const ADDITIONAL_BASES: { [FRAX_ADDRESS[ChainId.OPTIMISM]]: [FXS[ChainId.OPTIMISM]], [FXS_ADDRESS[ChainId.OPTIMISM]]: [FRAX[ChainId.OPTIMISM]], }, - [ChainId.FLARE]: { - [ENOSYS_BNZ.address]: [WNATIVE[ChainId.FLARE]], - [ENOSYS_EETH.address]: [WNATIVE[ChainId.FLARE]], - [WNATIVE_ADDRESS[ChainId.FLARE]]: [ENOSYS_BNZ, ENOSYS_EETH], - [ENOSYS_EQNT.address]: [ENOSYS_HLN], - [ENOSYS_HLN.address]: [ENOSYS_APS, ENOSYS_EQNT], - [ENOSYS_APS.address]: [ENOSYS_HLN], - }, } From a5beb3f3d8c7b939aeb46f04508e8c0c10d36138 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 01:40:34 +0000 Subject: [PATCH 014/140] Update rain-ci.yml --- .github/workflows/rain-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 934b3988e6..aaa7e6dc03 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -13,14 +13,14 @@ jobs: - name: Install deps run: nix develop -c pnpm install --frozen-lockfile - - name: Build Sushi Lib + - name: Build ./packages/sushi run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi - name: Lint run: nix develop -c pnpm lint - - name: Check Sushi Lib Types + - name: Check ./packages/sushi Types run: nix develop -c pnpm exec turbo run check --filter=./packages/sushi - - name: Test Sushi Lib + - name: Test ./packages/sushi run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file From 22b9daddab25068e97452a1ad79d8301f4424b48 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 03:28:14 +0000 Subject: [PATCH 015/140] init - data fetcher options - memoizer for fetching pools details --- packages/sushi/src/router/data-fetcher.ts | 24 ++- .../liquidity-providers/CurveProvider.ts | 52 ++++- .../liquidity-providers/LiquidityProvider.ts | 2 + .../src/router/liquidity-providers/Trident.ts | 173 ++++++++++------ .../liquidity-providers/UniswapV2Base.ts | 47 +++-- .../liquidity-providers/UniswapV3Base.ts | 189 ++++++++++++------ .../src/router/static-pool-fetcher/Trident.ts | 59 +++++- 7 files changed, 386 insertions(+), 160 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index e6069096f2..8c88ee3d7e 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -29,6 +29,12 @@ import { UniswapV2Provider } from './liquidity-providers/UniswapV2.js' import { UniswapV3Provider } from './liquidity-providers/UniswapV3.js' import type { PoolCode } from './pool-codes/index.js' +// options for data fetching, such as pinning block number and memoize +export type DataFetcherOptions = { + blockNumber?: bigint, + memoize?: boolean +} + // TODO: Should be a mode on the config for DataFetcher const isTest = process.env['APP_ENV'] === 'test' || @@ -169,6 +175,7 @@ export class DataFetcher { currency0: Type, currency1: Type, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { // console.log('PROVIDER COUNT', this.providers.length) // ensure that we only fetch the native wrap pools if the token is the native currency and wrapped native currency @@ -177,11 +184,14 @@ export class DataFetcher { (p) => p.getType() === LiquidityProviders.NativeWrap, ) if (provider) { - await provider.fetchPoolsForToken( - currency0.wrapped, - currency1.wrapped, - excludePools, - ) + try { + await provider.fetchPoolsForToken( + currency0.wrapped, + currency1.wrapped, + excludePools, + options + ) + } catch { /**/ } } } else { const [token0, token1] = @@ -189,9 +199,9 @@ export class DataFetcher { currency0.wrapped.sortsBefore(currency1.wrapped) ? [currency0.wrapped, currency1.wrapped] : [currency1.wrapped, currency0.wrapped] - await Promise.all( + await Promise.allSettled( this.providers.map((p) => - p.fetchPoolsForToken(token0, token1, excludePools), + p.fetchPoolsForToken(token0, token1, excludePools, options), ), ) } diff --git a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts index 837f850d44..176b98a0a3 100644 --- a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts @@ -22,6 +22,8 @@ import { getCurrencyCombinations } from '../get-currency-combinations.js' import { CurvePoolCode } from '../pool-codes/CurvePool.js' import { PoolCode } from '../pool-codes/PoolCode.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { memoizer } from '../memoizer.js' const stETH = new Token({ chainId: 1, @@ -379,9 +381,13 @@ export class CurveProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise> { const pools: Map = new Map() let currencyCombinations = getCurrencyCombinations(this.chainId, t0, t1) + + const multicallMemoize = await memoizer.fn(this.client.multicall); + for (let i = 0; currencyCombinations.length > 0; ++i) { const calls = (CURVE_FACTORY_ADDRESSES[this.chainId] ?? []).flatMap( (factory) => @@ -397,12 +403,25 @@ export class CurveProvider extends LiquidityProvider { ] as const, })), ) - const newFoundPools = await this.client.multicall({ + const newfoundPoolsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, + blockNumber: options?.blockNumber, contracts: calls, - }) + } + const newFoundPools: ({ + error?: undefined; + result: `0x${string}`; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[] = options?.memoize + ? await multicallMemoize(newfoundPoolsData) as any + : await this.client.multicall(newfoundPoolsData) + newFoundPools.forEach((pool, i) => { if ( pool.status === 'success' && @@ -429,12 +448,16 @@ export class CurveProvider extends LiquidityProvider { async getPoolRatio( pools: [string, [CurvePoolType, Type[]]][], + options?: DataFetcherOptions, ): Promise<(number[] | undefined)[]> { if (this.chainId === ChainId.ETHEREUM) { - const ratios = await this.client.multicall({ + const multicallMemoize = await memoizer.fn(this.client.multicall); + + const ratiosData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, + blockNumber: options?.blockNumber, contracts: [ { address: '0xE95A203B1a91a908F9B9CE46459d101078c2c3cb', // ankr @@ -467,7 +490,11 @@ export class CurveProvider extends LiquidityProvider { functionName: 'exchangeRateCurrent', }, ], - }) + } as any + const ratios = options?.memoize + ? await multicallMemoize(ratiosData) as any + : await this.client.multicall(ratiosData) + return pools.map(([poolAddress]) => { // collection of freaks switch (poolAddress.toLowerCase()) { @@ -498,9 +525,10 @@ export class CurveProvider extends LiquidityProvider { async getCurvePoolCodes( pools: Map, + options?: DataFetcherOptions, ): Promise { const poolArray = Array.from(pools.entries()) - const poolsMulticall = < + const poolsMulticall = async < T extends ContractFunctionParameters< (typeof curvePoolABI)[keyof typeof curvePoolABI] >['functionName'], @@ -512,10 +540,12 @@ export class CurveProvider extends LiquidityProvider { T >['args'], ) => { - return this.client.multicall({ + const multicallMemoize = await memoizer.fn(this.client.multicall); + const data = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, + blockNumber: options?.blockNumber, contracts: poolArray.map(([address, [poolType]]) => ({ address: address as Address, // //chainId: this.chainId, @@ -523,7 +553,10 @@ export class CurveProvider extends LiquidityProvider { functionName: functionName, args, })) as any, - }) + } as any + return options?.memoize + ? multicallMemoize(data) as any + : this.client.multicall(data) } // const poolContract = getContract({ // address: poolAddress as '0x${string}', @@ -581,9 +614,10 @@ export class CurveProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { - const pools = await this.getPoolsForTokens(t0, t1, excludePools) - this.foundPools = await this.getCurvePoolCodes(pools) + const pools = await this.getPoolsForTokens(t0, t1, excludePools, options) + this.foundPools = await this.getCurvePoolCodes(pools, options) //console.log(JSON.stringify(this.foundPools, undefined, ' ')) } diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 59e73d54d4..ae726a2f66 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -2,6 +2,7 @@ import { PublicClient } from 'viem' import { ChainId, chainShortName } from '../../chain/index.js' import type { Token } from '../../currency/index.js' import type { PoolCode } from '../pool-codes/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' export enum LiquidityProviders { SushiSwapV2 = 'SushiSwapV2', @@ -79,6 +80,7 @@ export abstract class LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions ): Promise /** diff --git a/packages/sushi/src/router/liquidity-providers/Trident.ts b/packages/sushi/src/router/liquidity-providers/Trident.ts index bfaf64e0c2..8d4e1c1b22 100644 --- a/packages/sushi/src/router/liquidity-providers/Trident.ts +++ b/packages/sushi/src/router/liquidity-providers/Trident.ts @@ -39,6 +39,8 @@ import { TridentStaticPoolFetcher, } from '../static-pool-fetcher/Trident.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { memoizer } from '../memoizer.js' export function convertToNumbers(arr: bigint[]): (number | undefined)[] { return arr.map((a) => { @@ -577,6 +579,7 @@ export class TridentProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { const topPoolAddresses = [ ...Array.from(this.topClassicPools.keys()), @@ -609,6 +612,7 @@ export class TridentProvider extends LiquidityProvider { this.chainId, t0, t1, + options ) if (excludePools) onDemandClassicPools = (onDemandClassicPools as PoolResponse2[]).filter( @@ -723,21 +727,34 @@ export class TridentProvider extends LiquidityProvider { } }) - const classicReservePromise = this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: classicPoolCodesToCreate.map( - (pc) => - ({ - address: pc.pool.address as Address, - chainId: this.chainId, - abi: getReservesAbi, - functionName: 'getReserves', - }) as const, - ), + const multicallMemoize = await memoizer.fn(this.client.multicall); + + const classicReservesPromiseData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: classicPoolCodesToCreate.map( + (pc) => + ({ + address: pc.pool.address as Address, + chainId: this.chainId, + abi: getReservesAbi, + functionName: 'getReserves', + }) as const, + ), + } + const classicReservePromise = options?.memoize + ? (multicallMemoize(classicReservesPromiseData) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : this.client.multicall(classicReservesPromiseData) .catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -747,21 +764,32 @@ export class TridentProvider extends LiquidityProvider { return undefined }) - const stableReservePromise = this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: stablePoolCodesToCreate.map( - (pc) => - ({ - address: pc.pool.address as Address, - chainId: this.chainId, - abi: getStableReservesAbi, - functionName: 'getReserves', - }) as const, - ), + const stableReservePromiseData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: stablePoolCodesToCreate.map( + (pc) => + ({ + address: pc.pool.address as Address, + chainId: this.chainId, + abi: getStableReservesAbi, + functionName: 'getReserves', + }) as const, + ), + } + const stableReservePromise = options?.memoize + ? (multicallMemoize(stableReservePromiseData) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : this.client.multicall(stableReservePromiseData) .catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -771,24 +799,35 @@ export class TridentProvider extends LiquidityProvider { return undefined }) - const totalsPromise = this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: bridgesToCreate.map( - (b) => - ({ - args: [b.pool.token0.address as Address], - address: this.bentoBox[ - this.chainId as BentoBoxChainId - ] as Address, - chainId: this.chainId, - abi: totalsAbi, - functionName: 'totals', - }) as const, - ), + const totalsPromiseData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: bridgesToCreate.map( + (b) => + ({ + args: [b.pool.token0.address as Address], + address: this.bentoBox[ + this.chainId as BentoBoxChainId + ] as Address, + chainId: this.chainId, + abi: totalsAbi, + functionName: 'totals', + }) as const, + ), + } + const totalsPromise = options?.memoize + ? (multicallMemoize(totalsPromiseData) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : this.client.multicall(totalsPromiseData) .catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -798,22 +837,33 @@ export class TridentProvider extends LiquidityProvider { return undefined }) - const balancesPromise = this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: bridgesToCreate.map( - (b) => - ({ - args: [this.bentoBox[this.chainId as BentoBoxChainId] as Address], - address: b.pool.token0.address as Address, - chainId: this.chainId, - abi: balanceOfAbi, - functionName: 'balanceOf', - }) as const, - ), + const balancesPromiseData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: bridgesToCreate.map( + (b) => + ({ + args: [this.bentoBox[this.chainId as BentoBoxChainId] as Address], + address: b.pool.token0.address as Address, + chainId: this.chainId, + abi: balanceOfAbi, + functionName: 'balanceOf', + }) as const, + ), + } + const balancesPromise = options?.memoize + ? (multicallMemoize(balancesPromiseData) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : this.client.multicall(balancesPromiseData) .catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -1139,8 +1189,9 @@ export class TridentProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { - await this.getOnDemandPools(t0, t1, excludePools) + await this.getOnDemandPools(t0, t1, excludePools, options) } getCurrentPoolList(t0: Token, t1: Token): PoolCode[] { diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index d9d31ec9b7..09c7bc06ad 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -18,6 +18,8 @@ import { } from '../lib/api.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' +import { memoizer } from '../memoizer.js' +import { DataFetcherOptions } from '../data-fetcher.js' interface PoolInfo { poolCode: PoolCode @@ -160,6 +162,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { const topPoolAddresses = Array.from(this.topPools.keys()) let pools = @@ -219,21 +222,34 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } }) - const reserves = await this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: poolCodesToCreate.map( - (poolCode) => - ({ - address: poolCode.pool.address as Address, - chainId: this.chainId, - abi: getReservesAbi, - functionName: 'getReserves', - }) as const, - ), + const multicallMemoize = await memoizer.fn(this.client.multicall); + + const multicallData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: poolCodesToCreate.map( + (poolCode) => + ({ + address: poolCode.pool.address as Address, + chainId: this.chainId, + abi: getReservesAbi, + functionName: 'getReserves', + }) as const, + ), + } + const reserves = options?.memoize + ? await (multicallMemoize(multicallData) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : await this.client.multicall(multicallData) .catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ @@ -536,8 +552,9 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, + options?: DataFetcherOptions, ): Promise { - await this.getOnDemandPools(t0, t1, excludePools) + await this.getOnDemandPools(t0, t1, excludePools, options) } /** diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index c3ab1201b7..36584a19a3 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -8,6 +8,8 @@ import { RToken, UniV3Pool } from '../../tines/index.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { memoizer } from '../memoizer.js' interface StaticPool { address: Address @@ -78,62 +80,76 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { t0: Token, t1: Token, excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, ): Promise { let staticPools = this.getStaticPools(t0, t1) if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - const slot0 = await this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - contracts: staticPools.map( - (pool) => - ({ - address: pool.address as Address, - chainId: this.chainId, - abi: [ - { - inputs: [], - name: 'slot0', - outputs: [ - { - internalType: 'uint160', - name: 'sqrtPriceX96', - type: 'uint160', - }, - { internalType: 'int24', name: 'tick', type: 'int24' }, - { - internalType: 'uint16', - name: 'observationIndex', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'observationCardinality', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'observationCardinalityNext', - type: 'uint16', - }, - { - internalType: 'uint8', - name: 'feeProtocol', - type: 'uint8', - }, - { internalType: 'bool', name: 'unlocked', type: 'bool' }, - ], - stateMutability: 'view', - type: 'function', - }, - ], - functionName: 'slot0', - }) as const, - ), + const multicallMemoize = await memoizer.fn(this.client.multicall); + + const slot0Data = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: [ + { + inputs: [], + name: 'slot0', + outputs: [ + { + internalType: 'uint160', + name: 'sqrtPriceX96', + type: 'uint160', + }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { + internalType: 'uint16', + name: 'observationIndex', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinality', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinalityNext', + type: 'uint16', + }, + { + internalType: 'uint8', + name: 'feeProtocol', + type: 'uint8', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'slot0', + }) as const, + ), + } + const slot0 = options?.memoize + ? await (multicallMemoize(slot0Data) as Promise) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined }) + : await this.client.multicall(slot0Data) .catch((e) => { console.warn( `${this.getLogPrefix()} - INIT: multicall failed, message: ${ @@ -162,10 +178,11 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { if (existingPools.length === 0) return - const liquidityContracts = this.client.multicall({ + const liquidityContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: existingPools.map( (pool) => ({ @@ -185,12 +202,24 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'liquidity', }) as const, ), - }) - - const token0Contracts = this.client.multicall({ + } + const liquidityContracts: Promise<({ + error?: undefined; + result: bigint; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[]> = options?.memoize + ? multicallMemoize(liquidityContractsData) as Promise + : this.client.multicall(liquidityContractsData) + + const token0ContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: existingPools.map( (pool) => ({ @@ -201,12 +230,24 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'balanceOf', }) as const, ), - }) - - const token1Contracts = this.client.multicall({ + } + const token0Contracts: Promise<({ + error: Error; + result?: undefined; + status: "failure"; + } | { + error?: undefined; + result: bigint; + status: "success"; + })[]> = options?.memoize + ? multicallMemoize(token0ContractsData) as Promise + : this.client.multicall(token0ContractsData) + + const token1ContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: existingPools.map( (pool) => ({ @@ -217,7 +258,18 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'balanceOf', }) as const, ), - }) + } + const token1Contracts: Promise<({ + error?: undefined; + result: bigint; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[]> = options?.memoize + ? multicallMemoize(token1ContractsData) as Promise + : this.client.multicall(token1ContractsData) const minIndexes = existingPools.map((pool) => bitmapIndex( @@ -242,6 +294,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ).flatMap((j) => ({ chainId: this.chainId, address: this.tickLens[ + // @ts-ignore this.chainId as keyof typeof this.tickLens ] as Address, args: [pool.address, j] as const, @@ -251,12 +304,28 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { })) }) - const ticksContracts = this.client.multicall({ + const ticksContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, contracts: wordList, - }) + blockNumber: options?.blockNumber, + } + const ticksContracts: Promise<({ + error?: undefined; + result: readonly { + tick: number; + liquidityNet: bigint; + liquidityGross: bigint; + }[]; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[]> = options?.memoize + ? multicallMemoize(ticksContractsData) as Promise + : this.client.multicall(ticksContractsData) const [liquidityResults, token0Balances, token1Balances, tickResults] = await Promise.all([ diff --git a/packages/sushi/src/router/static-pool-fetcher/Trident.ts b/packages/sushi/src/router/static-pool-fetcher/Trident.ts index ecd3038b7e..05851f6ae2 100644 --- a/packages/sushi/src/router/static-pool-fetcher/Trident.ts +++ b/packages/sushi/src/router/static-pool-fetcher/Trident.ts @@ -12,6 +12,8 @@ import { } from '../../config/index.js' import { Currency, Token } from '../../currency/index.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { memoizer } from '../memoizer.js' export interface TridentStaticPool { address: Address @@ -27,10 +29,11 @@ export class TridentStaticPoolFetcher { chainId: ChainId, t1: Token, t2: Token, + options?: DataFetcherOptions, ): Promise<[TridentStaticPool[], TridentStaticPool[]]> { const pools = await Promise.all([ - this.getPools(client, chainId, t1, t2, 'CONSTANT_PRODUCT_POOL'), - this.getPools(client, chainId, t1, t2, 'STABLE_POOL'), + this.getPools(client, chainId, t1, t2, 'CONSTANT_PRODUCT_POOL', options), + this.getPools(client, chainId, t1, t2, 'STABLE_POOL', options), ]) return pools @@ -42,6 +45,7 @@ export class TridentStaticPoolFetcher { t1: Token, t2: Token, type: 'STABLE_POOL' | 'CONSTANT_PRODUCT_POOL', + options?: DataFetcherOptions, ) { const currencies = getCurrencyCombinations(chainId, t1, t2) @@ -59,9 +63,12 @@ export class TridentStaticPoolFetcher { chainId as TridentChainId ] as Address) - const callStatePoolsCount = await client.multicall({ + const multicallMemoize = await memoizer.fn(client.multicall); + + const callStatePoolsCountData = { multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: _pairsUniqueAddr.map( (el) => ({ @@ -72,7 +79,18 @@ export class TridentStaticPoolFetcher { args: el as [Address, Address], }) as const, ), - }) + } + const callStatePoolsCount: ({ + error?: undefined; + result: bigint; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[] = options?.memoize + ? await (multicallMemoize(callStatePoolsCountData) as Promise) + : await client.multicall(callStatePoolsCountData) const callStatePoolsCountProcessed = callStatePoolsCount ?.map( @@ -104,9 +122,10 @@ export class TridentStaticPoolFetcher { .filter(([, length]) => length) .map(([i]) => [_pairsUnique[i]![0], _pairsUnique[i]![1]]) - const callStatePools = await client.multicall({ + const callStatePoolsData = { multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: callStatePoolsCountProcessed.map( (args) => ({ @@ -117,7 +136,18 @@ export class TridentStaticPoolFetcher { args, }) as const, ), - }) + } + const callStatePools: ({ + error?: undefined; + result: readonly `0x${string}`[]; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[] = options?.memoize + ? await (multicallMemoize(callStatePoolsData) as Promise) + : await client.multicall(callStatePoolsData) const pools: TridentStaticPool[] = [] callStatePools.forEach((s, i) => { @@ -134,9 +164,10 @@ export class TridentStaticPoolFetcher { const poolsAddresses = pools.map((p) => p.address) - const fees = await client.multicall({ + const feesData = { multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, + blockNumber: options?.blockNumber, contracts: poolsAddresses.map( (address) => ({ @@ -146,7 +177,19 @@ export class TridentStaticPoolFetcher { functionName: 'swapFee', }) as const, ), - }) + } + const fees: ({ + error?: undefined; + result: bigint; + status: "success"; + } | { + error: Error; + result?: undefined; + status: "failure"; + })[] = options?.memoize + ? await (multicallMemoize(feesData) as Promise) + : await client.multicall(feesData) + const results: TridentStaticPool[] = [] pools.forEach((p, i) => { From 331aa98a4f2c0c6bbacb94b6af6a6ae9f7a7d3bd Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 03:32:50 +0000 Subject: [PATCH 016/140] lint --- packages/sushi/src/router/data-fetcher.ts | 8 +- .../liquidity-providers/CurveProvider.ts | 39 ++-- .../liquidity-providers/LiquidityProvider.ts | 4 +- .../src/router/liquidity-providers/Trident.ts | 148 ++++++++------- .../liquidity-providers/UniswapV2Base.ts | 42 +++-- .../liquidity-providers/UniswapV3Base.ts | 148 ++++++++------- .../src/router/static-pool-fetcher/Trident.ts | 69 +++---- packages/sushi/test/tines/snapshots/report | 169 ++---------------- 8 files changed, 251 insertions(+), 376 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 8c88ee3d7e..74c88a6249 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -31,7 +31,7 @@ import type { PoolCode } from './pool-codes/index.js' // options for data fetching, such as pinning block number and memoize export type DataFetcherOptions = { - blockNumber?: bigint, + blockNumber?: bigint memoize?: boolean } @@ -189,9 +189,11 @@ export class DataFetcher { currency0.wrapped, currency1.wrapped, excludePools, - options + options, ) - } catch { /**/ } + } catch { + /**/ + } } } else { const [token0, token1] = diff --git a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts index 176b98a0a3..4c80ac4bec 100644 --- a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts @@ -18,12 +18,12 @@ import { } from '../../currency/index.js' import { Native, Token, Type } from '../../currency/index.js' import { RToken, createCurvePoolsForMultipool } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { memoizer } from '../memoizer.js' import { CurvePoolCode } from '../pool-codes/CurvePool.js' import { PoolCode } from '../pool-codes/PoolCode.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' -import { DataFetcherOptions } from '../data-fetcher.js' -import { memoizer } from '../memoizer.js' const stETH = new Token({ chainId: 1, @@ -386,8 +386,8 @@ export class CurveProvider extends LiquidityProvider { const pools: Map = new Map() let currencyCombinations = getCurrencyCombinations(this.chainId, t0, t1) - const multicallMemoize = await memoizer.fn(this.client.multicall); - + const multicallMemoize = await memoizer.fn(this.client.multicall) + for (let i = 0; currencyCombinations.length > 0; ++i) { const calls = (CURVE_FACTORY_ADDRESSES[this.chainId] ?? []).flatMap( (factory) => @@ -410,16 +410,19 @@ export class CurveProvider extends LiquidityProvider { blockNumber: options?.blockNumber, contracts: calls, } - const newFoundPools: ({ - error?: undefined; - result: `0x${string}`; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[] = options?.memoize - ? await multicallMemoize(newfoundPoolsData) as any + const newFoundPools: ( + | { + error?: undefined + result: `0x${string}` + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] = options?.memoize + ? ((await multicallMemoize(newfoundPoolsData)) as any) : await this.client.multicall(newfoundPoolsData) newFoundPools.forEach((pool, i) => { @@ -451,7 +454,7 @@ export class CurveProvider extends LiquidityProvider { options?: DataFetcherOptions, ): Promise<(number[] | undefined)[]> { if (this.chainId === ChainId.ETHEREUM) { - const multicallMemoize = await memoizer.fn(this.client.multicall); + const multicallMemoize = await memoizer.fn(this.client.multicall) const ratiosData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -492,7 +495,7 @@ export class CurveProvider extends LiquidityProvider { ], } as any const ratios = options?.memoize - ? await multicallMemoize(ratiosData) as any + ? ((await multicallMemoize(ratiosData)) as any) : await this.client.multicall(ratiosData) return pools.map(([poolAddress]) => { @@ -540,7 +543,7 @@ export class CurveProvider extends LiquidityProvider { T >['args'], ) => { - const multicallMemoize = await memoizer.fn(this.client.multicall); + const multicallMemoize = await memoizer.fn(this.client.multicall) const data = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', @@ -555,7 +558,7 @@ export class CurveProvider extends LiquidityProvider { })) as any, } as any return options?.memoize - ? multicallMemoize(data) as any + ? (multicallMemoize(data) as any) : this.client.multicall(data) } // const poolContract = getContract({ diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index ae726a2f66..289465fb94 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -1,8 +1,8 @@ import { PublicClient } from 'viem' import { ChainId, chainShortName } from '../../chain/index.js' import type { Token } from '../../currency/index.js' -import type { PoolCode } from '../pool-codes/index.js' import { DataFetcherOptions } from '../data-fetcher.js' +import type { PoolCode } from '../pool-codes/index.js' export enum LiquidityProviders { SushiSwapV2 = 'SushiSwapV2', @@ -80,7 +80,7 @@ export abstract class LiquidityProvider { t0: Token, t1: Token, excludePools?: Set, - options?: DataFetcherOptions + options?: DataFetcherOptions, ): Promise /** diff --git a/packages/sushi/src/router/liquidity-providers/Trident.ts b/packages/sushi/src/router/liquidity-providers/Trident.ts index 8d4e1c1b22..c8620ff678 100644 --- a/packages/sushi/src/router/liquidity-providers/Trident.ts +++ b/packages/sushi/src/router/liquidity-providers/Trident.ts @@ -23,12 +23,14 @@ import { convertTokenToBento, toShareBI, } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' import { PoolResponse2, filterOnDemandPools, filterTopPools, mapToken, } from '../lib/api.js' +import { memoizer } from '../memoizer.js' import { BentoBridgePoolCode, BentoPoolCode, @@ -39,8 +41,6 @@ import { TridentStaticPoolFetcher, } from '../static-pool-fetcher/Trident.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' -import { DataFetcherOptions } from '../data-fetcher.js' -import { memoizer } from '../memoizer.js' export function convertToNumbers(arr: bigint[]): (number | undefined)[] { return arr.map((a) => { @@ -612,7 +612,7 @@ export class TridentProvider extends LiquidityProvider { this.chainId, t0, t1, - options + options, ) if (excludePools) onDemandClassicPools = (onDemandClassicPools as PoolResponse2[]).filter( @@ -727,7 +727,7 @@ export class TridentProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall); + const multicallMemoize = await memoizer.fn(this.client.multicall) const classicReservesPromiseData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -745,24 +745,24 @@ export class TridentProvider extends LiquidityProvider { ), } const classicReservePromise = options?.memoize - ? (multicallMemoize(classicReservesPromiseData) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : this.client.multicall(classicReservesPromiseData) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, + ? (multicallMemoize(classicReservesPromiseData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, ) - return undefined - }) + : this.client.multicall(classicReservesPromiseData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const stableReservePromiseData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -780,24 +780,24 @@ export class TridentProvider extends LiquidityProvider { ), } const stableReservePromise = options?.memoize - ? (multicallMemoize(stableReservePromiseData) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, + ? (multicallMemoize(stableReservePromiseData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, ) - return undefined - }) - : this.client.multicall(stableReservePromiseData) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + : this.client.multicall(stableReservePromiseData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const totalsPromiseData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -808,9 +808,7 @@ export class TridentProvider extends LiquidityProvider { (b) => ({ args: [b.pool.token0.address as Address], - address: this.bentoBox[ - this.chainId as BentoBoxChainId - ] as Address, + address: this.bentoBox[this.chainId as BentoBoxChainId] as Address, chainId: this.chainId, abi: totalsAbi, functionName: 'totals', @@ -818,24 +816,22 @@ export class TridentProvider extends LiquidityProvider { ), } const totalsPromise = options?.memoize - ? (multicallMemoize(totalsPromiseData) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : this.client.multicall(totalsPromiseData) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + ? (multicallMemoize(totalsPromiseData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : this.client.multicall(totalsPromiseData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const balancesPromiseData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -854,24 +850,22 @@ export class TridentProvider extends LiquidityProvider { ), } const balancesPromise = options?.memoize - ? (multicallMemoize(balancesPromiseData) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : this.client.multicall(balancesPromiseData) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + ? (multicallMemoize(balancesPromiseData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : this.client.multicall(balancesPromiseData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const [classicReserves, stableReserves, totals, balances] = await Promise.all([ diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index 09c7bc06ad..e46987fb8d 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -9,6 +9,7 @@ import { } from '../../config/index.js' import { Token } from '../../currency/index.js' import { ConstantProductRPool, RToken } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { PoolResponse2, @@ -16,10 +17,9 @@ import { filterTopPools, mapToken, } from '../lib/api.js' +import { memoizer } from '../memoizer.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' -import { memoizer } from '../memoizer.js' -import { DataFetcherOptions } from '../data-fetcher.js' interface PoolInfo { poolCode: PoolCode @@ -222,7 +222,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall); + const multicallMemoize = await memoizer.fn(this.client.multicall) const multicallData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -239,25 +239,23 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { }) as const, ), } - const reserves = options?.memoize - ? await (multicallMemoize(multicallData) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(multicallData) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const reserves = options?.memoize + ? await (multicallMemoize(multicallData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(multicallData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) poolCodesToCreate.forEach((poolCode, i) => { const pool = poolCode.pool diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 36584a19a3..334f8328ab 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -5,11 +5,11 @@ import { SushiSwapV3FeeAmount, TICK_SPACINGS } from '../../config/index.js' import { Currency, Token, Type } from '../../currency/index.js' import { computeSushiSwapV3PoolAddress } from '../../pool/index.js' import { RToken, UniV3Pool } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { memoizer } from '../memoizer.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' -import { DataFetcherOptions } from '../data-fetcher.js' -import { memoizer } from '../memoizer.js' interface StaticPool { address: Address @@ -86,7 +86,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - const multicallMemoize = await memoizer.fn(this.client.multicall); + const multicallMemoize = await memoizer.fn(this.client.multicall) const slot0Data = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -140,24 +140,22 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ), } const slot0 = options?.memoize - ? await (multicallMemoize(slot0Data) as Promise) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(slot0Data) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + ? await (multicallMemoize(slot0Data) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(slot0Data).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const existingPools: V3Pool[] = [] @@ -203,16 +201,21 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) as const, ), } - const liquidityContracts: Promise<({ - error?: undefined; - result: bigint; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[]> = options?.memoize - ? multicallMemoize(liquidityContractsData) as Promise + const liquidityContracts: Promise< + ( + | { + error?: undefined + result: bigint + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + > = options?.memoize + ? (multicallMemoize(liquidityContractsData) as Promise) : this.client.multicall(liquidityContractsData) const token0ContractsData = { @@ -231,16 +234,21 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) as const, ), } - const token0Contracts: Promise<({ - error: Error; - result?: undefined; - status: "failure"; - } | { - error?: undefined; - result: bigint; - status: "success"; - })[]> = options?.memoize - ? multicallMemoize(token0ContractsData) as Promise + const token0Contracts: Promise< + ( + | { + error: Error + result?: undefined + status: 'failure' + } + | { + error?: undefined + result: bigint + status: 'success' + } + )[] + > = options?.memoize + ? (multicallMemoize(token0ContractsData) as Promise) : this.client.multicall(token0ContractsData) const token1ContractsData = { @@ -259,16 +267,21 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) as const, ), } - const token1Contracts: Promise<({ - error?: undefined; - result: bigint; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[]> = options?.memoize - ? multicallMemoize(token1ContractsData) as Promise + const token1Contracts: Promise< + ( + | { + error?: undefined + result: bigint + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + > = options?.memoize + ? (multicallMemoize(token1ContractsData) as Promise) : this.client.multicall(token1ContractsData) const minIndexes = existingPools.map((pool) => @@ -311,20 +324,25 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { contracts: wordList, blockNumber: options?.blockNumber, } - const ticksContracts: Promise<({ - error?: undefined; - result: readonly { - tick: number; - liquidityNet: bigint; - liquidityGross: bigint; - }[]; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[]> = options?.memoize - ? multicallMemoize(ticksContractsData) as Promise + const ticksContracts: Promise< + ( + | { + error?: undefined + result: readonly { + tick: number + liquidityNet: bigint + liquidityGross: bigint + }[] + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + > = options?.memoize + ? (multicallMemoize(ticksContractsData) as Promise) : this.client.multicall(ticksContractsData) const [liquidityResults, token0Balances, token1Balances, tickResults] = diff --git a/packages/sushi/src/router/static-pool-fetcher/Trident.ts b/packages/sushi/src/router/static-pool-fetcher/Trident.ts index 05851f6ae2..80dd95d61a 100644 --- a/packages/sushi/src/router/static-pool-fetcher/Trident.ts +++ b/packages/sushi/src/router/static-pool-fetcher/Trident.ts @@ -11,8 +11,8 @@ import { TridentChainId, } from '../../config/index.js' import { Currency, Token } from '../../currency/index.js' -import { getCurrencyCombinations } from '../get-currency-combinations.js' import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' export interface TridentStaticPool { @@ -63,8 +63,8 @@ export class TridentStaticPoolFetcher { chainId as TridentChainId ] as Address) - const multicallMemoize = await memoizer.fn(client.multicall); - + const multicallMemoize = await memoizer.fn(client.multicall) + const callStatePoolsCountData = { multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, @@ -80,15 +80,18 @@ export class TridentStaticPoolFetcher { }) as const, ), } - const callStatePoolsCount: ({ - error?: undefined; - result: bigint; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[] = options?.memoize + const callStatePoolsCount: ( + | { + error?: undefined + result: bigint + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] = options?.memoize ? await (multicallMemoize(callStatePoolsCountData) as Promise) : await client.multicall(callStatePoolsCountData) @@ -137,15 +140,18 @@ export class TridentStaticPoolFetcher { }) as const, ), } - const callStatePools: ({ - error?: undefined; - result: readonly `0x${string}`[]; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[] = options?.memoize + const callStatePools: ( + | { + error?: undefined + result: readonly `0x${string}`[] + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] = options?.memoize ? await (multicallMemoize(callStatePoolsData) as Promise) : await client.multicall(callStatePoolsData) @@ -178,15 +184,18 @@ export class TridentStaticPoolFetcher { }) as const, ), } - const fees: ({ - error?: undefined; - result: bigint; - status: "success"; - } | { - error: Error; - result?: undefined; - status: "failure"; - })[] = options?.memoize + const fees: ( + | { + error?: undefined + result: bigint + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] = options?.memoize ? await (multicallMemoize(feesData) as Promise) : await client.multicall(feesData) diff --git a/packages/sushi/test/tines/snapshots/report b/packages/sushi/test/tines/snapshots/report index 306557668b..f8d28db60a 100644 --- a/packages/sushi/test/tines/snapshots/report +++ b/packages/sushi/test/tines/snapshots/report @@ -1,191 +1,42 @@ 1:"bridge-1": 5528.94 -> 5528.94 (0%) avg:0% 2:"bridge-2": 7663 -> 7663 (0%) avg:0% +151:"top20-150": 0 -> 0 (0%) avg:0% +152:"top20-151": 481 -> 481 (0%) avg:0% 3:"bridge-3": 11953.94 -> 11953.94 (0%) avg:0% 4:"bridge-4": 5496.94 -> 5496.94 (0%) avg:0% 5:"bridge-5-1": 4260.964 -> 4260.964 (0%) avg:0% -2:"top20-1": 1.1195509365387262e+37 -> 1.1195509365387262e+37 (0%) avg:0% 6:"bridge-5-2": 5473.94 -> 5473.94 (0%) avg:0% 7:"bridge-5-3": 5501.94 -> 5501.94 (0%) avg:0% 8:"bridge-5-5": 5528.94 -> 5528.94 (0%) avg:0% 9:"bridge-5-10": 5528.94 -> 5528.94 (0%) avg:0% 10:"bridge-5-30": 5528.94 -> 5528.94 (0%) avg:0% 11:"bridge-5-100": 5528.94 -> 5528.94 (0%) avg:0% -3:"top20-2": 96249232830474440000 -> 96249232830474440000 (0%) avg:0% -4:"top20-3": 467011582838851800000 -> 467011582838851800000 (0%) avg:0% -5:"top20-4": 14263706377454.916 -> 14263706377454.916 (0%) avg:0% 12:"bridge-5-300": 5528.94 -> 5528.94 (0%) avg:0% -6:"top20-5": 111208992328025 -> 111208992328025 (0%) avg:0% -7:"top20-6": 184056193599 -> 184056193599 (0%) avg:0% +153:"top20-152": 0 -> 0 (0%) avg:0% +154:"top20-153": 1.3468577317796694e+32 -> 1.3468577317796694e+32 (0%) avg:0% 13:"bridge-5-1000": 5528.94 -> 5528.94 (0%) avg:0% -8:"top20-7": 1.949010266471403e+21 -> 1.949010266471403e+21 (0%) avg:0% +155:"top20-154": 7978807883992.964 -> 7978807883992.964 (0%) avg:0% 14:"bridge-6": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% +156:"top20-155": 75460.9999999988 -> 75460.9999999988 (0%) avg:0% 15:"bridge-7-1": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 16:"bridge-7-2": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 17:"bridge-7-3": 569.9929597799993 -> 569.9929597799993 (0%) avg:0% -9:"top20-8": 5147698251 -> 5147698251 (0%) avg:0% +157:"top20-156": 1433531033857000200 -> 1433531033857000200 (0%) avg:0% 18:"bridge-7-5": 577.9911997249991 -> 577.9911997249991 (0%) avg:0% 19:"bridge-7-10": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 20:"bridge-7-30": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -10:"top20-9": 2.3146866045567974e+29 -> 2.3146866045567974e+29 (0%) avg:0% -11:"top20-10": 2.000939725061475e+25 -> 2.000939725061475e+25 (0%) avg:0% -21:"bridge-7-100": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -12:"top20-11": 0 -> 0 (0%) avg:0% -22:"bridge-7-300": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -13:"top20-12": 5.998729978399937e+23 -> 5.998729978399937e+23 (0%) avg:0% -14:"top20-13": 14.999999999999975 -> 14.999999999999975 (0%) avg:0% -15:"top20-14": 242561332730 -> 242561332730 (0%) avg:0% -16:"top20-15": 20057219983855420 -> 20057219983855420 (0%) avg:0% -17:"top20-16": 1371193183.507006 -> 1371193183.507006 (0%) avg:0% -18:"top20-17": 618784869519468900000 -> 618784869519468900000 (0%) avg:0% -19:"top20-18": 13965130914 -> 13965130914 (0%) avg:0% -23:"bridge-7-1000": 578.9911997249991 -> 578.9911997249991 (0%) avg:0% -20:"top20-19": 1719221840266011.2 -> 1719221840266011.2 (0%) avg:0% -21:"top20-20": 1.1539072915253164e+27 -> 1.1539072915253164e+27 (0%) avg:0% -22:"top20-21": 1.4857010533172297e+22 -> 1.4857010533172297e+22 (0%) avg:0% -23:"top20-22": 13216695381.96823 -> 13216695381.96823 (0%) avg:0% -24:"top20-23": 71.99999999995467 -> 71.99999999995467 (0%) avg:0% -25:"top20-24": 4.257526126994545e+23 -> 4.257526126994545e+23 (0%) avg:0% -26:"top20-25": 9.20707200216008e+22 -> 9.20707200216008e+22 (0%) avg:0% -27:"top20-26": 119377775 -> 119377775 (0%) avg:0% -28:"top20-27": 4.5396775085904846e+33 -> 4.5396775085904846e+33 (0%) avg:0% -29:"top20-28": 224764614280864 -> 224764614280864 (0%) avg:0% -30:"top20-29": 137910092016871140 -> 137910092016871140 (0%) avg:0% -31:"top20-30": 38414127759.999916 -> 38414127759.999916 (0%) avg:0% -32:"top20-31": 3.9150404497784796e+29 -> 3.9150404497784796e+29 (0%) avg:0% -33:"top20-32": 44939721212060795000 -> 44939721212060795000 (0%) avg:0% -34:"top20-33": 1.4260244914513205e+22 -> 1.4260244914513205e+22 (0%) avg:0% -35:"top20-34": 1.5495747386928312e+21 -> 1.5495747386928312e+21 (0%) avg:0% -36:"top20-35": 943239170088233300000 -> 943239170088233300000 (0%) avg:0% -37:"top20-36": 6121749117436.458 -> 6121749117436.458 (0%) avg:0% -38:"top20-37": 696747 -> 696747 (0%) avg:0% -39:"top20-38": 0 -> 0 (0%) avg:0% -40:"top20-39": 2.3426635283232224e+24 -> 2.3426635283232224e+24 (0%) avg:0% -41:"top20-40": 48254932363.26666 -> 48254932363.26666 (0%) avg:0% -42:"top20-41": 37860138974211.35 -> 37860138974211.35 (0%) avg:0% -43:"top20-42": 6.848076980412381e+22 -> 6.848076980412381e+22 (0%) avg:0% -44:"top20-43": 4320914881 -> 4320914881 (0%) avg:0% -45:"top20-44": 30713427089 -> 30713427089 (0%) avg:0% -46:"top20-45": 198661729955810 -> 198661729955810 (0%) avg:0% -47:"top20-46": 4003462547412852.5 -> 4003462547412852.5 (0%) avg:0% -48:"top20-47": 121585 -> 121585 (0%) avg:0% -49:"top20-48": 0 -> 0 (0%) avg:0% -50:"top20-49": 5.999999999999976 -> 5.999999999999976 (0%) avg:0% -51:"top20-50": 968129348392.8033 -> 968129348392.8033 (0%) avg:0% -52:"top20-51": 17468164450890598000 -> 17468164450890598000 (0%) avg:0% -53:"top20-52": 3370 -> 3370 (0%) avg:0% -54:"top20-53": 2.8669052288613494e+26 -> 2.8669052288613494e+26 (0%) avg:0% -55:"top20-54": 212397690771150670000 -> 212397690771150670000 (0%) avg:0% -56:"top20-55": 114722123950.99864 -> 114722123950.99864 (0%) avg:0% -57:"top20-56": 6237611807.9999895 -> 6237611807.9999895 (0%) avg:0% -58:"top20-57": 173 -> 173 (0%) avg:0% -59:"top20-58": 8.653786678134718e+34 -> 8.653786678134718e+34 (0%) avg:0% -60:"top20-59": 584843.9943957697 -> 584843.9943957697 (0%) avg:0% -61:"top20-60": 83746.99999922093 -> 83746.99999922093 (0%) avg:0% -62:"top20-61": 1.2108029911483686e+28 -> 1.2108029911483686e+28 (0%) avg:0% -63:"top20-62": 1.1321762736810075e+23 -> 1.1321762736810075e+23 (0%) avg:0% -64:"top20-63": 18624850720 -> 18624850720 (0%) avg:0% -65:"top20-64": 6558802213825504000 -> 6558802213825504000 (0%) avg:0% -66:"top20-65": 3006323408104.839 -> 3006323408104.839 (0%) avg:0% -67:"top20-66": 7.25699759360167e+33 -> 7.25699759360167e+33 (0%) avg:0% -68:"top20-67": 26997497976784.977 -> 26997497976784.977 (0%) avg:0% -69:"top20-68": 2.271898658800524e+29 -> 2.271898658800524e+29 (0%) avg:0% -70:"top20-69": 3320690.9992622463 -> 3320690.9992622463 (0%) avg:0% -71:"top20-70": 12137990973481046000 -> 12137990973481046000 (0%) avg:0% -72:"top20-71": 4.2988353121158716e+26 -> 4.2988353121158716e+26 (0%) avg:0% -73:"top20-72": 6.3575495792381146e+28 -> 6.3575495792381146e+28 (0%) avg:0% -74:"top20-73": 1.2313497939167126e+26 -> 1.2313497939167126e+26 (0%) avg:0% -75:"top20-74": 27707599790097 -> 27707599790097 (0%) avg:0% -76:"top20-75": 7124308 -> 7124308 (0%) avg:0% -77:"top20-76": 0 -> 0 (0%) avg:0% -78:"top20-77": 117608543724585440000 -> 117608543724585440000 (0%) avg:0% -79:"top20-78": 274576852204457 -> 274576852204457 (0%) avg:0% -80:"top20-79": 4.1679251723404575e+23 -> 4.1679251723404575e+23 (0%) avg:0% -81:"top20-80": 1.169123327125618e+23 -> 1.169123327125618e+23 (0%) avg:0% -82:"top20-81": 1.256638691159724e+26 -> 1.256638691159724e+26 (0%) avg:0% -83:"top20-82": 0 -> 0 (0%) avg:0% -84:"top20-83": 2.0149283251435153e+32 -> 2.0149283251435153e+32 (0%) avg:0% -85:"top20-84": 6.510078466693012e+35 -> 6.510078466693012e+35 (0%) avg:0% -86:"top20-85": 0 -> 0 (0%) avg:0% -87:"top20-86": 541712645104171 -> 541712645104171 (0%) avg:0% -88:"top20-87": 2935458414464351700 -> 2935458414464351700 (0%) avg:0% -89:"top20-88": 1672225 -> 1672225 (0%) avg:0% -90:"top20-89": 0 -> 0 (0%) avg:0% -91:"top20-90": 0 -> 0 (0%) avg:0% -92:"top20-91": 98143784 -> 98143784 (0%) avg:0% -93:"top20-92": 8692029076033.435 -> 8692029076033.435 (0%) avg:0% -94:"top20-93": 51562257056054440 -> 51562257056054440 (0%) avg:0% -95:"top20-94": 25641964396823.965 -> 25641964396823.965 (0%) avg:0% -96:"top20-95": 526418678128563400 -> 526418678128563400 (0%) avg:0% -97:"top20-96": 42011945995000000 -> 42011945995000000 (0%) avg:0% -98:"top20-97": 0 -> 0 (0%) avg:0% -99:"top20-98": 578210769514157600 -> 578210769514157600 (0%) avg:0% -100:"top20-99": 23757288573225 -> 23757288573225 (0%) avg:0% -101:"top20-100": 3519054200.963973 -> 3519054200.963973 (0%) avg:0% -102:"top20-101": 1.2366902841804613e+26 -> 1.2366902841804613e+26 (0%) avg:0% -103:"top20-102": 3.0616038596056797e+32 -> 3.0616038596056797e+32 (0%) avg:0% -104:"top20-103": 398198791124206 -> 398198791124206 (0%) avg:0% -105:"top20-104": 3434281999000000 -> 3434281999000000 (0%) avg:0% -106:"top20-105": 436386366610963040000 -> 436386366610963040000 (0%) avg:0% -107:"top20-106": 7814 -> 7814 (0%) avg:0% -108:"top20-107": 4.387432445585929e+34 -> 4.387432445585929e+34 (0%) avg:0% -109:"top20-108": 0 -> 0 (0%) avg:0% -110:"top20-109": 0 -> 0 (0%) avg:0% -111:"top20-110": 180771390372608.16 -> 180771390372608.16 (0%) avg:0% -112:"top20-111": 1.53356324718735e+23 -> 1.53356324718735e+23 (0%) avg:0% -113:"top20-112": 0 -> 0 (0%) avg:0% -114:"top20-113": 441807728976948040000 -> 441807728976948040000 (0%) avg:0% -115:"top20-114": 5.872905678780656e+30 -> 5.872905678780656e+30 (0%) avg:0% -116:"top20-115": 1.9999999999999998 -> 1.9999999999999998 (0%) avg:0% -117:"top20-116": 0 -> 0 (0%) avg:0% -118:"top20-117": 103625.91934739704 -> 103625.91934739704 (0%) avg:0% -119:"top20-118": 3994 -> 3994 (0%) avg:0% -120:"top20-119": 5481554822 -> 5481554822 (0%) avg:0% -121:"top20-120": 2148662632935361000 -> 2148662632935361000 (0%) avg:0% -122:"top20-121": 780768139203693200000 -> 780768139203693200000 (0%) avg:0% -123:"top20-122": 0 -> 0 (0%) avg:0% -124:"top20-123": 74390557839848180 -> 74390557839848180 (0%) avg:0% -125:"top20-124": 5.2767009412144705e+23 -> 5.2767009412144705e+23 (0%) avg:0% -126:"top20-125": 12999322599.999998 -> 12999322599.999998 (0%) avg:0% -127:"top20-126": 1.166563599584172e+25 -> 1.166563599584172e+25 (0%) avg:0% -128:"top20-127": 0 -> 0 (0%) avg:0% -129:"top20-128": 2.381239814048817e+29 -> 2.381239814048817e+29 (0%) avg:0% -130:"top20-129": 1.773617547666896e+21 -> 1.773617547666896e+21 (0%) avg:0% -131:"top20-130": 1043374941775 -> 1043374941775 (0%) avg:0% -132:"top20-131": 3 -> 3 (0%) avg:0% -133:"top20-132": 3523544256 -> 3523544256 (0%) avg:0% -134:"top20-133": 30660569440069612 -> 30660569440069612 (0%) avg:0% -135:"top20-134": 0 -> 0 (0%) avg:0% -136:"top20-135": 46215289309 -> 46215289309 (0%) avg:0% -137:"top20-136": 157666012290841060 -> 157666012290841060 (0%) avg:0% -138:"top20-137": 0 -> 0 (0%) avg:0% -139:"top20-138": 94486154517 -> 94486154517 (0%) avg:0% -140:"top20-139": 5381047.578903644 -> 5381047.578903644 (0%) avg:0% -141:"top20-140": 2904868891031402 -> 2904868891031402 (0%) avg:0% -142:"top20-141": 349815735970433660000 -> 349815735970433660000 (0%) avg:0% -143:"top20-142": 1.61321284630438e+29 -> 1.61321284630438e+29 (0%) avg:0% -144:"top20-143": 0 -> 0 (0%) avg:0% -145:"top20-144": 1.8715935050611244e+27 -> 1.8715935050611244e+27 (0%) avg:0% -146:"top20-145": 2329.999987331977 -> 2329.999987331977 (0%) avg:0% -147:"top20-146": 1.5754421469670991e+28 -> 1.5754421469670991e+28 (0%) avg:0% -148:"top20-147": 2.6838048385825768e+32 -> 2.6838048385825768e+32 (0%) avg:0% -149:"top20-148": 2.7141809250137436e+32 -> 2.7141809250137436e+32 (0%) avg:0% -150:"top20-149": 17399664148369718 -> 17399664148369718 (0%) avg:0% -151:"top20-150": 0 -> 0 (0%) avg:0% -152:"top20-151": 481 -> 481 (0%) avg:0% -153:"top20-152": 0 -> 0 (0%) avg:0% -154:"top20-153": 1.3468577317796694e+32 -> 1.3468577317796694e+32 (0%) avg:0% -155:"top20-154": 7978807883992.964 -> 7978807883992.964 (0%) avg:0% -156:"top20-155": 75460.9999999988 -> 75460.9999999988 (0%) avg:0% -157:"top20-156": 1433531033857000200 -> 1433531033857000200 (0%) avg:0% 158:"top20-157": 5729885219 -> 5729885219 (0%) avg:0% +21:"bridge-7-100": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 159:"top20-158": 3.5295876698920206e+21 -> 3.5295876698920206e+21 (0%) avg:0% 160:"top20-159": 2752089826200724500 -> 2752089826200724500 (0%) avg:0% 161:"top20-160": 1.3721043284746797e+27 -> 1.3721043284746797e+27 (0%) avg:0% 162:"top20-161": 2628873 -> 2628873 (0%) avg:0% +22:"bridge-7-300": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 163:"top20-162": 0 -> 0 (0%) avg:0% 164:"top20-163": 7.139942836800165e+35 -> 7.139942836800165e+35 (0%) avg:0% 165:"top20-164": 588671138.9993676 -> 588671138.9993676 (0%) avg:0% 166:"top20-165": 141491517.99997458 -> 141491517.99997458 (0%) avg:0% +23:"bridge-7-1000": 578.9911997249991 -> 578.9911997249991 (0%) avg:0% 167:"top20-166": 9.906334905865037e+36 -> 9.906334905865037e+36 (0%) avg:0% 168:"top20-167": 6.127970056928261e+23 -> 6.127970056928261e+23 (0%) avg:0% 169:"top20-168": 0 -> 0 (0%) avg:0% From 7b38c83858c268dc8ac87f9acf7c2a221f9af4c3 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 04:10:29 +0000 Subject: [PATCH 017/140] Update data-fetcher.ts --- packages/sushi/src/router/data-fetcher.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 74c88a6249..7f5e56294b 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -31,7 +31,13 @@ import type { PoolCode } from './pool-codes/index.js' // options for data fetching, such as pinning block number and memoize export type DataFetcherOptions = { + /** + * The pinned block number when getting onchain data + * this option is usefull for reproducing the route, + * price, etc of a certain block + */ blockNumber?: bigint + /** Determines if memoizer should be used or not */ memoize?: boolean } From ca5ba8654ba08d19502c548615a08647680680ac Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:31:00 +0000 Subject: [PATCH 018/140] add new dexes --- .gitignore | 1 + packages/sushi/src/router/data-fetcher.ts | 50 +++++++++++-- .../{PancakeSwap.ts => BaseSwap.ts} | 15 ++-- .../src/router/liquidity-providers/Biswap.ts | 1 - .../router/liquidity-providers/BlastDEX.ts | 24 +++++++ .../src/router/liquidity-providers/Camelot.ts | 28 ++++++++ .../src/router/liquidity-providers/DyorV2.ts | 27 +++++++ .../src/router/liquidity-providers/Enosys.ts | 71 +++++++++++++++++++ .../router/liquidity-providers/HyperBlast.ts | 24 +++++++ .../router/liquidity-providers/KinetixV2.ts | 24 +++++++ .../router/liquidity-providers/KinetixV3.ts | 26 +++++++ .../liquidity-providers/LiquidityProvider.ts | 8 ++- .../router/liquidity-providers/MonoSwapV2.ts | 24 +++++++ .../router/liquidity-providers/MonoSwapV3.ts | 26 +++++++ .../liquidity-providers/PancakeSwapV2.ts | 42 +++++++++++ .../liquidity-providers/PancakeSwapV3.ts | 50 +++++++++++++ .../router/liquidity-providers/Solarbeam.ts | 23 ++++++ .../{SpookySwap.ts => SpookySwapV2.ts} | 6 +- .../liquidity-providers/SpookySwapV3.ts | 26 +++++++ .../router/liquidity-providers/SwapBlast.ts | 24 +++++++ .../router/liquidity-providers/ThrusterV2.ts | 44 ++++++++++++ .../router/liquidity-providers/ThrusterV3.ts | 26 +++++++ .../router/liquidity-providers/TraderJoe.ts | 6 ++ .../router/liquidity-providers/UniswapV2.ts | 21 ++++++ .../liquidity-providers/UniswapV2Base.ts | 13 ++-- .../router/liquidity-providers/VVSStandard.ts | 23 ++++++ .../src/router/liquidity-providers/Wagmi.ts | 42 +++++++++++ packages/sushi/src/router/memoizer.test.ts | 13 +++- packages/sushi/src/router/memoizer.ts | 4 +- 29 files changed, 682 insertions(+), 30 deletions(-) rename packages/sushi/src/router/liquidity-providers/{PancakeSwap.ts => BaseSwap.ts} (51%) create mode 100644 packages/sushi/src/router/liquidity-providers/BlastDEX.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Camelot.ts create mode 100644 packages/sushi/src/router/liquidity-providers/DyorV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Enosys.ts create mode 100644 packages/sushi/src/router/liquidity-providers/HyperBlast.ts create mode 100644 packages/sushi/src/router/liquidity-providers/KinetixV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/KinetixV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Solarbeam.ts rename packages/sushi/src/router/liquidity-providers/{SpookySwap.ts => SpookySwapV2.ts} (82%) create mode 100644 packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/SwapBlast.ts create mode 100644 packages/sushi/src/router/liquidity-providers/ThrusterV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/ThrusterV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/VVSStandard.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Wagmi.ts diff --git a/.gitignore b/.gitignore index a3f851728c..756ce12afc 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ exports # cache cache mem-cache +test-cache # generated generated diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 7f5e56294b..d769720ef3 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -3,30 +3,51 @@ import { ChainId, TestnetChainId } from '../chain/index.js' import { publicClientConfig } from '../config/index.js' import { Type } from '../currency/index.js' import { ApeSwapProvider } from './liquidity-providers/ApeSwap.js' +import { BaseSwapProvider } from './liquidity-providers/BaseSwap.js' import { BiswapProvider } from './liquidity-providers/Biswap.js' +import { BlastDEXProvider } from './liquidity-providers/BlastDEX.js' +import { CamelotProvider } from './liquidity-providers/Camelot.js' import { CurveProvider } from './liquidity-providers/CurveProvider.js' import { DfynProvider } from './liquidity-providers/Dfyn.js' import { DovishV3Provider } from './liquidity-providers/DovishV3.js' +import { DyorV2Provider } from './liquidity-providers/DyorV2.js' import { ElkProvider } from './liquidity-providers/Elk.js' +import { EnosysProvider } from './liquidity-providers/Enosys.js' import { HoneySwapProvider } from './liquidity-providers/HoneySwap.js' +import { HyperBlastProvider } from './liquidity-providers/HyperBlast.js' import { JetSwapProvider } from './liquidity-providers/JetSwap.js' +import { KinetixV2Provider } from './liquidity-providers/KinetixV2.js' +import { KinetixV3Provider } from './liquidity-providers/KinetixV3.js' import { LaserSwapV2Provider } from './liquidity-providers/LaserSwap.js' import { LiquidityProvider, LiquidityProviders, } from './liquidity-providers/LiquidityProvider.js' +import { MonoswapV2Provider } from './liquidity-providers/MonoSwapV2.js' +import { MonoswapV3Provider } from './liquidity-providers/MonoSwapV3.js' import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' import { NetSwapProvider } from './liquidity-providers/NetSwap.js' -import { PancakeSwapProvider } from './liquidity-providers/PancakeSwap.js' +import { PancakeSwapV2Provider } from './liquidity-providers/PancakeSwapV2.js' +import { PancakeSwapV3Provider } from './liquidity-providers/PancakeSwapV3.js' import { QuickSwapProvider } from './liquidity-providers/QuickSwap.js' -import { SpookySwapProvider } from './liquidity-providers/SpookySwap.js' +import { SolarbeamProvider } from './liquidity-providers/Solarbeam.js' +import { SpookySwapV2Provider } from './liquidity-providers/SpookySwapV2.js' +import { SpookySwapV3Provider } from './liquidity-providers/SpookySwapV3.js' import { SushiSwapV2Provider } from './liquidity-providers/SushiSwapV2.js' import { SushiSwapV3Provider } from './liquidity-providers/SushiSwapV3.js' +import { SwapBlastProvider } from './liquidity-providers/SwapBlast.js' +import { + ThrusterV2_1Provider, + ThrusterV2_3Provider, +} from './liquidity-providers/ThrusterV2.js' +import { ThrusterV3Provider } from './liquidity-providers/ThrusterV3.js' import { TraderJoeProvider } from './liquidity-providers/TraderJoe.js' import { TridentProvider } from './liquidity-providers/Trident.js' import { UbeSwapProvider } from './liquidity-providers/UbeSwap.js' import { UniswapV2Provider } from './liquidity-providers/UniswapV2.js' import { UniswapV3Provider } from './liquidity-providers/UniswapV3.js' +import { VVSStandardProvider } from './liquidity-providers/VVSStandard.js' +import { WagmiProvider } from './liquidity-providers/Wagmi.js' import type { PoolCode } from './pool-codes/index.js' // options for data fetching, such as pinning block number and memoize @@ -123,25 +144,44 @@ export class DataFetcher { this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] ;[ ApeSwapProvider, + BaseSwapProvider, BiswapProvider, + BlastDEXProvider, + CamelotProvider, CurveProvider, DfynProvider, DovishV3Provider, + DyorV2Provider, ElkProvider, + EnosysProvider, HoneySwapProvider, + HyperBlastProvider, JetSwapProvider, + KinetixV2Provider, + KinetixV3Provider, LaserSwapV2Provider, + MonoswapV2Provider, + MonoswapV3Provider, NetSwapProvider, - PancakeSwapProvider, - SpookySwapProvider, + PancakeSwapV2Provider, + PancakeSwapV3Provider, + QuickSwapProvider, + SolarbeamProvider, + SpookySwapV2Provider, + SpookySwapV3Provider, SushiSwapV2Provider, SushiSwapV3Provider, + SwapBlastProvider, + ThrusterV2_1Provider, + ThrusterV2_3Provider, + ThrusterV3Provider, TraderJoeProvider, - QuickSwapProvider, TridentProvider, UbeSwapProvider, UniswapV2Provider, UniswapV3Provider, + VVSStandardProvider, + WagmiProvider, ].forEach((p) => { try { const provider = new p(this.chainId, this.web3Client) diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwap.ts b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts similarity index 51% rename from packages/sushi/src/router/liquidity-providers/PancakeSwap.ts rename to packages/sushi/src/router/liquidity-providers/BaseSwap.ts index e12d78af9d..3f3ce6591c 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts @@ -3,25 +3,22 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class PancakeSwapProvider extends UniswapV2BaseProvider { +export class BaseSwapProvider extends UniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.ETHEREUM]: '0x1097053Fd2ea711dad45caCcc45EfF7548fCB362', - [ChainId.BSC]: '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73', + [ChainId.BASE]: '0xFDa619b6d20975be80A10332cD39b9a4b0FAa8BB', } as const const initCodeHash = { - [ChainId.ETHEREUM]: - '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', - [ChainId.BSC]: - '0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5', + [ChainId.BASE]: + '0xb618a2730fae167f5f8ac7bd659dd8436d571872655bcb6fd11f2158c8a64a3b', } as const super(chainId, web3Client, factory, initCodeHash) } getType(): LiquidityProviders { - return LiquidityProviders.PancakeSwap + return LiquidityProviders.BaseSwap } getPoolProviderName(): string { - return 'PancakeSwap' + return 'BaseSwap' } } diff --git a/packages/sushi/src/router/liquidity-providers/Biswap.ts b/packages/sushi/src/router/liquidity-providers/Biswap.ts index 94291d30a0..55f89fd348 100644 --- a/packages/sushi/src/router/liquidity-providers/Biswap.ts +++ b/packages/sushi/src/router/liquidity-providers/Biswap.ts @@ -1,6 +1,5 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' - import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' diff --git a/packages/sushi/src/router/liquidity-providers/BlastDEX.ts b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts new file mode 100644 index 0000000000..b8742e1324 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class BlastDEXProvider extends UniswapV2BaseProvider { + override fee = 0.002 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x66346aac17d0e61156AC5F2A934ccF2a9BDe4c65', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x376acff9b60b853f5ccc9f1caecb8dcf722793593330ac58aac8a880a3eb8b9e', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.BlastDEX + } + getPoolProviderName(): string { + return 'BlastDEX' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts new file mode 100644 index 0000000000..a70e4ac029 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -0,0 +1,28 @@ +import { PublicClient, parseAbi } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class CamelotProvider extends UniswapV2BaseProvider { + // Camelot has a slightly different getReserves() abi + // so needs to be overriden + override getReservesAbi = parseAbi([ + 'function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint16 _token0FeePercent, uint16 _token1FeePercent)', + ]) + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ARBITRUM]: '0x6EcCab422D763aC031210895C81787E87B43A652', + } as const + const initCodeHash = { + [ChainId.ARBITRUM]: + '0xa856464ae65f7619087bc369daaf7e387dae1e5af69cfa7935850ebf754b04c1', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.Camelot + } + getPoolProviderName(): string { + return 'Camelot' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/DyorV2.ts b/packages/sushi/src/router/liquidity-providers/DyorV2.ts new file mode 100644 index 0000000000..e5ef032432 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/DyorV2.ts @@ -0,0 +1,27 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class DyorV2Provider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0xA1da7a7eB5A858da410dE8FBC5092c2079B58413', + [ChainId.ZETACHAIN]: '0xA1da7a7eB5A858da410dE8FBC5092c2079B58413', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xda2f1a903916d7de88d9357d27d763f123502a5d48e3b229d5fa049b3ffdeeb5', + [ChainId.ZETACHAIN]: + '0xda2f1a903916d7de88d9357d27d763f123502a5d48e3b229d5fa049b3ffdeeb5', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.DyorV2 + } + getPoolProviderName(): string { + return 'DyorV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts new file mode 100644 index 0000000000..fccdb613fd --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -0,0 +1,71 @@ +import { getCreate2Address } from '@ethersproject/address' +import { Address, PublicClient, encodePacked, keccak256 } from 'viem' +import { ChainId } from '../../chain/index.js' + +import { Token } from '../../currency/Token.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' + +// Enosys has different initCodeHash, so it is required to override the pool address +// calculations methods to use all the available initCodeHashes +export class EnosysProvider extends UniswapV2BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FLARE]: '0x28b70f6Ed97429E40FE9a9CD3EB8E86BCBA11dd4', + } as const + const initCodeHash = { + [ChainId.FLARE]: [ + '0x99e82d1f1ab2914f983fb7f2b987a3e30a55ad1fa8c38239d1f7c1a24fb93e3d', + '0xa1ab3f6a293fb82d68afb63ad2a5352fc49d5f3dfa28b151a85c382a91dd574b', + ], + } as const + super(chainId, web3Client, factory, initCodeHash as any) + } + getType(): LiquidityProviders { + return LiquidityProviders.Enosys + } + getPoolProviderName(): string { + return 'Enosys' + } + + // uses all availbale initCodeHashes to return array of calculated pool addresses + _getPoolAddresses(t1: Token, t2: Token): Address[] { + return (this.initCodeHash[this.chainId] as any as string[]).map( + (initCodeHash) => { + return getCreate2Address( + this.factory[this.chainId as keyof typeof this.factory]!, + keccak256( + encodePacked( + ['address', 'address'], + [t1.address as Address, t2.address as Address], + ), + ), + initCodeHash, + ) as Address + }, + ) + } + + // override the original method to just flatMap() the calculated pool addresses + // instead of map() as in original method one pool address is calculated + override getStaticPools(t1: Token, t2: Token): StaticPool[] { + const currencyCombination = getCurrencyCombinations( + this.chainId, + t1, + t2, + ).map(([c0, c1]) => (c0.sortsBefore(c1) ? [c0, c1] : [c1, c0])) + return currencyCombination.flatMap((combination) => { + const poolAddresses = this._getPoolAddresses( + combination[0]!, + combination[1]!, + ) + return poolAddresses.map((poolAddress) => ({ + address: poolAddress, + token0: combination[0]!, + token1: combination[1]!, + fee: this.fee, + })) + }) + } +} diff --git a/packages/sushi/src/router/liquidity-providers/HyperBlast.ts b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts new file mode 100644 index 0000000000..e4460650a0 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class HyperBlastProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0xD97fFc2041a8aB8f6bc4aeE7eE8ECA485381D088', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x2e6ab686c26cf8ecf0a8c01a9fb0ef96dbd4631c04b03005350fa49e8f2f32f8', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.HyperBlast + } + getPoolProviderName(): string { + return 'HyperBlast' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV2.ts b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts new file mode 100644 index 0000000000..1cf407d8b2 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class KinetixV2Provider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.KAVA]: '0xE8E917BC80A26CDacc9aA42C0F4965d2E1Fa52da', + } as const + const initCodeHash = { + [ChainId.KAVA]: + '0x4b61b80b5bcfca0f9202f2aba1955b0cfda155e379cb36e0ab38598337c4c79a', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.KinetixV2 + } + getPoolProviderName(): string { + return 'KinetixV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV3.ts b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts new file mode 100644 index 0000000000..b7591e9e68 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class KinetixV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.KAVA]: '0x2dBB6254231C5569B6A4313c6C1F5Fe1340b35C2', + } as const + const initCodeHash = { + [ChainId.KAVA]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.KAVA]: '0xdc7A5276aB4C6cd25e16b6118B230109945D2426', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.KinetixV3 + } + getPoolProviderName(): string { + return 'KinetixV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 289465fb94..52d08aa769 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -12,13 +12,14 @@ export enum LiquidityProviders { Trident = 'Trident', QuickSwap = 'QuickSwap', ApeSwap = 'ApeSwap', - PancakeSwap = 'PancakeSwap', + PancakeSwapV2 = 'PancakeSwapV2', PancakeSwapV3 = 'PancakeSwapV3', TraderJoe = 'TraderJoe', Dfyn = 'Dfyn', Elk = 'Elk', JetSwap = 'JetSwap', - SpookySwap = 'SpookySwap', + SpookySwapV2 = 'SpookySwapV2', + SpookySwapV3 = 'SpookySwapV3', NetSwap = 'NetSwap', NativeWrap = 'NativeWrap', HoneySwap = 'HoneySwap', @@ -42,7 +43,10 @@ export enum LiquidityProviders { ThrusterV3 = 'ThrusterV3', DyorV2 = 'DyorV2', HyperBlast = 'HyperBlast', + KinetixV2 = 'KinetixV2', KinetixV3 = 'KinetixV3', + Camelot = 'Camelot', + Enosys = 'Enosys', } export abstract class LiquidityProvider { diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts new file mode 100644 index 0000000000..c59c7f9731 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class MonoswapV2Provider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0xE27cb06A15230A7480d02956a3521E78C5bFD2D0', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xd1a99f7339108abbcc2eaa6478ee4a0394e2a63f04de08793721fb2f3eff5a38', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.MonoswapV2 + } + getPoolProviderName(): string { + return 'MonoswapV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts new file mode 100644 index 0000000000..6ebf4d9855 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class MonoswapV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x48d0F09710794313f33619c95147F34458BF7C3b', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x7ea070216c7d9135010a36147394687bab92df4695e924000eed7c4b33eb922f', + } as const + const tickLens = { + [ChainId.BLAST]: '0x4a3930837f6E721A6Da5DE4E400A7e90f907fb54', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.MonoswapV3 + } + getPoolProviderName(): string { + return 'MonoswapV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts new file mode 100644 index 0000000000..932153c887 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts @@ -0,0 +1,42 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class PancakeSwapV2Provider extends UniswapV2BaseProvider { + override fee = 0.0025 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0x1097053Fd2ea711dad45caCcc45EfF7548fCB362', + [ChainId.BSC]: '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73', + [ChainId.POLYGON_ZKEVM]: '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E', + [ChainId.ZKSYNC_ERA]: '0xd03D8D566183F0086d8D09A84E1e30b58Dd5619d', + [ChainId.ARBITRUM]: '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E', + [ChainId.LINEA]: '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E', + [ChainId.BASE]: '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', + [ChainId.BSC]: + '0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5', + [ChainId.POLYGON_ZKEVM]: + '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', + [ChainId.ZKSYNC_ERA]: + '0x1cb011040b91cd937ddff2327f17c9690653b05b6506e830baadf2493468d657', + [ChainId.ARBITRUM]: + '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', + [ChainId.LINEA]: + '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', + [ChainId.BASE]: + '0x57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.PancakeSwapV2 + } + getPoolProviderName(): string { + return 'PancakeSwapV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts new file mode 100644 index 0000000000..a252c0d7c6 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -0,0 +1,50 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class PancakeSwapV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ARBITRUM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.BASE]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.BSC]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.ETHEREUM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.LINEA]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.POLYGON_ZKEVM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', + [ChainId.ZKSYNC_ERA]: '0x1BB72E0CbbEA93c08f535fc7856E0338D7F7a8aB', + } as const + const initCodeHash = { + [ChainId.ARBITRUM]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.BASE]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.BSC]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.ETHEREUM]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.LINEA]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.POLYGON_ZKEVM]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.ZKSYNC_ERA]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + } as const + const tickLens = { + [ChainId.ARBITRUM]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.BASE]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.BSC]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.ETHEREUM]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.LINEA]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.POLYGON_ZKEVM]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.ZKSYNC_ERA]: '0x7b08978FA77910f77d273c353C62b5BFB9E6D17B', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.PancakeSwapV3 + } + getPoolProviderName(): string { + return 'PancackeSwapV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts new file mode 100644 index 0000000000..3382b209e2 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts @@ -0,0 +1,23 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class SolarbeamProvider extends UniswapV2BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.MOONBEAM]: '0x19B85ae92947E0725d5265fFB3389e7E4F191FDa', + } as const + const initCodeHash = { + [ChainId.MOONBEAM]: + '0x9a100ded5f254443fbd264cb7e87831e398a8b642e061670a9bc35ba27293dbf', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.Solarbeam + } + getPoolProviderName(): string { + return 'Solarbeam' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwap.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts similarity index 82% rename from packages/sushi/src/router/liquidity-providers/SpookySwap.ts rename to packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts index 66fbcbb760..0c94b57638 100644 --- a/packages/sushi/src/router/liquidity-providers/SpookySwap.ts +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts @@ -3,7 +3,7 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SpookySwapProvider extends UniswapV2BaseProvider { +export class SpookySwapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FANTOM]: '0x152eE697f2E276fA89E96742e9bB9aB1F2E61bE3', @@ -15,9 +15,9 @@ export class SpookySwapProvider extends UniswapV2BaseProvider { super(chainId, web3Client, factory, initCodeHash) } getType(): LiquidityProviders { - return LiquidityProviders.SpookySwap + return LiquidityProviders.SpookySwapV2 } getPoolProviderName(): string { - return 'SpookySwap' + return 'SpookySwapV2' } } diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts new file mode 100644 index 0000000000..69d1f34c0e --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class SpookySwapV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FANTOM]: '0x7928a2c48754501f3a8064765ECaE541daE5c3E6', + } as const + const initCodeHash = { + [ChainId.FANTOM]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.FANTOM]: '0xbaA8353CC9d02733eF12f9556ed999521f6E554c', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.SpookySwapV3 + } + getPoolProviderName(): string { + return 'SpookySwapV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/SwapBlast.ts b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts new file mode 100644 index 0000000000..4f04bd000b --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class SwapBlastProvider extends UniswapV2BaseProvider { + override fee = 0.001 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x04C9f118d21e8B767D2e50C946f0cC9F6C367300', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x89f2ba5c4e1e84307b0efac8ff56efab2786d9becd741ff83b1b6397de76dafc', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.SwapBlast + } + getPoolProviderName(): string { + return 'SwapBlast' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts new file mode 100644 index 0000000000..b1cfad438b --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts @@ -0,0 +1,44 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class ThrusterV2_3Provider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0xb4A7D971D0ADea1c73198C97d7ab3f9CE4aaFA13', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x6f0346418750a1a53597a51ceff4f294b5f0e87f09715525b519d38ad3fab2cb', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.ThrusterV2 + } + getPoolProviderName(): string { + return 'ThrusterV2' + } +} + +export class ThrusterV2_1Provider extends UniswapV2BaseProvider { + override fee = 0.01 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x37836821a2c03c171fB1a595767f4a16e2b93Fc4', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x32a9ff5a51b653cbafe88e38c4da86b859135750d3ca435f0ce732c8e3bb8335', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.ThrusterV2 + } + getPoolProviderName(): string { + return 'ThrusterV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts new file mode 100644 index 0000000000..d1d7dffd0b --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class ThrusterV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x71b08f13B3c3aF35aAdEb3949AFEb1ded1016127', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xd0c3a51b16dbc778f000c620eaabeecd33b33a80bd145e1f7cbc0d4de335193d', + } as const + const tickLens = { + [ChainId.BLAST]: '0x796B39328b92472b2Bd950AEB20D950611e02EF6', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.ThrusterV3 + } + getPoolProviderName(): string { + return 'ThrusterV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts index bac9b35ce8..3e215bf7cf 100644 --- a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts +++ b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts @@ -7,10 +7,16 @@ export class TraderJoeProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.AVALANCHE]: '0x9Ad6C38BE94206cA50bb0d90783181662f0Cfa10', + [ChainId.ARBITRUM]: '0xaE4EC9901c3076D0DdBe76A520F9E90a6227aCB7', + [ChainId.BSC]: '0x4f8bdc85E3eec5b9dE67097c3f59B6Db025d9986', } as const const initCodeHash = { [ChainId.AVALANCHE]: '0x0bbca9af0511ad1a1da383135cf3a8d2ac620e549ef9f6ae3a4c33c2fed0af91', + [ChainId.ARBITRUM]: + '0x6c67ac67d0dad54be7b066edd9b4154fb5a0ab7d01232259b9ff26ebc1739ba2', + [ChainId.BSC]: + '0x5c9d12e487d245c53fb0b8dd1ba2ccc48810e6b9671311502b8632e88b0d605b', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts index 21a10b0871..782cef3a46 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts @@ -7,10 +7,31 @@ export class UniswapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + [ChainId.ARBITRUM]: '0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9', + [ChainId.AVALANCHE]: '0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C', + [ChainId.BSC]: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6', + [ChainId.OPTIMISM]: '0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf', + [ChainId.POLYGON]: '0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C', + [ChainId.BLAST]: '0x5C346464d33F90bABaf70dB6388507CC889C1070', + [ChainId.BASE]: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6', } as const const initCodeHash = { [ChainId.ETHEREUM]: '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.ARBITRUM]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.AVALANCHE]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.BSC]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.OPTIMISM]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.POLYGON]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.BLAST]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + [ChainId.BASE]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index e46987fb8d..97afcff9f3 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -1,7 +1,7 @@ import { getCreate2Address } from '@ethersproject/address' import { add, getUnixTime } from 'date-fns' import { Address, Hex, PublicClient, encodePacked, keccak256 } from 'viem' -import { getReservesAbi } from '../../abi/index.js' +import { getReservesAbi as abi } from '../../abi/index.js' import { ChainId } from '../../chain/index.js' import { ADDITIONAL_BASES, @@ -26,7 +26,7 @@ interface PoolInfo { validUntilTimestamp: number } -interface StaticPool { +export interface StaticPool { address: Address token0: Token token1: Token @@ -59,6 +59,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { refreshAvailablePoolsTimestamp = getUnixTime( add(Date.now(), { seconds: this.FETCH_AVAILABLE_POOLS_AFTER_SECONDS }), ) + getReservesAbi: any = abi constructor( chainId: ChainId, @@ -107,7 +108,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { ({ address: pool.address as Address, chainId: this.chainId, - abi: getReservesAbi, + abi, functionName: 'getReserves', }) as const, ), @@ -234,7 +235,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { ({ address: poolCode.pool.address as Address, chainId: this.chainId, - abi: getReservesAbi, + abi: this.getReservesAbi, functionName: 'getReserves', }) as const, ), @@ -307,7 +308,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { ({ address: poolCode.pool.address as Address, chainId: this.chainId, - abi: getReservesAbi, + abi, functionName: 'getReserves', }) as const, ), @@ -330,7 +331,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { ({ address: poolCode.pool.address as Address, chainId: this.chainId, - abi: getReservesAbi, + abi, functionName: 'getReserves', }) as const, ), diff --git a/packages/sushi/src/router/liquidity-providers/VVSStandard.ts b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts new file mode 100644 index 0000000000..a25d5eb3f3 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts @@ -0,0 +1,23 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class VVSStandardProvider extends UniswapV2BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.CRONOS]: '0x3B44B2a187a7b3824131F8db5a74194D0a42Fc15', + } as const + const initCodeHash = { + [ChainId.CRONOS]: + '0xa77ee1cc0f39570ddde947459e293d7ebc2c30ff4e8fc45860afdcb2c2d3dc17', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.VVSStandard + } + getPoolProviderName(): string { + return 'VVSStandard' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts new file mode 100644 index 0000000000..1ec5b38959 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -0,0 +1,42 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class WagmiProvider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0xB9a14EE1cd3417f3AcC988F61650895151abde24', + [ChainId.FANTOM]: '0xaf20f5f19698f1D19351028cd7103B63D30DE7d7', + [ChainId.KAVA]: '0x0e0Ce4D450c705F8a0B6Dd9d5123e3df2787D16B', + [ChainId.ZKSYNC_ERA]: '0x31be61CE896e8770B21e7A1CAFA28402Dd701995', + [ChainId.METIS]: '0x8112E18a34b63964388a3B2984037d6a2EFE5B8A', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + [ChainId.FANTOM]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + [ChainId.KAVA]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + [ChainId.ZKSYNC_ERA]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + [ChainId.METIS]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + } as const + const tickLens = { + [ChainId.ETHEREUM]: '0xb1F795776cB9DdAC6E7e162f31C7419Dd3d48297', + [ChainId.FANTOM]: '0x209050d81Aad536Ca2092466B221013B8de7AC6c', + [ChainId.KAVA]: '0xf914e1329e4588783Ee68f06B2b900adDC97f966', + [ChainId.ZKSYNC_ERA]: '0x09Cbf436DE2273dAC3f0971fB905aCBe41b1CC81', + [ChainId.METIS]: '0x428065998a96F82bf66A0A427A157429A6Fdd649', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.Wagmi + } + getPoolProviderName(): string { + return 'Wagmi' + } +} diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts index d1f9a07eaa..4e9d1da9f7 100644 --- a/packages/sushi/src/router/memoizer.test.ts +++ b/packages/sushi/src/router/memoizer.test.ts @@ -1,6 +1,7 @@ import fs from 'fs' +import memoize from 'memoize-fs' import { describe, expect, it } from 'vitest' -import { memoizer } from './memoizer.js' +import { deserialize, serialize } from './memoizer.js' describe('Memoizer', async () => { it('should serialize, memoize, read from cache, deserialize', async () => { @@ -12,6 +13,11 @@ describe('Memoizer', async () => { someOtherValue: 'some data', } } + const memoizer = memoize({ + cachePath: './test-cache', + serialize, + deserialize, + }) const testMemoizer = await memoizer.fn(testFn) const testValue = { @@ -42,12 +48,15 @@ describe('Memoizer', async () => { // read cached file content const cacheFileContent = fs.readFileSync( - `./mem-cache/${fs.readdirSync('./mem-cache')[0]}`, + `./test-cache/${fs.readdirSync('./test-cache')[0]}`, { encoding: 'utf-8' }, ) const expectedCachedContent = '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' expect(cacheFileContent).toEqual(expectedCachedContent) + + // remove the cached data + fs.rmSync('./test-cache', { recursive: true, force: true }) }) }) diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts index a8810d85f4..bd0b5d8c3c 100644 --- a/packages/sushi/src/router/memoizer.ts +++ b/packages/sushi/src/router/memoizer.ts @@ -1,6 +1,6 @@ import memoize from 'memoize-fs' -const serialize = (val: any) => { +export const serialize = (val: any) => { const circRefColl: any[] = [] return JSON.stringify(val, (_name, value) => { if (typeof value === 'function') { @@ -19,7 +19,7 @@ const serialize = (val: any) => { }) } -const deserialize = (val: string) => { +export const deserialize = (val: string) => { return JSON.parse(val, (_key, value) => { if (typeof value === 'string' && /^\d+n$/.test(value)) { return BigInt(value.slice(0, -1)) From c047942a80314127d33d085f11514e5ceae9801b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:38:09 +0000 Subject: [PATCH 019/140] Delete BaseSwap.ts --- .../router/liquidity-providers/BaseSwap.ts | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 packages/sushi/src/router/liquidity-providers/BaseSwap.ts diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts deleted file mode 100644 index 3f3ce6591c..0000000000 --- a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { PublicClient } from 'viem' -import { ChainId } from '../../chain/index.js' -import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' - -export class BaseSwapProvider extends UniswapV2BaseProvider { - override fee = 0.0025 - constructor(chainId: ChainId, web3Client: PublicClient) { - const factory = { - [ChainId.BASE]: '0xFDa619b6d20975be80A10332cD39b9a4b0FAa8BB', - } as const - const initCodeHash = { - [ChainId.BASE]: - '0xb618a2730fae167f5f8ac7bd659dd8436d571872655bcb6fd11f2158c8a64a3b', - } as const - super(chainId, web3Client, factory, initCodeHash) - } - getType(): LiquidityProviders { - return LiquidityProviders.BaseSwap - } - getPoolProviderName(): string { - return 'BaseSwap' - } -} From 7799dc44e5f94295ef711f776ac588220796d15a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:38:39 +0000 Subject: [PATCH 020/140] Create BaseSwap.ts --- .../router/liquidity-providers/BaseSwap.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/BaseSwap.ts diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts new file mode 100644 index 0000000000..3f3ce6591c --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class BaseSwapProvider extends UniswapV2BaseProvider { + override fee = 0.0025 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0xFDa619b6d20975be80A10332cD39b9a4b0FAa8BB', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0xb618a2730fae167f5f8ac7bd659dd8436d571872655bcb6fd11f2158c8a64a3b', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.BaseSwap + } + getPoolProviderName(): string { + return 'BaseSwap' + } +} From 3727ed0c228c969c6ac5007073f5c7515db7b216 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:50:44 +0000 Subject: [PATCH 021/140] Update Enosys.ts --- .../src/router/liquidity-providers/Enosys.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts index fccdb613fd..5a89f2b894 100644 --- a/packages/sushi/src/router/liquidity-providers/Enosys.ts +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -7,8 +7,10 @@ import { getCurrencyCombinations } from '../get-currency-combinations.js' import { LiquidityProviders } from './LiquidityProvider.js' import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' -// Enosys has different initCodeHash, so it is required to override the pool address -// calculations methods to use all the available initCodeHashes +// Enosys has multiple initCodeHashes, so it is required to override the pool address +// calculations methods to use all the available initCodeHashes to generate multiple +// pool addresses for a pair and then the wrong ones will be filtered out automatically +// on multicall, just the as same for any other non existant calculated pool addresses export class EnosysProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { @@ -29,7 +31,9 @@ export class EnosysProvider extends UniswapV2BaseProvider { return 'Enosys' } - // uses all availbale initCodeHashes to return array of calculated pool addresses + // same as _getPoolAddress() in UniswapV2BaseProvider, but instead of + // returning only 1 pool address, it returns array of calculated pool + // addressses by using all available initCodeHashes _getPoolAddresses(t1: Token, t2: Token): Address[] { return (this.initCodeHash[this.chainId] as any as string[]).map( (initCodeHash) => { @@ -47,8 +51,9 @@ export class EnosysProvider extends UniswapV2BaseProvider { ) } - // override the original method to just flatMap() the calculated pool addresses - // instead of map() as in original method one pool address is calculated + // same as original getStaticPools() in UniswapV2BaseProvider, but + // just overriden to do flatMap() to flatten array of pool addresses + // per token pair override getStaticPools(t1: Token, t2: Token): StaticPool[] { const currencyCombination = getCurrencyCombinations( this.chainId, From 59091e82a3d2e95e0c8fea753bc56b42f12a0985 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:52:28 +0000 Subject: [PATCH 022/140] Update Enosys.ts --- packages/sushi/src/router/liquidity-providers/Enosys.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts index 5a89f2b894..540df210fc 100644 --- a/packages/sushi/src/router/liquidity-providers/Enosys.ts +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -53,7 +53,8 @@ export class EnosysProvider extends UniswapV2BaseProvider { // same as original getStaticPools() in UniswapV2BaseProvider, but // just overriden to do flatMap() to flatten array of pool addresses - // per token pair + // per token pair, since there will be multiple calculated pool addresses + // per token pair as a result of having multiple initCodeHashes override getStaticPools(t1: Token, t2: Token): StaticPool[] { const currencyCombination = getCurrencyCombinations( this.chainId, From 8cbd62b86cb8e327ee265c4dbc6323813aeb1b14 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:55:19 +0000 Subject: [PATCH 023/140] Update Enosys.ts --- packages/sushi/src/router/liquidity-providers/Enosys.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts index 540df210fc..b35e10e000 100644 --- a/packages/sushi/src/router/liquidity-providers/Enosys.ts +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -10,7 +10,7 @@ import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' // Enosys has multiple initCodeHashes, so it is required to override the pool address // calculations methods to use all the available initCodeHashes to generate multiple // pool addresses for a pair and then the wrong ones will be filtered out automatically -// on multicall, just the as same for any other non existant calculated pool addresses +// on multicall, just the same as any other non existant calculated pool addresses export class EnosysProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { From e33677926c4925d3d89d474da161e8e0ce6652d5 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 22:59:50 +0000 Subject: [PATCH 024/140] update --- packages/sushi/src/router/data-fetcher.ts | 2 ++ .../router/liquidity-providers/BlazeSwap.ts | 22 +++++++++++++++++++ .../liquidity-providers/LiquidityProvider.ts | 1 + 3 files changed, 25 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/BlazeSwap.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index d769720ef3..b8ebe14bc8 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -6,6 +6,7 @@ import { ApeSwapProvider } from './liquidity-providers/ApeSwap.js' import { BaseSwapProvider } from './liquidity-providers/BaseSwap.js' import { BiswapProvider } from './liquidity-providers/Biswap.js' import { BlastDEXProvider } from './liquidity-providers/BlastDEX.js' +import { BlazeSwapProvider } from './liquidity-providers/BlazeSwap.js' import { CamelotProvider } from './liquidity-providers/Camelot.js' import { CurveProvider } from './liquidity-providers/CurveProvider.js' import { DfynProvider } from './liquidity-providers/Dfyn.js' @@ -147,6 +148,7 @@ export class DataFetcher { BaseSwapProvider, BiswapProvider, BlastDEXProvider, + BlazeSwapProvider, CamelotProvider, CurveProvider, DfynProvider, diff --git a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts new file mode 100644 index 0000000000..d8aba20e91 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts @@ -0,0 +1,22 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class BlazeSwapProvider extends UniswapV2BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + 14: '0x440602f459D7Dd500a74528003e6A20A46d6e2A6', + } as const + const initCodeHash = { + 14: '0xbf4c1c435583a2bb8d763765a34a46e376071c3b3d80e5bbac0950aeecdf31cb', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.BlazeSwap + } + getPoolProviderName(): string { + return 'BlazeSwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 52d08aa769..9037bdbd08 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -47,6 +47,7 @@ export enum LiquidityProviders { KinetixV3 = 'KinetixV3', Camelot = 'Camelot', Enosys = 'Enosys', + BlazeSwap = 'BlazeSwap', } export abstract class LiquidityProvider { From af8a3931d415aab9389ba6e7628a66414c1d75d8 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 27 Apr 2024 23:01:58 +0000 Subject: [PATCH 025/140] Update BlazeSwap.ts --- packages/sushi/src/router/liquidity-providers/BlazeSwap.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts index d8aba20e91..1b2237bcab 100644 --- a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts @@ -6,10 +6,11 @@ import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class BlazeSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - 14: '0x440602f459D7Dd500a74528003e6A20A46d6e2A6', + [ChainId.FLARE]: '0x440602f459D7Dd500a74528003e6A20A46d6e2A6', } as const const initCodeHash = { - 14: '0xbf4c1c435583a2bb8d763765a34a46e376071c3b3d80e5bbac0950aeecdf31cb', + [ChainId.FLARE]: + '0xbf4c1c435583a2bb8d763765a34a46e376071c3b3d80e5bbac0950aeecdf31cb', } as const super(chainId, web3Client, factory, initCodeHash) } From c15beab80b814133de280c2b1c6aa6808f4ba5f3 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 20:59:59 +0000 Subject: [PATCH 026/140] init --- flake.lock | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 22 ++++ 2 files changed, 322 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..89f23ddbe0 --- /dev/null +++ b/flake.lock @@ -0,0 +1,300 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "inputs": { + "systems": "systems_4" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "foundry": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1714727549, + "narHash": "sha256-CWXRTxxcgMfQubJugpeg3yVWIfm70MYTtgaKWKgD60U=", + "owner": "shazow", + "repo": "foundry.nix", + "rev": "47cf189ec395eda4b3e0623179d1075c8027ca97", + "type": "github" + }, + "original": { + "owner": "shazow", + "ref": "monthly", + "repo": "foundry.nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1666753130, + "narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f540aeda6f677354f1e7144ab04352f61aaa0118", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1714764285, + "narHash": "sha256-oeevp27kMeDjKdxaTyXyS14TLjJrpJhXp7UVEUdYqYs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d121ce778b2609ae9e749a711295ffca013a82c4", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1706487304, + "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1708564076, + "narHash": "sha256-KKkqoxlgx9n3nwST7O2kM8tliDOijiSSNaWuSkiozdQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "98b00b6947a9214381112bdb6f89c25498db4959", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "rainix": { + "inputs": { + "flake-utils": "flake-utils_2", + "foundry": "foundry", + "nixpkgs": "nixpkgs_2", + "rust-overlay": "rust-overlay", + "solc": "solc" + }, + "locked": { + "lastModified": 1714764843, + "narHash": "sha256-7ae0pHvjlInc1V3QxjW5iNhXAYerO1/fhLgzQnPNPjE=", + "owner": "rainprotocol", + "repo": "rainix", + "rev": "f3bdb28f353f8cba28b2bba86f79c362dd65ee53", + "type": "github" + }, + "original": { + "owner": "rainprotocol", + "repo": "rainix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "rainix": "rainix" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": "flake-utils_4", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1714702555, + "narHash": "sha256-/NoUbE5S5xpK1FU3nlHhQ/tL126+JcisXdzy3Ng4pDU=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "7f0e3ef7b7fbed78e12e5100851175d28af4b7c6", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "solc": { + "inputs": { + "flake-utils": "flake-utils_5", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1711538161, + "narHash": "sha256-rETVdEIQ2PyEcNgzXXFSiYAYl0koCeGDIWp9XYBTxoQ=", + "owner": "hellwolf", + "repo": "solc.nix", + "rev": "a995838545a7383a0b37776e969743b1346d5479", + "type": "github" + }, + "original": { + "owner": "hellwolf", + "repo": "solc.nix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..b58bce3335 --- /dev/null +++ b/flake.nix @@ -0,0 +1,22 @@ +{ + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + rainix.url = "github:rainprotocol/rainix"; + }; + + outputs = { self, flake-utils, rainix }: + + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = rainix.pkgs.${system}; + in { + # For `nix develop`: + devShell = pkgs.mkShell { + nativeBuildInputs = [ + rainix.node-build-inputs.${system} + pkgs.nodePackages.pnpm + ]; + }; + } + ); +} \ No newline at end of file From c958637dc07091672621f05c6e2bb93d5d0503d5 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 21:41:21 +0000 Subject: [PATCH 027/140] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d643bcb16..e4fbc713b3 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "packageManager": "pnpm@8.15.3", "engines": { "node": ">=20.x", - "pnpm": "8.15.3" + "pnpm": ">=8.15.3" }, "pnpm": { "overrides": { From 41e108633d6fce4ab273a7f23f6b90d8670c542a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 21:52:22 +0000 Subject: [PATCH 028/140] Update pnpm-lock.yaml --- pnpm-lock.yaml | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bad597063..30a918a596 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1814,6 +1814,9 @@ importers: lodash.flatmap: specifier: 4.5.0 version: 4.5.0 + memoize-fs: + specifier: github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5 + version: github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5 numbro: specifier: 2.5.0 version: 2.5.0 @@ -14979,7 +14982,6 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 - dev: false /@rushstack/eslint-patch@1.3.3: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} @@ -16889,7 +16891,7 @@ packages: vite: ^3.0.0 || ^4.0.0 dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.3.9) - '@rollup/pluginutils': 5.0.4(rollup@2.78.0) + '@rollup/pluginutils': 5.0.4(rollup@3.29.4) '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.3.9) '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@vitejs/plugin-react': 3.1.0(vite@4.3.9) @@ -32185,6 +32187,11 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /meriyah@4.4.2: + resolution: {integrity: sha512-fENZIbs4tscI3IGRGtPrCoW4H4oGzVQrQCVCGRv+92kFXKkvxr52ZNR684ICvDC/UBWg9ioGc2X6pMnWOtRYwA==} + engines: {node: '>=10.4.0'} + dev: false + /merkle-patricia-tree@2.3.2: resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} dependencies: @@ -41300,6 +41307,7 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} + deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' dependencies: async: 2.6.4 backoff: 2.5.0 @@ -42338,4 +42346,15 @@ packages: version: 0.6.8 dependencies: bn.js: 4.12.0 - ethereumjs-util: 6.2.1 \ No newline at end of file + ethereumjs-util: 6.2.1 + + github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5: + resolution: {tarball: https://codeload.github.com/rouzwelt/memoize-fs/tar.gz/e5fcc9f6effc4ad087514372a53a49d380520ad5} + name: memoize-fs + version: 3.0.0 + engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} + prepare: true + requiresBuild: true + dependencies: + meriyah: 4.4.2 + dev: false From 49e25a6ef3c9339d6d4a32874898a7c598fda820 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 22:00:09 +0000 Subject: [PATCH 029/140] update --- packages/sushi/src/router/memoizer.test.ts | 53 ---------------------- packages/sushi/src/router/memoizer.ts | 34 -------------- 2 files changed, 87 deletions(-) delete mode 100644 packages/sushi/src/router/memoizer.test.ts delete mode 100644 packages/sushi/src/router/memoizer.ts diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts deleted file mode 100644 index d1f9a07eaa..0000000000 --- a/packages/sushi/src/router/memoizer.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import fs from 'fs' -import { describe, expect, it } from 'vitest' -import { memoizer } from './memoizer.js' - -describe('Memoizer', async () => { - it('should serialize, memoize, read from cache, deserialize', async () => { - let didHitCacheOnce = false - const testFn = (value1: any) => { - didHitCacheOnce = !didHitCacheOnce - return { - ...value1, - someOtherValue: 'some data', - } - } - const testMemoizer = await memoizer.fn(testFn) - - const testValue = { - bigint: 12345n, - string: 'some text', - number: 123, - bool: true, - obj: { - prop: 'some prop', - }, - } - const noCacheHitReturnedValue = await testMemoizer(testValue) - const cacheHitReturnedValue = await testMemoizer(testValue) - const expectedReturnedValue = { - bigint: 12345n, - string: 'some text', - number: 123, - bool: true, - obj: { - prop: 'some prop', - }, - someOtherValue: 'some data', - } - - expect(didHitCacheOnce).toEqual(true) - expect(noCacheHitReturnedValue).toStrictEqual(expectedReturnedValue) - expect(cacheHitReturnedValue).toStrictEqual(expectedReturnedValue) - - // read cached file content - const cacheFileContent = fs.readFileSync( - `./mem-cache/${fs.readdirSync('./mem-cache')[0]}`, - { encoding: 'utf-8' }, - ) - const expectedCachedContent = - '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' - - expect(cacheFileContent).toEqual(expectedCachedContent) - }) -}) diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts deleted file mode 100644 index a8810d85f4..0000000000 --- a/packages/sushi/src/router/memoizer.ts +++ /dev/null @@ -1,34 +0,0 @@ -import memoize from 'memoize-fs' - -const serialize = (val: any) => { - const circRefColl: any[] = [] - return JSON.stringify(val, (_name, value) => { - if (typeof value === 'function') { - return // ignore arguments and attributes of type function silently - } - if (typeof value === 'object' && value !== null) { - if (circRefColl.indexOf(value) !== -1) { - // circular reference has been found, discard key - return - } - // store value in collection - circRefColl.push(value) - } - if (typeof value === 'bigint') return `${value.toString()}n` - return value - }) -} - -const deserialize = (val: string) => { - return JSON.parse(val, (_key, value) => { - if (typeof value === 'string' && /^\d+n$/.test(value)) { - return BigInt(value.slice(0, -1)) - } else return value - }).data -} - -export const memoizer = memoize({ - cachePath: './mem-cache', - serialize, - deserialize, -}) From a4594b0d803f5ef0a9c6d0036ca5882848c85163 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 22:04:00 +0000 Subject: [PATCH 030/140] update --- flake.lock | 2 +- packages/sushi/package.json | 1 - pnpm-lock.yaml | 25 +++---------------------- 3 files changed, 4 insertions(+), 24 deletions(-) diff --git a/flake.lock b/flake.lock index 70761849f8..89f23ddbe0 100644 --- a/flake.lock +++ b/flake.lock @@ -297,4 +297,4 @@ }, "root": "root", "version": 7 -} \ No newline at end of file +} diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 13d5264f0d..83d71a609b 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -202,7 +202,6 @@ "date-fns": "3.3.1", "decimal.js-light": "2.5.1", "lodash.flatmap": "4.5.0", - "memoize-fs": "github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5", "numbro": "2.5.0", "seedrandom": "3.0.5", "serialijse": "0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30a918a596..0bad597063 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1814,9 +1814,6 @@ importers: lodash.flatmap: specifier: 4.5.0 version: 4.5.0 - memoize-fs: - specifier: github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5 - version: github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5 numbro: specifier: 2.5.0 version: 2.5.0 @@ -14982,6 +14979,7 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 + dev: false /@rushstack/eslint-patch@1.3.3: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} @@ -16891,7 +16889,7 @@ packages: vite: ^3.0.0 || ^4.0.0 dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.3.9) - '@rollup/pluginutils': 5.0.4(rollup@3.29.4) + '@rollup/pluginutils': 5.0.4(rollup@2.78.0) '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.3.9) '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@vitejs/plugin-react': 3.1.0(vite@4.3.9) @@ -32187,11 +32185,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /meriyah@4.4.2: - resolution: {integrity: sha512-fENZIbs4tscI3IGRGtPrCoW4H4oGzVQrQCVCGRv+92kFXKkvxr52ZNR684ICvDC/UBWg9ioGc2X6pMnWOtRYwA==} - engines: {node: '>=10.4.0'} - dev: false - /merkle-patricia-tree@2.3.2: resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} dependencies: @@ -41307,7 +41300,6 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} - deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' dependencies: async: 2.6.4 backoff: 2.5.0 @@ -42346,15 +42338,4 @@ packages: version: 0.6.8 dependencies: bn.js: 4.12.0 - ethereumjs-util: 6.2.1 - - github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5: - resolution: {tarball: https://codeload.github.com/rouzwelt/memoize-fs/tar.gz/e5fcc9f6effc4ad087514372a53a49d380520ad5} - name: memoize-fs - version: 3.0.0 - engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} - prepare: true - requiresBuild: true - dependencies: - meriyah: 4.4.2 - dev: false + ethereumjs-util: 6.2.1 \ No newline at end of file From 0ef79d9fc922d0b40d8755973ea4d93aca5b4009 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 22:05:10 +0000 Subject: [PATCH 031/140] Update pnpm-lock.yaml --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bad597063..eafb65cc1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42338,4 +42338,4 @@ packages: version: 0.6.8 dependencies: bn.js: 4.12.0 - ethereumjs-util: 6.2.1 \ No newline at end of file + ethereumjs-util: 6.2.1 From f385170f998c8e095c464bfaa1f1e40faad85e0f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 4 May 2024 22:15:31 +0000 Subject: [PATCH 032/140] init --- packages/sushi/package.json | 1 + packages/sushi/src/router/memoizer.test.ts | 53 ++++++++++++++++++++++ packages/sushi/src/router/memoizer.ts | 34 ++++++++++++++ pnpm-lock.yaml | 20 ++++++++ 4 files changed, 108 insertions(+) create mode 100644 packages/sushi/src/router/memoizer.test.ts create mode 100644 packages/sushi/src/router/memoizer.ts diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 83d71a609b..13d5264f0d 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -202,6 +202,7 @@ "date-fns": "3.3.1", "decimal.js-light": "2.5.1", "lodash.flatmap": "4.5.0", + "memoize-fs": "github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5", "numbro": "2.5.0", "seedrandom": "3.0.5", "serialijse": "0.3.0", diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts new file mode 100644 index 0000000000..d1f9a07eaa --- /dev/null +++ b/packages/sushi/src/router/memoizer.test.ts @@ -0,0 +1,53 @@ +import fs from 'fs' +import { describe, expect, it } from 'vitest' +import { memoizer } from './memoizer.js' + +describe('Memoizer', async () => { + it('should serialize, memoize, read from cache, deserialize', async () => { + let didHitCacheOnce = false + const testFn = (value1: any) => { + didHitCacheOnce = !didHitCacheOnce + return { + ...value1, + someOtherValue: 'some data', + } + } + const testMemoizer = await memoizer.fn(testFn) + + const testValue = { + bigint: 12345n, + string: 'some text', + number: 123, + bool: true, + obj: { + prop: 'some prop', + }, + } + const noCacheHitReturnedValue = await testMemoizer(testValue) + const cacheHitReturnedValue = await testMemoizer(testValue) + const expectedReturnedValue = { + bigint: 12345n, + string: 'some text', + number: 123, + bool: true, + obj: { + prop: 'some prop', + }, + someOtherValue: 'some data', + } + + expect(didHitCacheOnce).toEqual(true) + expect(noCacheHitReturnedValue).toStrictEqual(expectedReturnedValue) + expect(cacheHitReturnedValue).toStrictEqual(expectedReturnedValue) + + // read cached file content + const cacheFileContent = fs.readFileSync( + `./mem-cache/${fs.readdirSync('./mem-cache')[0]}`, + { encoding: 'utf-8' }, + ) + const expectedCachedContent = + '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' + + expect(cacheFileContent).toEqual(expectedCachedContent) + }) +}) diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts new file mode 100644 index 0000000000..a8810d85f4 --- /dev/null +++ b/packages/sushi/src/router/memoizer.ts @@ -0,0 +1,34 @@ +import memoize from 'memoize-fs' + +const serialize = (val: any) => { + const circRefColl: any[] = [] + return JSON.stringify(val, (_name, value) => { + if (typeof value === 'function') { + return // ignore arguments and attributes of type function silently + } + if (typeof value === 'object' && value !== null) { + if (circRefColl.indexOf(value) !== -1) { + // circular reference has been found, discard key + return + } + // store value in collection + circRefColl.push(value) + } + if (typeof value === 'bigint') return `${value.toString()}n` + return value + }) +} + +const deserialize = (val: string) => { + return JSON.parse(val, (_key, value) => { + if (typeof value === 'string' && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)) + } else return value + }).data +} + +export const memoizer = memoize({ + cachePath: './mem-cache', + serialize, + deserialize, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eafb65cc1a..2988565ef7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1814,6 +1814,9 @@ importers: lodash.flatmap: specifier: 4.5.0 version: 4.5.0 + memoize-fs: + specifier: github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5 + version: github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5 numbro: specifier: 2.5.0 version: 2.5.0 @@ -32185,6 +32188,11 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /meriyah@4.4.2: + resolution: {integrity: sha512-fENZIbs4tscI3IGRGtPrCoW4H4oGzVQrQCVCGRv+92kFXKkvxr52ZNR684ICvDC/UBWg9ioGc2X6pMnWOtRYwA==} + engines: {node: '>=10.4.0'} + dev: false + /merkle-patricia-tree@2.3.2: resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} dependencies: @@ -41300,6 +41308,7 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} + deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' dependencies: async: 2.6.4 backoff: 2.5.0 @@ -42339,3 +42348,14 @@ packages: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 + + github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5: + resolution: {tarball: https://codeload.github.com/rouzwelt/memoize-fs/tar.gz/e5fcc9f6effc4ad087514372a53a49d380520ad5} + name: memoize-fs + version: 3.0.0 + engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} + prepare: true + requiresBuild: true + dependencies: + meriyah: 4.4.2 + dev: false From 1f3530d7bc53ec6997992bded151d101bb20f819 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 5 May 2024 20:30:14 +0000 Subject: [PATCH 033/140] Update report --- packages/sushi/test/tines/snapshots/report | 169 +++++++++++++++++++-- 1 file changed, 159 insertions(+), 10 deletions(-) diff --git a/packages/sushi/test/tines/snapshots/report b/packages/sushi/test/tines/snapshots/report index f8d28db60a..306557668b 100644 --- a/packages/sushi/test/tines/snapshots/report +++ b/packages/sushi/test/tines/snapshots/report @@ -1,42 +1,191 @@ 1:"bridge-1": 5528.94 -> 5528.94 (0%) avg:0% 2:"bridge-2": 7663 -> 7663 (0%) avg:0% -151:"top20-150": 0 -> 0 (0%) avg:0% -152:"top20-151": 481 -> 481 (0%) avg:0% 3:"bridge-3": 11953.94 -> 11953.94 (0%) avg:0% 4:"bridge-4": 5496.94 -> 5496.94 (0%) avg:0% 5:"bridge-5-1": 4260.964 -> 4260.964 (0%) avg:0% +2:"top20-1": 1.1195509365387262e+37 -> 1.1195509365387262e+37 (0%) avg:0% 6:"bridge-5-2": 5473.94 -> 5473.94 (0%) avg:0% 7:"bridge-5-3": 5501.94 -> 5501.94 (0%) avg:0% 8:"bridge-5-5": 5528.94 -> 5528.94 (0%) avg:0% 9:"bridge-5-10": 5528.94 -> 5528.94 (0%) avg:0% 10:"bridge-5-30": 5528.94 -> 5528.94 (0%) avg:0% 11:"bridge-5-100": 5528.94 -> 5528.94 (0%) avg:0% +3:"top20-2": 96249232830474440000 -> 96249232830474440000 (0%) avg:0% +4:"top20-3": 467011582838851800000 -> 467011582838851800000 (0%) avg:0% +5:"top20-4": 14263706377454.916 -> 14263706377454.916 (0%) avg:0% 12:"bridge-5-300": 5528.94 -> 5528.94 (0%) avg:0% -153:"top20-152": 0 -> 0 (0%) avg:0% -154:"top20-153": 1.3468577317796694e+32 -> 1.3468577317796694e+32 (0%) avg:0% +6:"top20-5": 111208992328025 -> 111208992328025 (0%) avg:0% +7:"top20-6": 184056193599 -> 184056193599 (0%) avg:0% 13:"bridge-5-1000": 5528.94 -> 5528.94 (0%) avg:0% -155:"top20-154": 7978807883992.964 -> 7978807883992.964 (0%) avg:0% +8:"top20-7": 1.949010266471403e+21 -> 1.949010266471403e+21 (0%) avg:0% 14:"bridge-6": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -156:"top20-155": 75460.9999999988 -> 75460.9999999988 (0%) avg:0% 15:"bridge-7-1": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 16:"bridge-7-2": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 17:"bridge-7-3": 569.9929597799993 -> 569.9929597799993 (0%) avg:0% -157:"top20-156": 1433531033857000200 -> 1433531033857000200 (0%) avg:0% +9:"top20-8": 5147698251 -> 5147698251 (0%) avg:0% 18:"bridge-7-5": 577.9911997249991 -> 577.9911997249991 (0%) avg:0% 19:"bridge-7-10": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 20:"bridge-7-30": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -158:"top20-157": 5729885219 -> 5729885219 (0%) avg:0% +10:"top20-9": 2.3146866045567974e+29 -> 2.3146866045567974e+29 (0%) avg:0% +11:"top20-10": 2.000939725061475e+25 -> 2.000939725061475e+25 (0%) avg:0% 21:"bridge-7-100": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% +12:"top20-11": 0 -> 0 (0%) avg:0% +22:"bridge-7-300": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% +13:"top20-12": 5.998729978399937e+23 -> 5.998729978399937e+23 (0%) avg:0% +14:"top20-13": 14.999999999999975 -> 14.999999999999975 (0%) avg:0% +15:"top20-14": 242561332730 -> 242561332730 (0%) avg:0% +16:"top20-15": 20057219983855420 -> 20057219983855420 (0%) avg:0% +17:"top20-16": 1371193183.507006 -> 1371193183.507006 (0%) avg:0% +18:"top20-17": 618784869519468900000 -> 618784869519468900000 (0%) avg:0% +19:"top20-18": 13965130914 -> 13965130914 (0%) avg:0% +23:"bridge-7-1000": 578.9911997249991 -> 578.9911997249991 (0%) avg:0% +20:"top20-19": 1719221840266011.2 -> 1719221840266011.2 (0%) avg:0% +21:"top20-20": 1.1539072915253164e+27 -> 1.1539072915253164e+27 (0%) avg:0% +22:"top20-21": 1.4857010533172297e+22 -> 1.4857010533172297e+22 (0%) avg:0% +23:"top20-22": 13216695381.96823 -> 13216695381.96823 (0%) avg:0% +24:"top20-23": 71.99999999995467 -> 71.99999999995467 (0%) avg:0% +25:"top20-24": 4.257526126994545e+23 -> 4.257526126994545e+23 (0%) avg:0% +26:"top20-25": 9.20707200216008e+22 -> 9.20707200216008e+22 (0%) avg:0% +27:"top20-26": 119377775 -> 119377775 (0%) avg:0% +28:"top20-27": 4.5396775085904846e+33 -> 4.5396775085904846e+33 (0%) avg:0% +29:"top20-28": 224764614280864 -> 224764614280864 (0%) avg:0% +30:"top20-29": 137910092016871140 -> 137910092016871140 (0%) avg:0% +31:"top20-30": 38414127759.999916 -> 38414127759.999916 (0%) avg:0% +32:"top20-31": 3.9150404497784796e+29 -> 3.9150404497784796e+29 (0%) avg:0% +33:"top20-32": 44939721212060795000 -> 44939721212060795000 (0%) avg:0% +34:"top20-33": 1.4260244914513205e+22 -> 1.4260244914513205e+22 (0%) avg:0% +35:"top20-34": 1.5495747386928312e+21 -> 1.5495747386928312e+21 (0%) avg:0% +36:"top20-35": 943239170088233300000 -> 943239170088233300000 (0%) avg:0% +37:"top20-36": 6121749117436.458 -> 6121749117436.458 (0%) avg:0% +38:"top20-37": 696747 -> 696747 (0%) avg:0% +39:"top20-38": 0 -> 0 (0%) avg:0% +40:"top20-39": 2.3426635283232224e+24 -> 2.3426635283232224e+24 (0%) avg:0% +41:"top20-40": 48254932363.26666 -> 48254932363.26666 (0%) avg:0% +42:"top20-41": 37860138974211.35 -> 37860138974211.35 (0%) avg:0% +43:"top20-42": 6.848076980412381e+22 -> 6.848076980412381e+22 (0%) avg:0% +44:"top20-43": 4320914881 -> 4320914881 (0%) avg:0% +45:"top20-44": 30713427089 -> 30713427089 (0%) avg:0% +46:"top20-45": 198661729955810 -> 198661729955810 (0%) avg:0% +47:"top20-46": 4003462547412852.5 -> 4003462547412852.5 (0%) avg:0% +48:"top20-47": 121585 -> 121585 (0%) avg:0% +49:"top20-48": 0 -> 0 (0%) avg:0% +50:"top20-49": 5.999999999999976 -> 5.999999999999976 (0%) avg:0% +51:"top20-50": 968129348392.8033 -> 968129348392.8033 (0%) avg:0% +52:"top20-51": 17468164450890598000 -> 17468164450890598000 (0%) avg:0% +53:"top20-52": 3370 -> 3370 (0%) avg:0% +54:"top20-53": 2.8669052288613494e+26 -> 2.8669052288613494e+26 (0%) avg:0% +55:"top20-54": 212397690771150670000 -> 212397690771150670000 (0%) avg:0% +56:"top20-55": 114722123950.99864 -> 114722123950.99864 (0%) avg:0% +57:"top20-56": 6237611807.9999895 -> 6237611807.9999895 (0%) avg:0% +58:"top20-57": 173 -> 173 (0%) avg:0% +59:"top20-58": 8.653786678134718e+34 -> 8.653786678134718e+34 (0%) avg:0% +60:"top20-59": 584843.9943957697 -> 584843.9943957697 (0%) avg:0% +61:"top20-60": 83746.99999922093 -> 83746.99999922093 (0%) avg:0% +62:"top20-61": 1.2108029911483686e+28 -> 1.2108029911483686e+28 (0%) avg:0% +63:"top20-62": 1.1321762736810075e+23 -> 1.1321762736810075e+23 (0%) avg:0% +64:"top20-63": 18624850720 -> 18624850720 (0%) avg:0% +65:"top20-64": 6558802213825504000 -> 6558802213825504000 (0%) avg:0% +66:"top20-65": 3006323408104.839 -> 3006323408104.839 (0%) avg:0% +67:"top20-66": 7.25699759360167e+33 -> 7.25699759360167e+33 (0%) avg:0% +68:"top20-67": 26997497976784.977 -> 26997497976784.977 (0%) avg:0% +69:"top20-68": 2.271898658800524e+29 -> 2.271898658800524e+29 (0%) avg:0% +70:"top20-69": 3320690.9992622463 -> 3320690.9992622463 (0%) avg:0% +71:"top20-70": 12137990973481046000 -> 12137990973481046000 (0%) avg:0% +72:"top20-71": 4.2988353121158716e+26 -> 4.2988353121158716e+26 (0%) avg:0% +73:"top20-72": 6.3575495792381146e+28 -> 6.3575495792381146e+28 (0%) avg:0% +74:"top20-73": 1.2313497939167126e+26 -> 1.2313497939167126e+26 (0%) avg:0% +75:"top20-74": 27707599790097 -> 27707599790097 (0%) avg:0% +76:"top20-75": 7124308 -> 7124308 (0%) avg:0% +77:"top20-76": 0 -> 0 (0%) avg:0% +78:"top20-77": 117608543724585440000 -> 117608543724585440000 (0%) avg:0% +79:"top20-78": 274576852204457 -> 274576852204457 (0%) avg:0% +80:"top20-79": 4.1679251723404575e+23 -> 4.1679251723404575e+23 (0%) avg:0% +81:"top20-80": 1.169123327125618e+23 -> 1.169123327125618e+23 (0%) avg:0% +82:"top20-81": 1.256638691159724e+26 -> 1.256638691159724e+26 (0%) avg:0% +83:"top20-82": 0 -> 0 (0%) avg:0% +84:"top20-83": 2.0149283251435153e+32 -> 2.0149283251435153e+32 (0%) avg:0% +85:"top20-84": 6.510078466693012e+35 -> 6.510078466693012e+35 (0%) avg:0% +86:"top20-85": 0 -> 0 (0%) avg:0% +87:"top20-86": 541712645104171 -> 541712645104171 (0%) avg:0% +88:"top20-87": 2935458414464351700 -> 2935458414464351700 (0%) avg:0% +89:"top20-88": 1672225 -> 1672225 (0%) avg:0% +90:"top20-89": 0 -> 0 (0%) avg:0% +91:"top20-90": 0 -> 0 (0%) avg:0% +92:"top20-91": 98143784 -> 98143784 (0%) avg:0% +93:"top20-92": 8692029076033.435 -> 8692029076033.435 (0%) avg:0% +94:"top20-93": 51562257056054440 -> 51562257056054440 (0%) avg:0% +95:"top20-94": 25641964396823.965 -> 25641964396823.965 (0%) avg:0% +96:"top20-95": 526418678128563400 -> 526418678128563400 (0%) avg:0% +97:"top20-96": 42011945995000000 -> 42011945995000000 (0%) avg:0% +98:"top20-97": 0 -> 0 (0%) avg:0% +99:"top20-98": 578210769514157600 -> 578210769514157600 (0%) avg:0% +100:"top20-99": 23757288573225 -> 23757288573225 (0%) avg:0% +101:"top20-100": 3519054200.963973 -> 3519054200.963973 (0%) avg:0% +102:"top20-101": 1.2366902841804613e+26 -> 1.2366902841804613e+26 (0%) avg:0% +103:"top20-102": 3.0616038596056797e+32 -> 3.0616038596056797e+32 (0%) avg:0% +104:"top20-103": 398198791124206 -> 398198791124206 (0%) avg:0% +105:"top20-104": 3434281999000000 -> 3434281999000000 (0%) avg:0% +106:"top20-105": 436386366610963040000 -> 436386366610963040000 (0%) avg:0% +107:"top20-106": 7814 -> 7814 (0%) avg:0% +108:"top20-107": 4.387432445585929e+34 -> 4.387432445585929e+34 (0%) avg:0% +109:"top20-108": 0 -> 0 (0%) avg:0% +110:"top20-109": 0 -> 0 (0%) avg:0% +111:"top20-110": 180771390372608.16 -> 180771390372608.16 (0%) avg:0% +112:"top20-111": 1.53356324718735e+23 -> 1.53356324718735e+23 (0%) avg:0% +113:"top20-112": 0 -> 0 (0%) avg:0% +114:"top20-113": 441807728976948040000 -> 441807728976948040000 (0%) avg:0% +115:"top20-114": 5.872905678780656e+30 -> 5.872905678780656e+30 (0%) avg:0% +116:"top20-115": 1.9999999999999998 -> 1.9999999999999998 (0%) avg:0% +117:"top20-116": 0 -> 0 (0%) avg:0% +118:"top20-117": 103625.91934739704 -> 103625.91934739704 (0%) avg:0% +119:"top20-118": 3994 -> 3994 (0%) avg:0% +120:"top20-119": 5481554822 -> 5481554822 (0%) avg:0% +121:"top20-120": 2148662632935361000 -> 2148662632935361000 (0%) avg:0% +122:"top20-121": 780768139203693200000 -> 780768139203693200000 (0%) avg:0% +123:"top20-122": 0 -> 0 (0%) avg:0% +124:"top20-123": 74390557839848180 -> 74390557839848180 (0%) avg:0% +125:"top20-124": 5.2767009412144705e+23 -> 5.2767009412144705e+23 (0%) avg:0% +126:"top20-125": 12999322599.999998 -> 12999322599.999998 (0%) avg:0% +127:"top20-126": 1.166563599584172e+25 -> 1.166563599584172e+25 (0%) avg:0% +128:"top20-127": 0 -> 0 (0%) avg:0% +129:"top20-128": 2.381239814048817e+29 -> 2.381239814048817e+29 (0%) avg:0% +130:"top20-129": 1.773617547666896e+21 -> 1.773617547666896e+21 (0%) avg:0% +131:"top20-130": 1043374941775 -> 1043374941775 (0%) avg:0% +132:"top20-131": 3 -> 3 (0%) avg:0% +133:"top20-132": 3523544256 -> 3523544256 (0%) avg:0% +134:"top20-133": 30660569440069612 -> 30660569440069612 (0%) avg:0% +135:"top20-134": 0 -> 0 (0%) avg:0% +136:"top20-135": 46215289309 -> 46215289309 (0%) avg:0% +137:"top20-136": 157666012290841060 -> 157666012290841060 (0%) avg:0% +138:"top20-137": 0 -> 0 (0%) avg:0% +139:"top20-138": 94486154517 -> 94486154517 (0%) avg:0% +140:"top20-139": 5381047.578903644 -> 5381047.578903644 (0%) avg:0% +141:"top20-140": 2904868891031402 -> 2904868891031402 (0%) avg:0% +142:"top20-141": 349815735970433660000 -> 349815735970433660000 (0%) avg:0% +143:"top20-142": 1.61321284630438e+29 -> 1.61321284630438e+29 (0%) avg:0% +144:"top20-143": 0 -> 0 (0%) avg:0% +145:"top20-144": 1.8715935050611244e+27 -> 1.8715935050611244e+27 (0%) avg:0% +146:"top20-145": 2329.999987331977 -> 2329.999987331977 (0%) avg:0% +147:"top20-146": 1.5754421469670991e+28 -> 1.5754421469670991e+28 (0%) avg:0% +148:"top20-147": 2.6838048385825768e+32 -> 2.6838048385825768e+32 (0%) avg:0% +149:"top20-148": 2.7141809250137436e+32 -> 2.7141809250137436e+32 (0%) avg:0% +150:"top20-149": 17399664148369718 -> 17399664148369718 (0%) avg:0% +151:"top20-150": 0 -> 0 (0%) avg:0% +152:"top20-151": 481 -> 481 (0%) avg:0% +153:"top20-152": 0 -> 0 (0%) avg:0% +154:"top20-153": 1.3468577317796694e+32 -> 1.3468577317796694e+32 (0%) avg:0% +155:"top20-154": 7978807883992.964 -> 7978807883992.964 (0%) avg:0% +156:"top20-155": 75460.9999999988 -> 75460.9999999988 (0%) avg:0% +157:"top20-156": 1433531033857000200 -> 1433531033857000200 (0%) avg:0% +158:"top20-157": 5729885219 -> 5729885219 (0%) avg:0% 159:"top20-158": 3.5295876698920206e+21 -> 3.5295876698920206e+21 (0%) avg:0% 160:"top20-159": 2752089826200724500 -> 2752089826200724500 (0%) avg:0% 161:"top20-160": 1.3721043284746797e+27 -> 1.3721043284746797e+27 (0%) avg:0% 162:"top20-161": 2628873 -> 2628873 (0%) avg:0% -22:"bridge-7-300": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 163:"top20-162": 0 -> 0 (0%) avg:0% 164:"top20-163": 7.139942836800165e+35 -> 7.139942836800165e+35 (0%) avg:0% 165:"top20-164": 588671138.9993676 -> 588671138.9993676 (0%) avg:0% 166:"top20-165": 141491517.99997458 -> 141491517.99997458 (0%) avg:0% -23:"bridge-7-1000": 578.9911997249991 -> 578.9911997249991 (0%) avg:0% 167:"top20-166": 9.906334905865037e+36 -> 9.906334905865037e+36 (0%) avg:0% 168:"top20-167": 6.127970056928261e+23 -> 6.127970056928261e+23 (0%) avg:0% 169:"top20-168": 0 -> 0 (0%) avg:0% From 52ec05f0886478b19ce791829bb22cd09d15d718 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 14:42:41 +0000 Subject: [PATCH 034/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 750bb633f5..3ffb06fb97 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -48,6 +48,7 @@ const chainIds = [ ChainId.MOONRIVER, ChainId.OPTIMISM, ChainId.POLYGON, + ChainId.FLARE, ] async function runTest() { From 93934a9c10077e9b5e79261e4ce0b0b2a83c0c1a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 15:04:17 +0000 Subject: [PATCH 035/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 3ffb06fb97..ded807e5fe 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -49,6 +49,7 @@ const chainIds = [ ChainId.OPTIMISM, ChainId.POLYGON, ChainId.FLARE, + ChainId.BASE, ] async function runTest() { From a6b0213498d795675625d9b0926f7bbc73fd9025 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 17:49:05 +0000 Subject: [PATCH 036/140] update - rm block-watcher - add all supported chains to datafetcher tests --- .github/workflows/rain-ci.yml | 3 +- .../src/router/liquidity-providers/Trident.ts | 34 +++++++++---------- .../liquidity-providers/UniswapV2Base.ts | 34 +++++++++---------- .../liquidity-providers/UniswapV3Base.ts | 34 +++++++++---------- .../route-processor/test/DataFetcher.test.ts | 25 +++++++++++++- 5 files changed, 77 insertions(+), 53 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index aaa7e6dc03..a48c3f80cc 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -23,4 +23,5 @@ jobs: run: nix develop -c pnpm exec turbo run check --filter=./packages/sushi - name: Test ./packages/sushi - run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi \ No newline at end of file + run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi + pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file diff --git a/packages/sushi/src/router/liquidity-providers/Trident.ts b/packages/sushi/src/router/liquidity-providers/Trident.ts index c8620ff678..267b3ecb2c 100644 --- a/packages/sushi/src/router/liquidity-providers/Trident.ts +++ b/packages/sushi/src/router/liquidity-providers/Trident.ts @@ -1138,23 +1138,23 @@ export class TridentProvider extends LiquidityProvider { this.topStablePools = new Map() this.bridges = new Map() - this.unwatchBlockNumber = this.client.watchBlockNumber({ - onBlockNumber: (blockNumber) => { - this.lastUpdateBlock = Number(blockNumber) - if (!this.isInitialized) { - this.initialize() - } else { - this.updatePools() - } - }, - onError: (error) => { - console.error( - `${this.getLogPrefix()} - Error watching block number: ${ - error.message - }`, - ) - }, - }) + // this.unwatchBlockNumber = this.client.watchBlockNumber({ + // onBlockNumber: (blockNumber) => { + // this.lastUpdateBlock = Number(blockNumber) + // if (!this.isInitialized) { + // this.initialize() + // } else { + // this.updatePools() + // } + // }, + // onError: (error) => { + // console.error( + // `${this.getLogPrefix()} - Error watching block number: ${ + // error.message + // }`, + // ) + // }, + // }) } private removeStalePools() { diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index 97afcff9f3..2c532e5b67 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -514,23 +514,23 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { startFetchPoolsData() { this.stopFetchPoolsData() this.topPools = new Map() - this.unwatchBlockNumber = this.client.watchBlockNumber({ - onBlockNumber: (blockNumber) => { - this.lastUpdateBlock = Number(blockNumber) - if (!this.isInitialized) { - this.initialize() - } else { - this.updatePools() - } - }, - onError: (error) => { - console.error( - `${this.getLogPrefix()} - Error watching block number: ${ - error.message - }`, - ) - }, - }) + // this.unwatchBlockNumber = this.client.watchBlockNumber({ + // onBlockNumber: (blockNumber) => { + // this.lastUpdateBlock = Number(blockNumber) + // if (!this.isInitialized) { + // this.initialize() + // } else { + // this.updatePools() + // } + // }, + // onError: (error) => { + // console.error( + // `${this.getLogPrefix()} - Error watching block number: ${ + // error.message + // }`, + // ) + // }, + // }) } private removeStalePools() { diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 334f8328ab..fa356b5436 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -487,23 +487,23 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { startFetchPoolsData() { this.stopFetchPoolsData() // this.topPools = new Map() - this.unwatchBlockNumber = this.client.watchBlockNumber({ - onBlockNumber: (blockNumber) => { - this.lastUpdateBlock = Number(blockNumber) - // if (!this.isInitialized) { - // this.initialize() - // } else { - // this.updatePools() - // } - }, - onError: (error) => { - console.error( - `${this.getLogPrefix()} - Error watching block number: ${ - error.message - }`, - ) - }, - }) + // this.unwatchBlockNumber = this.client.watchBlockNumber({ + // onBlockNumber: (blockNumber) => { + // this.lastUpdateBlock = Number(blockNumber) + // // if (!this.isInitialized) { + // // this.initialize() + // // } else { + // // this.updatePools() + // // } + // }, + // onError: (error) => { + // console.error( + // `${this.getLogPrefix()} - Error watching block number: ${ + // error.message + // }`, + // ) + // }, + // }) } getCurrentPoolList(): PoolCode[] { diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ded807e5fe..35441d5453 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -50,10 +50,25 @@ const chainIds = [ ChainId.POLYGON, ChainId.FLARE, ChainId.BASE, + ChainId.HECO, + ChainId.OKEX, + ChainId.PALM, + ChainId.TELOS, + ChainId.POLYGON_ZKEVM, + ChainId.THUNDERCORE, + ChainId.FILECOIN, + ChainId.HAQQ, + ChainId.CORE, + ChainId.ZKSYNC_ERA, + ChainId.LINEA, + ChainId.SCROLL, + ChainId.ZETACHAIN, + ChainId.CRONOS, + ChainId.BLAST, ] async function runTest() { - describe('DataFetcher Pools/Time check', async () => { + describe.only('DataFetcher Pools/Time check', async () => { chainIds.forEach((chainId) => { //if (chainId !== ChainId.OPTIMISM) return const chName = chainName[chainId] @@ -87,6 +102,14 @@ async function runTest() { 'SUSHI', 'USDT', ) + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDT[chainId as keyof typeof USDT], + 'WNATIVE', + 'USDT', + ) dataFetcher.stopDataFetching() }) }) From 6ded41195c552c26e024e537c7f7d6d1fa9e30cc Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 17:54:07 +0000 Subject: [PATCH 037/140] update --- .github/workflows/rain-ci.yml | 2 +- .../route-processor/test/DataFetcher.test.ts | 40 +------------------ 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index a48c3f80cc..5378474897 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -24,4 +24,4 @@ jobs: - name: Test ./packages/sushi run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi - pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file + / pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 35441d5453..ed7d524af5 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -27,45 +27,7 @@ async function testDF( }) } -const chainIds = [ - ChainId.ARBITRUM_NOVA, - ChainId.ARBITRUM, - ChainId.AVALANCHE, - ChainId.BOBA, - ChainId.BOBA_AVAX, - ChainId.BOBA_BNB, - ChainId.BSC, - ChainId.BTTC, - ChainId.CELO, - ChainId.ETHEREUM, - ChainId.FANTOM, - ChainId.FUSE, - ChainId.GNOSIS, - ChainId.HARMONY, - ChainId.KAVA, - ChainId.METIS, - ChainId.MOONBEAM, - ChainId.MOONRIVER, - ChainId.OPTIMISM, - ChainId.POLYGON, - ChainId.FLARE, - ChainId.BASE, - ChainId.HECO, - ChainId.OKEX, - ChainId.PALM, - ChainId.TELOS, - ChainId.POLYGON_ZKEVM, - ChainId.THUNDERCORE, - ChainId.FILECOIN, - ChainId.HAQQ, - ChainId.CORE, - ChainId.ZKSYNC_ERA, - ChainId.LINEA, - ChainId.SCROLL, - ChainId.ZETACHAIN, - ChainId.CRONOS, - ChainId.BLAST, -] +const chainIds = Object.values(ChainId) async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { From 2092e086933695176226e6697efc83611c5ac224 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 17:58:23 +0000 Subject: [PATCH 038/140] Update rain-ci.yml --- .github/workflows/rain-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 5378474897..f55884d649 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -23,5 +23,6 @@ jobs: run: nix develop -c pnpm exec turbo run check --filter=./packages/sushi - name: Test ./packages/sushi - run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi - / pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file + run: | + nix develop -c pnpm exec turbo run test --filter=./packages/sushi + nix develop -c pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file From 79ac39b6aff029fa3efbaf036628438cbec27bdd Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 19:22:26 +0000 Subject: [PATCH 039/140] add timeout option for datafetcher --- packages/sushi/src/router/data-fetcher.ts | 48 ++++++++++++++----- packages/sushi/src/router/timeout.test.ts | 36 ++++++++++++++ packages/sushi/src/router/timeout.ts | 11 +++++ .../route-processor/test/DataFetcher.test.ts | 10 +--- 4 files changed, 85 insertions(+), 20 deletions(-) create mode 100644 packages/sushi/src/router/timeout.test.ts create mode 100644 packages/sushi/src/router/timeout.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index b8ebe14bc8..2829167e40 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -50,6 +50,7 @@ import { UniswapV3Provider } from './liquidity-providers/UniswapV3.js' import { VVSStandardProvider } from './liquidity-providers/VVSStandard.js' import { WagmiProvider } from './liquidity-providers/Wagmi.js' import type { PoolCode } from './pool-codes/index.js' +import { promiseTimeout } from './timeout.js' // options for data fetching, such as pinning block number and memoize export type DataFetcherOptions = { @@ -61,6 +62,8 @@ export type DataFetcherOptions = { blockNumber?: bigint /** Determines if memoizer should be used or not */ memoize?: boolean + /** Determines a timeout (in ms) for fetching pools for a token pair */ + fetchPoolsTimeout?: number, } // TODO: Should be a mode on the config for DataFetcher @@ -233,12 +236,22 @@ export class DataFetcher { ) if (provider) { try { - await provider.fetchPoolsForToken( - currency0.wrapped, - currency1.wrapped, - excludePools, - options, - ) + options?.fetchPoolsTimeout + ? await promiseTimeout( + provider.fetchPoolsForToken( + currency0.wrapped, + currency1.wrapped, + excludePools, + options, + ), + options.fetchPoolsTimeout + ) + : await provider.fetchPoolsForToken( + currency0.wrapped, + currency1.wrapped, + excludePools, + options, + ) } catch { /**/ } @@ -249,11 +262,24 @@ export class DataFetcher { currency0.wrapped.sortsBefore(currency1.wrapped) ? [currency0.wrapped, currency1.wrapped] : [currency1.wrapped, currency0.wrapped] - await Promise.allSettled( - this.providers.map((p) => - p.fetchPoolsForToken(token0, token1, excludePools, options), - ), - ) + try { + options?.fetchPoolsTimeout + ? await promiseTimeout( + Promise.allSettled( + this.providers.map((p) => + p.fetchPoolsForToken(token0, token1, excludePools, options), + ), + ), + options.fetchPoolsTimeout + ) + : await Promise.allSettled( + this.providers.map((p) => + p.fetchPoolsForToken(token0, token1, excludePools, options), + ), + ) + } catch { + /**/ + } } } diff --git a/packages/sushi/src/router/timeout.test.ts b/packages/sushi/src/router/timeout.test.ts new file mode 100644 index 0000000000..a760dd56d5 --- /dev/null +++ b/packages/sushi/src/router/timeout.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest' +import { promiseTimeout } from './timeout.js' + +const sleep = async(ms: number, msg = "") => { + let _timeoutReference; + return new Promise( + resolve => _timeoutReference = setTimeout(() => resolve(msg), ms), + ).finally( + () => clearTimeout(_timeoutReference) + ); +}; + +describe('Promise Timeout', async () => { + it('should timeout', async () => { + const mainPromise = sleep(1000); + await promiseTimeout(mainPromise, 500) + .then(() => { + throw "expected to reject, but resolved" + }) + .catch(() => { + /**/ + }) + + }) + it('should NOT timeout', async () => { + const mainPromise = sleep(1000); + await promiseTimeout(mainPromise, 1500) + .then(() => { + /**/ + }) + .catch(() => { + throw "expected to resolve, but rejected" + }) + + }) +}) diff --git a/packages/sushi/src/router/timeout.ts b/packages/sushi/src/router/timeout.ts new file mode 100644 index 0000000000..1c07162f7c --- /dev/null +++ b/packages/sushi/src/router/timeout.ts @@ -0,0 +1,11 @@ +export async function promiseTimeout (promise: Promise, time: number, exception?: any) { + let timer: any; + return Promise.race([ + promise, + new Promise( + (_res, _rej) => timer = setTimeout(_rej, time, exception) + ) + ]).finally( + () => clearTimeout(timer) + ); +}; \ No newline at end of file diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ed7d524af5..7a45a0b506 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -12,7 +12,7 @@ async function testDF( ) { if (!t0 || !t1) return const start = performance.now() - await dataFetcher.fetchPoolsForToken(t0, t1) + await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { fetchPoolsTimeout: 10000 }) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) console.log( @@ -48,14 +48,6 @@ async function runTest() { 'WNATIVE', 'USDC', ) - await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - FRAX[chainId as keyof typeof FRAX], - 'SUSHI', - 'FRAX', - ) await testDF( chName, dataFetcher, From ba27aa1342b800d72aca284729221e7e1a041375 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 19:23:51 +0000 Subject: [PATCH 040/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 7a45a0b506..ecff7a03e6 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -56,6 +56,14 @@ async function runTest() { 'SUSHI', 'USDT', ) + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + USDT[chainId as keyof typeof USDT], + 'SUSHI', + 'USDT', + ) await testDF( chName, dataFetcher, From 93d0d59a3481b5dad18f9ac738341e65690cde7e Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 19:34:40 +0000 Subject: [PATCH 041/140] lint --- packages/sushi/src/router/data-fetcher.ts | 38 +++++++++---------- packages/sushi/src/router/timeout.test.ts | 27 ++++++------- packages/sushi/src/router/timeout.ts | 23 ++++++----- .../route-processor/test/DataFetcher.test.ts | 8 ++-- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 2829167e40..e5c76bcbd9 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -63,7 +63,7 @@ export type DataFetcherOptions = { /** Determines if memoizer should be used or not */ memoize?: boolean /** Determines a timeout (in ms) for fetching pools for a token pair */ - fetchPoolsTimeout?: number, + fetchPoolsTimeout?: number } // TODO: Should be a mode on the config for DataFetcher @@ -238,20 +238,20 @@ export class DataFetcher { try { options?.fetchPoolsTimeout ? await promiseTimeout( - provider.fetchPoolsForToken( + provider.fetchPoolsForToken( + currency0.wrapped, + currency1.wrapped, + excludePools, + options, + ), + options.fetchPoolsTimeout, + ) + : await provider.fetchPoolsForToken( currency0.wrapped, currency1.wrapped, excludePools, options, - ), - options.fetchPoolsTimeout - ) - : await provider.fetchPoolsForToken( - currency0.wrapped, - currency1.wrapped, - excludePools, - options, - ) + ) } catch { /**/ } @@ -262,24 +262,24 @@ export class DataFetcher { currency0.wrapped.sortsBefore(currency1.wrapped) ? [currency0.wrapped, currency1.wrapped] : [currency1.wrapped, currency0.wrapped] - try { - options?.fetchPoolsTimeout - ? await promiseTimeout( + try { + options?.fetchPoolsTimeout + ? await promiseTimeout( Promise.allSettled( this.providers.map((p) => p.fetchPoolsForToken(token0, token1, excludePools, options), ), ), - options.fetchPoolsTimeout + options.fetchPoolsTimeout, ) - : await Promise.allSettled( + : await Promise.allSettled( this.providers.map((p) => p.fetchPoolsForToken(token0, token1, excludePools, options), ), ) - } catch { - /**/ - } + } catch { + /**/ + } } } diff --git a/packages/sushi/src/router/timeout.test.ts b/packages/sushi/src/router/timeout.test.ts index a760dd56d5..611eb6d650 100644 --- a/packages/sushi/src/router/timeout.test.ts +++ b/packages/sushi/src/router/timeout.test.ts @@ -1,36 +1,33 @@ -import { describe, expect, it } from 'vitest' +import { describe, it } from 'vitest' import { promiseTimeout } from './timeout.js' -const sleep = async(ms: number, msg = "") => { - let _timeoutReference; - return new Promise( - resolve => _timeoutReference = setTimeout(() => resolve(msg), ms), - ).finally( - () => clearTimeout(_timeoutReference) - ); -}; +const sleep = async (ms: number, msg = '') => { + let _timeoutReference + return new Promise((resolve) => { + _timeoutReference = setTimeout(() => resolve(msg), ms) + return _timeoutReference + }).finally(() => clearTimeout(_timeoutReference)) +} describe('Promise Timeout', async () => { it('should timeout', async () => { - const mainPromise = sleep(1000); + const mainPromise = sleep(1000) await promiseTimeout(mainPromise, 500) .then(() => { - throw "expected to reject, but resolved" + throw 'expected to reject, but resolved' }) .catch(() => { /**/ }) - }) it('should NOT timeout', async () => { - const mainPromise = sleep(1000); + const mainPromise = sleep(1000) await promiseTimeout(mainPromise, 1500) .then(() => { /**/ }) .catch(() => { - throw "expected to resolve, but rejected" + throw 'expected to resolve, but rejected' }) - }) }) diff --git a/packages/sushi/src/router/timeout.ts b/packages/sushi/src/router/timeout.ts index 1c07162f7c..f05d41fd89 100644 --- a/packages/sushi/src/router/timeout.ts +++ b/packages/sushi/src/router/timeout.ts @@ -1,11 +1,14 @@ -export async function promiseTimeout (promise: Promise, time: number, exception?: any) { - let timer: any; +export async function promiseTimeout( + promise: Promise, + time: number, + exception?: any, +) { + let timer: any return Promise.race([ - promise, - new Promise( - (_res, _rej) => timer = setTimeout(_rej, time, exception) - ) - ]).finally( - () => clearTimeout(timer) - ); -}; \ No newline at end of file + promise, + new Promise((_res, _rej) => { + timer = setTimeout(_rej, time, exception) + return timer + }), + ]).finally(() => clearTimeout(timer)) +} diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ecff7a03e6..415494b3c4 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -12,7 +12,9 @@ async function testDF( ) { if (!t0 || !t1) return const start = performance.now() - await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { fetchPoolsTimeout: 10000 }) + await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { + fetchPoolsTimeout: 10000, + }) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) console.log( @@ -52,9 +54,9 @@ async function runTest() { chName, dataFetcher, SUSHI[chainId as keyof typeof SUSHI], - USDT[chainId as keyof typeof USDT], + FRAX[chainId as keyof typeof FRAX], 'SUSHI', - 'USDT', + 'FRAX', ) await testDF( chName, From 726ba205c57cf7f5d50a8a0376105375b231f90b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 6 May 2024 19:40:50 +0000 Subject: [PATCH 042/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 415494b3c4..779dca0aaa 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -13,7 +13,7 @@ async function testDF( if (!t0 || !t1) return const start = performance.now() await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { - fetchPoolsTimeout: 10000, + fetchPoolsTimeout: 3000, }) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) From a4b00faf97f3b0d8453ffb97e5642a4d21fb26ca Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 11 Jun 2024 15:37:32 +0000 Subject: [PATCH 043/140] init --- .../router/liquidity-providers/PancakeSwapV3.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index a252c0d7c6..b00b821891 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -6,13 +6,13 @@ import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class PancakeSwapV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.ARBITRUM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.BASE]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.BSC]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.ETHEREUM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.LINEA]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.POLYGON_ZKEVM]: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865', - [ChainId.ZKSYNC_ERA]: '0x1BB72E0CbbEA93c08f535fc7856E0338D7F7a8aB', + [ChainId.ARBITRUM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.BASE]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.BSC]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.ETHEREUM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.LINEA]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.POLYGON_ZKEVM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', + [ChainId.ZKSYNC_ERA]: '0x7f71382044A6a62595D5D357fE75CA8199123aD6', } as const const initCodeHash = { [ChainId.ARBITRUM]: From 0eb17a19ed778826d72bd3f4b6392f43e99f12c6 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 02:34:52 +0000 Subject: [PATCH 044/140] fix dex tests --- .../src/router/liquidity-providers/Elk.ts | 2 +- .../router/liquidity-providers/SushiSwapV3.ts | 6 +- .../router/liquidity-providers/TraderJoe.ts | 4 +- .../sushi/src/router/liquidity-providers/a.js | 15 ++++ .../route-processor/test/DataFetcher.test.ts | 86 +++++++++++++++---- 5 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/a.js diff --git a/packages/sushi/src/router/liquidity-providers/Elk.ts b/packages/sushi/src/router/liquidity-providers/Elk.ts index 042e033ab8..e58a1c95df 100644 --- a/packages/sushi/src/router/liquidity-providers/Elk.ts +++ b/packages/sushi/src/router/liquidity-providers/Elk.ts @@ -25,7 +25,7 @@ export class ElkProvider extends UniswapV2BaseProvider { } as const const initCodeHash = { [ChainId.AVALANCHE]: - '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + '0x33c4831a098654d3d20a78641a198ee6ffc1ceed49f2196b75bb244891c260e3', [ChainId.POLYGON]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', [ChainId.FANTOM]: diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts index 7139b54a70..fc84ea60f6 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts @@ -27,7 +27,7 @@ export class SushiSwapV3Provider extends UniswapV3BaseProvider { [ChainId.KAVA]: '0x1e9B24073183d5c6B7aE5FB4b8f0b1dd83FDC77a', [ChainId.METIS]: '0x145d82bCa93cCa2AE057D1c6f26245d1b9522E6F', [ChainId.BTTC]: '0xBBDe1d67297329148Fe1ED5e6B00114842728e65', - [ChainId.FILECOIN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', + // [ChainId.FILECOIN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // has no pools deployed [ChainId.HAQQ]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.ZETACHAIN]: '0xB45e53277a7e0F1D35f2a77160e91e25507f1763', [ChainId.BLAST]: '0x7680D4B43f3d1d54d6cfEeB2169463bFa7a6cf0d', @@ -75,8 +75,8 @@ export class SushiSwapV3Provider extends UniswapV3BaseProvider { '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.BTTC]: '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', - [ChainId.FILECOIN]: - '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + // [ChainId.FILECOIN]: + // '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.HAQQ]: '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.ZETACHAIN]: diff --git a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts index 3e215bf7cf..968e5c9b0a 100644 --- a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts +++ b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts @@ -14,9 +14,9 @@ export class TraderJoeProvider extends UniswapV2BaseProvider { [ChainId.AVALANCHE]: '0x0bbca9af0511ad1a1da383135cf3a8d2ac620e549ef9f6ae3a4c33c2fed0af91', [ChainId.ARBITRUM]: - '0x6c67ac67d0dad54be7b066edd9b4154fb5a0ab7d01232259b9ff26ebc1739ba2', - [ChainId.BSC]: '0x5c9d12e487d245c53fb0b8dd1ba2ccc48810e6b9671311502b8632e88b0d605b', + [ChainId.BSC]: + '0x75e986a1d8c57bd5530b4b59ab7dd63c4d4ad267f147e17774264956de33c282', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/a.js b/packages/sushi/src/router/liquidity-providers/a.js new file mode 100644 index 0000000000..6829417ab6 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/a.js @@ -0,0 +1,15 @@ +// const address_1 = require("@ethersproject/address"); +// const viem_1 = require("viem"); +// const code = viem_1.keccak256("0x60806040526001600c5534801561001557600080fd5b50604051469080605261241c8239604080519182900360520182208282018252600d83526c456c6b204c697175696469747960981b6020938401528151808301835260018152603160f81b908401528151808401919091527f413a7213a78dca26cdd36f94351c6afa0824098d0a31401dbdf0501d04ca8190818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055612314806101086000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a714610544578063d505accf1461054c578063dd62ed3e1461059d578063fff6cae9146105cb576101b9565b8063ba9a7a561461050e578063bc25cf7714610516578063c45a01551461053c576101b9565b80637ecebe00116100d35780637ecebe001461047557806389afcb441461049b57806395d89b41146104da578063a9059cbb146104e2576101b9565b80636a6278421461042157806370a08231146104475780637464fc3d1461046d576101b9565b806323b872dd116101665780633644e515116101405780633644e515146103db578063485cc955146103e35780635909c0d5146104115780635a3d549314610419576101b9565b806323b872dd1461037f57806330adf81f146103b5578063313ce567146103bd576101b9565b8063095ea7b311610197578063095ea7b3146103015780630dfe16811461034157806318160ddd14610365576101b9565b8063022c0d9f146101be57806306fdde031461024c5780630902f1ac146102c9575b600080fd5b61024a600480360360808110156101d457600080fd5b8135916020810135916001600160a01b03604083013516919081019060808101606082013564010000000081111561020b57600080fd5b82018360208201111561021d57600080fd5b8035906020019184600183028401116401000000008311171561023f57600080fd5b5090925090506105d3565b005b610254610b63565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028e578181015183820152602001610276565b50505050905090810190601f1680156102bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d1610b9c565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b61032d6004803603604081101561031757600080fd5b506001600160a01b038135169060200135610bc6565b604080519115158252519081900360200190f35b610349610bdd565b604080516001600160a01b039092168252519081900360200190f35b61036d610bec565b60408051918252519081900360200190f35b61032d6004803603606081101561039557600080fd5b506001600160a01b03813581169160208101359091169060400135610bf2565b61036d610c8c565b6103c5610cb0565b6040805160ff9092168252519081900360200190f35b61036d610cb5565b61024a600480360360408110156103f957600080fd5b506001600160a01b0381358116916020013516610cbb565b61036d610d60565b61036d610d66565b61036d6004803603602081101561043757600080fd5b50356001600160a01b0316610d6c565b61036d6004803603602081101561045d57600080fd5b50356001600160a01b0316611066565b61036d611078565b61036d6004803603602081101561048b57600080fd5b50356001600160a01b031661107e565b6104c1600480360360208110156104b157600080fd5b50356001600160a01b0316611090565b6040805192835260208301919091528051918290030190f35b610254611430565b61032d600480360360408110156104f857600080fd5b506001600160a01b038135169060200135611469565b61036d611476565b61024a6004803603602081101561052c57600080fd5b50356001600160a01b031661147c565b6103496115e1565b6103496115f0565b61024a600480360360e081101561056257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356115ff565b61036d600480360360408110156105b357600080fd5b506001600160a01b0381358116916020013516611827565b61024a611844565b600c54600114610618576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c558415158061062b5750600084115b61067c576040805162461bcd60e51b815260206004820152601f60248201527f456c6b3a20494e53554646494349454e545f4f55545055545f414d4f554e5400604482015290519081900360640190fd5b600080610687610b9c565b5091509150816001600160701b0316871080156106ac5750806001600160701b031686105b6106fd576040805162461bcd60e51b815260206004820152601b60248201527f456c6b3a20494e53554646494349454e545f4c49515549444954590000000000604482015290519081900360640190fd5b60065460075460009182916001600160a01b0391821691908116908916821480159061073b5750806001600160a01b0316896001600160a01b031614155b61078c576040805162461bcd60e51b815260206004820152600f60248201527f456c6b3a20494e56414c49445f544f0000000000000000000000000000000000604482015290519081900360640190fd5b8a1561079d5761079d828a8d6119a0565b89156107ae576107ae818a8c6119a0565b861561086957886001600160a01b03166307d3513a338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561085057600080fd5b505af1158015610864573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156108af57600080fd5b505afa1580156108c3573d6000803e3d6000fd5b505050506040513d60208110156108d957600080fd5b5051604080516370a0823160e01b815230600482015290519195506001600160a01b038316916370a0823191602480820192602092909190829003018186803b15801561092557600080fd5b505afa158015610939573d6000803e3d6000fd5b505050506040513d602081101561094f57600080fd5b5051925060009150506001600160701b0385168a90038311610972576000610981565b89856001600160701b03160383035b9050600089856001600160701b031603831161099e5760006109ad565b89856001600160701b03160383035b905060008211806109be5750600081115b610a0f576040805162461bcd60e51b815260206004820152601e60248201527f456c6b3a20494e53554646494349454e545f494e5055545f414d4f554e540000604482015290519081900360640190fd5b6000610a43610a2584600363ffffffff611b5316565b610a37876103e863ffffffff611b5316565b9063ffffffff611bbf16565b90506000610a5b610a2584600363ffffffff611b5316565b9050610a8c620f4240610a806001600160701b038b8116908b1663ffffffff611b5316565b9063ffffffff611b5316565b610a9c838363ffffffff611b5316565b1015610aef576040805162461bcd60e51b815260206004820152600660248201527f456c6b3a204b0000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610afd84848888611c17565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600d81526020017f456c6b204c69717569646974790000000000000000000000000000000000000081525081565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610bd3338484611df4565b5060015b92915050565b6006546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c77576001600160a01b0384166000908152600260209081526040808320338452909152902054610c52908363ffffffff611bbf16565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c82848484611e56565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b6005546001600160a01b03163314610d1a576040805162461bcd60e51b815260206004820152600e60248201527f456c6b3a20464f5242494444454e000000000000000000000000000000000000604482015290519081900360640190fd5b600680546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c54600114610db3576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c81905580610dc3610b9c565b50600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d6020811015610e4157600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d6020811015610ebe57600080fd5b505190506000610edd836001600160701b03871663ffffffff611bbf16565b90506000610efa836001600160701b03871663ffffffff611bbf16565b90506000610f088787611f10565b60005490915080610f4557610f316103e8610a37610f2c878763ffffffff611b5316565b61206e565b9850610f4060006103e86120c0565b610f94565b610f916001600160701b038916610f62868463ffffffff611b5316565b81610f6957fe5b046001600160701b038916610f84868563ffffffff611b5316565b81610f8b57fe5b04612156565b98505b60008911610fd35760405162461bcd60e51b81526004018080602001828103825260228152602001806122be6022913960400191505060405180910390fd5b610fdd8a8a6120c0565b610fe986868a8a611c17565b811561101957600854611015906001600160701b0380821691600160701b90041663ffffffff611b5316565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c546001146110d8576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c819055806110e8610b9c565b50600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d602081101561116e57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156111bc57600080fd5b505afa1580156111d0573d6000803e3d6000fd5b505050506040513d60208110156111e657600080fd5b5051306000908152600160205260408120549192506112058888611f10565b6000549091508061121c848763ffffffff611b5316565b8161122357fe5b049a5080611237848663ffffffff611b5316565b8161123e57fe5b04995060008b118015611251575060008a115b61128c5760405162461bcd60e51b815260040180806020018281038252602281526020018061229c6022913960400191505060405180910390fd5b611296308461216e565b6112a1878d8d6119a0565b6112ac868d8c6119a0565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561136857600080fd5b505afa15801561137c573d6000803e3d6000fd5b505050506040513d602081101561139257600080fd5b505193506113a285858b8b611c17565b81156113d2576008546113ce906001600160701b0380821691600160701b90041663ffffffff611b5316565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600381526020017f454c50000000000000000000000000000000000000000000000000000000000081525081565b6000610bd3338484611e56565b6103e881565b600c546001146114c1576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b039485169490931692611570928592879261156b926001600160701b03169185916370a0823191602480820192602092909190829003018186803b15801561153357600080fd5b505afa158015611547573d6000803e3d6000fd5b505050506040513d602081101561155d57600080fd5b50519063ffffffff611bbf16565b6119a0565b600854604080516370a0823160e01b815230600482015290516115d7928492879261156b92600160701b90046001600160701b0316916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561153357600080fd5b50506001600c5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611654576040805162461bcd60e51b815260206004820152600c60248201527f456c6b3a20455850495245440000000000000000000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561178a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117c05750886001600160a01b0316816001600160a01b0316145b611811576040805162461bcd60e51b815260206004820152601660248201527f456c6b3a20494e56414c49445f5349474e415455524500000000000000000000604482015290519081900360640190fd5b61181c898989611df4565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611889576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c55600654604080516370a0823160e01b81523060048201529051611999926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516008546001600160701b0380821691600160701b900416611c17565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b03167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b60208310611a665780518252601f199092019160209182019101611a47565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ac8576040519150601f19603f3d011682016040523d82523d6000602084013e611acd565b606091505b5091509150818015611afb575080511580611afb5750808060200190516020811015611af857600080fd5b50515b611b4c576040805162461bcd60e51b815260206004820152601460248201527f456c6b3a205452414e534645525f4641494c4544000000000000000000000000604482015290519081900360640190fd5b5050505050565b6000811580611b6e57505080820282828281611b6b57fe5b04145b610bd7576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610bd7576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6001600160701b038411801590611c3557506001600160701b038311155b611c86576040805162461bcd60e51b815260206004820152600d60248201527f456c6b3a204f564552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff42811691600160e01b90048116820390811615801590611cb657506001600160701b03841615155b8015611cca57506001600160701b03831615155b15611d3b578063ffffffff16611cf885611ce38661220c565b6001600160e01b03169063ffffffff61221e16565b600980546001600160e01b03929092169290920201905563ffffffff8116611d2384611ce38761220c565b600a80546001600160e01b0392909216929092020190555b600880546dffffffffffffffffffffffffffff19166001600160701b03888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff16600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054611e7f908263ffffffff611bbf16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611eb4908263ffffffff61224316565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6020811015611f8b57600080fd5b5051600b546001600160a01b03821615801594509192509061205a578015612055576000611fce610f2c6001600160701b0388811690881663ffffffff611b5316565b90506000611fdb8361206e565b905080821115612052576000612009611ffa848463ffffffff611bbf16565b6000549063ffffffff611b5316565b9050600061202e8361202286600563ffffffff611b5316565b9063ffffffff61224316565b9050600081838161203b57fe5b049050801561204e5761204e87826120c0565b5050505b50505b612066565b8015612066576000600b555b505092915050565b600060038211156120b1575080600160028204015b818110156120ab5780915060028182858161209a57fe5b0401816120a357fe5b049050612083565b506120bb565b81156120bb575060015b919050565b6000546120d3908263ffffffff61224316565b60009081556001600160a01b0383168152600160205260409020546120fe908263ffffffff61224316565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106121655781612167565b825b9392505050565b6001600160a01b038216600090815260016020526040902054612197908263ffffffff611bbf16565b6001600160a01b038316600090815260016020526040812091909155546121c4908263ffffffff611bbf16565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b0384168161223b57fe5b049392505050565b80820182811015610bd7576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe456c6b3a20494e53554646494349454e545f4c49515549444954595f4255524e4544456c6b3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a72315820c7b8221695f6e1afec12c1d28217e23f2d542d8cf1385ea326b3d79004ea100764736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429"); +// console.log(code) +// const x = address_1.getCreate2Address( +// "0x4f8bdc85E3eec5b9dE67097c3f59B6Db025d9986", +// viem_1.keccak256( +// viem_1.encodePacked( +// ['address', 'address'], +// ["0x55d398326f99059fF775485246999027B3197955", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"], +// ), +// ), +// "0x75e986a1d8c57bd5530b4b59ab7dd63c4d4ad267f147e17774264956de33c282" +// ); +// console.log(x); diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 779dca0aaa..d9f7a178ef 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,6 +1,7 @@ -import { ChainId, chainName } from 'sushi/chain' -import { FRAX, SUSHI, Token, Type, USDC, USDT, WNATIVE } from 'sushi/currency' -import { DataFetcher } from 'sushi/router' +import assert from 'assert'; +import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' +import { DAI, FRAX, SUSHI, Token, Type, USDB, USDC, USDT, WNATIVE } from 'sushi/currency' +import { DataFetcher, LiquidityProviders } from 'sushi/router' async function testDF( _chainName: string, @@ -9,11 +10,14 @@ async function testDF( t1: Type | undefined, name0: string, name1: string, -) { - if (!t0 || !t1) return +): Promise> { + const dexPools: Record = {}; + + if (!t0 || !t1) return dexPools; + const start = performance.now() await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { - fetchPoolsTimeout: 3000, + fetchPoolsTimeout: 30000, }) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) @@ -21,15 +25,32 @@ async function testDF( ` found pools(${name0}-${name1}): ${pools.size} time=${time}ms`, ) dataFetcher.providers.forEach((p) => { + const pooltype = p.getType(); const poolCodes = p.getCurrentPoolList(t0 as Token, t1 as Token) if (poolCodes.length) console.log( ` ${p.getPoolProviderName()} pools: ${poolCodes.length}`, ) + + // exclude non uni based dexes + if ( + pooltype !== LiquidityProviders.Trident + && pooltype !== LiquidityProviders.CurveSwap + && pooltype !== LiquidityProviders.NativeWrap + ) dexPools[pooltype] = poolCodes.length; }) + return dexPools; } -const chainIds = Object.values(ChainId) +// exclude test nets and chains with no pool or no dex +const excludedChains = [ + ...TESTNET_CHAIN_IDS, + ChainId.HECO, + ChainId.PALM, + ChainId.BOBA_AVAX, + ChainId.ZKSYNC_ERA +] +const chainIds = Object.values(ChainId).filter(v => excludedChains.every(e => v !== e)) async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { @@ -42,39 +63,74 @@ async function runTest() { it(`${chName}(${chainId})`, async () => { dataFetcher.startDataFetching() console.log(chName) - await testDF( + const allFoundPools = []; + allFoundPools.push(await testDF( chName, dataFetcher, WNATIVE[chainId], USDC[chainId as keyof typeof USDC], 'WNATIVE', 'USDC', - ) - await testDF( + )) + allFoundPools.push(await testDF( chName, dataFetcher, SUSHI[chainId as keyof typeof SUSHI], FRAX[chainId as keyof typeof FRAX], 'SUSHI', 'FRAX', - ) - await testDF( + )) + allFoundPools.push(await testDF( chName, dataFetcher, SUSHI[chainId as keyof typeof SUSHI], USDT[chainId as keyof typeof USDT], 'SUSHI', 'USDT', - ) - await testDF( + )) + allFoundPools.push(await testDF( chName, dataFetcher, WNATIVE[chainId], USDT[chainId as keyof typeof USDT], 'WNATIVE', 'USDT', - ) + )) + allFoundPools.push(await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDB[chainId as keyof typeof USDB], + 'WNATIVE', + 'USDB', + )) + // only for Elk dex on Moonriver + if (chainId === ChainId.MOONRIVER) allFoundPools.push(await testDF( + chName, + dataFetcher, + DAI[chainId as keyof typeof DAI], + new Token({ + chainId: ChainId.MOONRIVER, + address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + decimals: 18, + symbol: "ELK" + }), + 'DAI', + 'ELK', + )) dataFetcher.stopDataFetching() + + const fails = []; + const chainAllDexesKeys = Object.keys(allFoundPools[0]); + for (let i = 0; i < chainAllDexesKeys.length; i++) { + const key = chainAllDexesKeys[i]; + let dexPoolsCount = 0; + for (let j = 0; j < allFoundPools.length; j++) { + dexPoolsCount += (allFoundPools[j][key] ?? 0); + } + if (dexPoolsCount === 0) fails.push(key); + } + if (fails.length) assert.fail(`did not find any pools on ${chName} chain for following dexes: ${fails.join(", ")}`); }) }) }) From 9f192f11cb5b5d6852e7163bdc387ee5c8173d00 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 02:39:06 +0000 Subject: [PATCH 045/140] lint --- .../route-processor/test/DataFetcher.test.ts | 177 ++++++++++-------- 1 file changed, 104 insertions(+), 73 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index d9f7a178ef..60659d9de3 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,6 +1,16 @@ -import assert from 'assert'; +import assert from 'assert' import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' -import { DAI, FRAX, SUSHI, Token, Type, USDB, USDC, USDT, WNATIVE } from 'sushi/currency' +import { + DAI, + FRAX, + SUSHI, + Token, + Type, + USDB, + USDC, + USDT, + WNATIVE, +} from 'sushi/currency' import { DataFetcher, LiquidityProviders } from 'sushi/router' async function testDF( @@ -11,9 +21,9 @@ async function testDF( name0: string, name1: string, ): Promise> { - const dexPools: Record = {}; + const dexPools: Record = {} - if (!t0 || !t1) return dexPools; + if (!t0 || !t1) return dexPools const start = performance.now() await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { @@ -25,7 +35,7 @@ async function testDF( ` found pools(${name0}-${name1}): ${pools.size} time=${time}ms`, ) dataFetcher.providers.forEach((p) => { - const pooltype = p.getType(); + const pooltype = p.getType() const poolCodes = p.getCurrentPoolList(t0 as Token, t1 as Token) if (poolCodes.length) console.log( @@ -34,12 +44,13 @@ async function testDF( // exclude non uni based dexes if ( - pooltype !== LiquidityProviders.Trident - && pooltype !== LiquidityProviders.CurveSwap - && pooltype !== LiquidityProviders.NativeWrap - ) dexPools[pooltype] = poolCodes.length; + pooltype !== LiquidityProviders.Trident && + pooltype !== LiquidityProviders.CurveSwap && + pooltype !== LiquidityProviders.NativeWrap + ) + dexPools[pooltype] = poolCodes.length }) - return dexPools; + return dexPools } // exclude test nets and chains with no pool or no dex @@ -48,9 +59,11 @@ const excludedChains = [ ChainId.HECO, ChainId.PALM, ChainId.BOBA_AVAX, - ChainId.ZKSYNC_ERA + ChainId.ZKSYNC_ERA, ] -const chainIds = Object.values(ChainId).filter(v => excludedChains.every(e => v !== e)) +const chainIds = Object.values(ChainId).filter((v) => + excludedChains.every((e) => v !== e), +) async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { @@ -63,74 +76,92 @@ async function runTest() { it(`${chName}(${chainId})`, async () => { dataFetcher.startDataFetching() console.log(chName) - const allFoundPools = []; - allFoundPools.push(await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDC[chainId as keyof typeof USDC], - 'WNATIVE', - 'USDC', - )) - allFoundPools.push(await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - FRAX[chainId as keyof typeof FRAX], - 'SUSHI', - 'FRAX', - )) - allFoundPools.push(await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - USDT[chainId as keyof typeof USDT], - 'SUSHI', - 'USDT', - )) - allFoundPools.push(await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDT[chainId as keyof typeof USDT], - 'WNATIVE', - 'USDT', - )) - allFoundPools.push(await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDB[chainId as keyof typeof USDB], - 'WNATIVE', - 'USDB', - )) + const allFoundPools = [] + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDC[chainId as keyof typeof USDC], + 'WNATIVE', + 'USDC', + ), + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + FRAX[chainId as keyof typeof FRAX], + 'SUSHI', + 'FRAX', + ), + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + USDT[chainId as keyof typeof USDT], + 'SUSHI', + 'USDT', + ), + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDT[chainId as keyof typeof USDT], + 'WNATIVE', + 'USDT', + ), + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDB[chainId as keyof typeof USDB], + 'WNATIVE', + 'USDB', + ), + ) // only for Elk dex on Moonriver - if (chainId === ChainId.MOONRIVER) allFoundPools.push(await testDF( - chName, - dataFetcher, - DAI[chainId as keyof typeof DAI], - new Token({ - chainId: ChainId.MOONRIVER, - address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', - decimals: 18, - symbol: "ELK" - }), - 'DAI', - 'ELK', - )) + if (chainId === ChainId.MOONRIVER) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + DAI[chainId as keyof typeof DAI], + new Token({ + chainId: ChainId.MOONRIVER, + address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + decimals: 18, + symbol: 'ELK', + }), + 'DAI', + 'ELK', + ), + ) dataFetcher.stopDataFetching() - const fails = []; - const chainAllDexesKeys = Object.keys(allFoundPools[0]); + const fails = [] + const chainAllDexesKeys = Object.keys(allFoundPools[0]) for (let i = 0; i < chainAllDexesKeys.length; i++) { - const key = chainAllDexesKeys[i]; - let dexPoolsCount = 0; + const key = chainAllDexesKeys[i] + let dexPoolsCount = 0 for (let j = 0; j < allFoundPools.length; j++) { - dexPoolsCount += (allFoundPools[j][key] ?? 0); + dexPoolsCount += allFoundPools[j][key] ?? 0 } - if (dexPoolsCount === 0) fails.push(key); + if (dexPoolsCount === 0) fails.push(key) } - if (fails.length) assert.fail(`did not find any pools on ${chName} chain for following dexes: ${fails.join(", ")}`); + if (fails.length) + assert.fail( + `did not find any pools on ${chName} chain for following dexes: ${fails.join( + ', ', + )}`, + ) }) }) }) From 6deb44da4f0be57dafbd361aea3b9ad51d1fb557 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 03:14:12 +0000 Subject: [PATCH 046/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 60659d9de3..0a170c5d9f 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -26,9 +26,7 @@ async function testDF( if (!t0 || !t1) return dexPools const start = performance.now() - await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { - fetchPoolsTimeout: 30000, - }) + await dataFetcher.fetchPoolsForToken(t0, t1, undefined) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) console.log( @@ -117,16 +115,18 @@ async function runTest() { 'USDT', ), ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDB[chainId as keyof typeof USDB], - 'WNATIVE', - 'USDB', - ), - ) + // only Blast chain + if (chainId === ChainId.BLAST) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDB[chainId as keyof typeof USDB], + 'WNATIVE', + 'USDB', + ), + ) // only for Elk dex on Moonriver if (chainId === ChainId.MOONRIVER) allFoundPools.push( From d0276c5b37a8124fa1b1392aa8503d0e9b96f1d6 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 04:05:55 +0000 Subject: [PATCH 047/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 87 ++++++++++++------- 1 file changed, 54 insertions(+), 33 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 0a170c5d9f..601dbdf0f6 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -26,7 +26,9 @@ async function testDF( if (!t0 || !t1) return dexPools const start = performance.now() - await dataFetcher.fetchPoolsForToken(t0, t1, undefined) + await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { + fetchPoolsTimeout: 60000, + }) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) console.log( @@ -85,38 +87,43 @@ async function runTest() { 'USDC', ), ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - FRAX[chainId as keyof typeof FRAX], - 'SUSHI', - 'FRAX', - ), - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - USDT[chainId as keyof typeof USDT], - 'SUSHI', - 'USDT', - ), - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDT[chainId as keyof typeof USDT], - 'WNATIVE', - 'USDT', - ), - ) + + // only try remaining pairs in case there is a missing dex from the previous pairs results + if (hasMissingDex(allFoundPools)) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + FRAX[chainId as keyof typeof FRAX], + 'SUSHI', + 'FRAX', + ), + ) + if (hasMissingDex(allFoundPools)) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + USDT[chainId as keyof typeof USDT], + 'SUSHI', + 'USDT', + ), + ) + if (hasMissingDex(allFoundPools)) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDT[chainId as keyof typeof USDT], + 'WNATIVE', + 'USDT', + ), + ) // only Blast chain - if (chainId === ChainId.BLAST) + if (chainId === ChainId.BLAST && hasMissingDex(allFoundPools)) allFoundPools.push( await testDF( chName, @@ -128,7 +135,7 @@ async function runTest() { ), ) // only for Elk dex on Moonriver - if (chainId === ChainId.MOONRIVER) + if (chainId === ChainId.MOONRIVER && hasMissingDex(allFoundPools)) allFoundPools.push( await testDF( chName, @@ -167,4 +174,18 @@ async function runTest() { }) } +function hasMissingDex(dexPools: Record[]): boolean { + const dexKeys = Object.keys(dexPools[0]) + if (!dexKeys.length) return true + for (let i = 0; i < dexKeys.length; i++) { + const key = dexKeys[i] + let dexPoolsCount = 0 + for (let j = 0; j < dexPools.length; j++) { + dexPoolsCount += dexPools[j][key] ?? 0 + } + if (dexPoolsCount === 0) return true + } + return false +} + runTest() From 600d0ec2bf6c008a031eab4d97d691c88fe3aa56 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 04:16:03 +0000 Subject: [PATCH 048/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 601dbdf0f6..00fb7d8e03 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -26,9 +26,7 @@ async function testDF( if (!t0 || !t1) return dexPools const start = performance.now() - await dataFetcher.fetchPoolsForToken(t0, t1, undefined, { - fetchPoolsTimeout: 60000, - }) + await dataFetcher.fetchPoolsForToken(t0, t1, undefined) const pools = dataFetcher.getCurrentPoolCodeMap(t0, t1) const time = Math.round(performance.now() - start) console.log( From 062473ccabe70db65813d93ee59ceb4bbe650dce Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 04:38:57 +0000 Subject: [PATCH 049/140] update --- .../sushi/src/router/liquidity-providers/a.js | 15 -------- .../route-processor/test/DataFetcher.test.ts | 34 ++++++++----------- 2 files changed, 15 insertions(+), 34 deletions(-) delete mode 100644 packages/sushi/src/router/liquidity-providers/a.js diff --git a/packages/sushi/src/router/liquidity-providers/a.js b/packages/sushi/src/router/liquidity-providers/a.js deleted file mode 100644 index 6829417ab6..0000000000 --- a/packages/sushi/src/router/liquidity-providers/a.js +++ /dev/null @@ -1,15 +0,0 @@ -// const address_1 = require("@ethersproject/address"); -// const viem_1 = require("viem"); -// const code = viem_1.keccak256("0x60806040526001600c5534801561001557600080fd5b50604051469080605261241c8239604080519182900360520182208282018252600d83526c456c6b204c697175696469747960981b6020938401528151808301835260018152603160f81b908401528151808401919091527f413a7213a78dca26cdd36f94351c6afa0824098d0a31401dbdf0501d04ca8190818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055612314806101086000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a714610544578063d505accf1461054c578063dd62ed3e1461059d578063fff6cae9146105cb576101b9565b8063ba9a7a561461050e578063bc25cf7714610516578063c45a01551461053c576101b9565b80637ecebe00116100d35780637ecebe001461047557806389afcb441461049b57806395d89b41146104da578063a9059cbb146104e2576101b9565b80636a6278421461042157806370a08231146104475780637464fc3d1461046d576101b9565b806323b872dd116101665780633644e515116101405780633644e515146103db578063485cc955146103e35780635909c0d5146104115780635a3d549314610419576101b9565b806323b872dd1461037f57806330adf81f146103b5578063313ce567146103bd576101b9565b8063095ea7b311610197578063095ea7b3146103015780630dfe16811461034157806318160ddd14610365576101b9565b8063022c0d9f146101be57806306fdde031461024c5780630902f1ac146102c9575b600080fd5b61024a600480360360808110156101d457600080fd5b8135916020810135916001600160a01b03604083013516919081019060808101606082013564010000000081111561020b57600080fd5b82018360208201111561021d57600080fd5b8035906020019184600183028401116401000000008311171561023f57600080fd5b5090925090506105d3565b005b610254610b63565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028e578181015183820152602001610276565b50505050905090810190601f1680156102bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d1610b9c565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b61032d6004803603604081101561031757600080fd5b506001600160a01b038135169060200135610bc6565b604080519115158252519081900360200190f35b610349610bdd565b604080516001600160a01b039092168252519081900360200190f35b61036d610bec565b60408051918252519081900360200190f35b61032d6004803603606081101561039557600080fd5b506001600160a01b03813581169160208101359091169060400135610bf2565b61036d610c8c565b6103c5610cb0565b6040805160ff9092168252519081900360200190f35b61036d610cb5565b61024a600480360360408110156103f957600080fd5b506001600160a01b0381358116916020013516610cbb565b61036d610d60565b61036d610d66565b61036d6004803603602081101561043757600080fd5b50356001600160a01b0316610d6c565b61036d6004803603602081101561045d57600080fd5b50356001600160a01b0316611066565b61036d611078565b61036d6004803603602081101561048b57600080fd5b50356001600160a01b031661107e565b6104c1600480360360208110156104b157600080fd5b50356001600160a01b0316611090565b6040805192835260208301919091528051918290030190f35b610254611430565b61032d600480360360408110156104f857600080fd5b506001600160a01b038135169060200135611469565b61036d611476565b61024a6004803603602081101561052c57600080fd5b50356001600160a01b031661147c565b6103496115e1565b6103496115f0565b61024a600480360360e081101561056257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356115ff565b61036d600480360360408110156105b357600080fd5b506001600160a01b0381358116916020013516611827565b61024a611844565b600c54600114610618576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c558415158061062b5750600084115b61067c576040805162461bcd60e51b815260206004820152601f60248201527f456c6b3a20494e53554646494349454e545f4f55545055545f414d4f554e5400604482015290519081900360640190fd5b600080610687610b9c565b5091509150816001600160701b0316871080156106ac5750806001600160701b031686105b6106fd576040805162461bcd60e51b815260206004820152601b60248201527f456c6b3a20494e53554646494349454e545f4c49515549444954590000000000604482015290519081900360640190fd5b60065460075460009182916001600160a01b0391821691908116908916821480159061073b5750806001600160a01b0316896001600160a01b031614155b61078c576040805162461bcd60e51b815260206004820152600f60248201527f456c6b3a20494e56414c49445f544f0000000000000000000000000000000000604482015290519081900360640190fd5b8a1561079d5761079d828a8d6119a0565b89156107ae576107ae818a8c6119a0565b861561086957886001600160a01b03166307d3513a338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561085057600080fd5b505af1158015610864573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156108af57600080fd5b505afa1580156108c3573d6000803e3d6000fd5b505050506040513d60208110156108d957600080fd5b5051604080516370a0823160e01b815230600482015290519195506001600160a01b038316916370a0823191602480820192602092909190829003018186803b15801561092557600080fd5b505afa158015610939573d6000803e3d6000fd5b505050506040513d602081101561094f57600080fd5b5051925060009150506001600160701b0385168a90038311610972576000610981565b89856001600160701b03160383035b9050600089856001600160701b031603831161099e5760006109ad565b89856001600160701b03160383035b905060008211806109be5750600081115b610a0f576040805162461bcd60e51b815260206004820152601e60248201527f456c6b3a20494e53554646494349454e545f494e5055545f414d4f554e540000604482015290519081900360640190fd5b6000610a43610a2584600363ffffffff611b5316565b610a37876103e863ffffffff611b5316565b9063ffffffff611bbf16565b90506000610a5b610a2584600363ffffffff611b5316565b9050610a8c620f4240610a806001600160701b038b8116908b1663ffffffff611b5316565b9063ffffffff611b5316565b610a9c838363ffffffff611b5316565b1015610aef576040805162461bcd60e51b815260206004820152600660248201527f456c6b3a204b0000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610afd84848888611c17565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600d81526020017f456c6b204c69717569646974790000000000000000000000000000000000000081525081565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610bd3338484611df4565b5060015b92915050565b6006546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c77576001600160a01b0384166000908152600260209081526040808320338452909152902054610c52908363ffffffff611bbf16565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c82848484611e56565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b6005546001600160a01b03163314610d1a576040805162461bcd60e51b815260206004820152600e60248201527f456c6b3a20464f5242494444454e000000000000000000000000000000000000604482015290519081900360640190fd5b600680546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c54600114610db3576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c81905580610dc3610b9c565b50600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d6020811015610e4157600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d6020811015610ebe57600080fd5b505190506000610edd836001600160701b03871663ffffffff611bbf16565b90506000610efa836001600160701b03871663ffffffff611bbf16565b90506000610f088787611f10565b60005490915080610f4557610f316103e8610a37610f2c878763ffffffff611b5316565b61206e565b9850610f4060006103e86120c0565b610f94565b610f916001600160701b038916610f62868463ffffffff611b5316565b81610f6957fe5b046001600160701b038916610f84868563ffffffff611b5316565b81610f8b57fe5b04612156565b98505b60008911610fd35760405162461bcd60e51b81526004018080602001828103825260228152602001806122be6022913960400191505060405180910390fd5b610fdd8a8a6120c0565b610fe986868a8a611c17565b811561101957600854611015906001600160701b0380821691600160701b90041663ffffffff611b5316565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c546001146110d8576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c819055806110e8610b9c565b50600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d602081101561116e57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156111bc57600080fd5b505afa1580156111d0573d6000803e3d6000fd5b505050506040513d60208110156111e657600080fd5b5051306000908152600160205260408120549192506112058888611f10565b6000549091508061121c848763ffffffff611b5316565b8161122357fe5b049a5080611237848663ffffffff611b5316565b8161123e57fe5b04995060008b118015611251575060008a115b61128c5760405162461bcd60e51b815260040180806020018281038252602281526020018061229c6022913960400191505060405180910390fd5b611296308461216e565b6112a1878d8d6119a0565b6112ac868d8c6119a0565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561136857600080fd5b505afa15801561137c573d6000803e3d6000fd5b505050506040513d602081101561139257600080fd5b505193506113a285858b8b611c17565b81156113d2576008546113ce906001600160701b0380821691600160701b90041663ffffffff611b5316565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600381526020017f454c50000000000000000000000000000000000000000000000000000000000081525081565b6000610bd3338484611e56565b6103e881565b600c546001146114c1576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b039485169490931692611570928592879261156b926001600160701b03169185916370a0823191602480820192602092909190829003018186803b15801561153357600080fd5b505afa158015611547573d6000803e3d6000fd5b505050506040513d602081101561155d57600080fd5b50519063ffffffff611bbf16565b6119a0565b600854604080516370a0823160e01b815230600482015290516115d7928492879261156b92600160701b90046001600160701b0316916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561153357600080fd5b50506001600c5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611654576040805162461bcd60e51b815260206004820152600c60248201527f456c6b3a20455850495245440000000000000000000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561178a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117c05750886001600160a01b0316816001600160a01b0316145b611811576040805162461bcd60e51b815260206004820152601660248201527f456c6b3a20494e56414c49445f5349474e415455524500000000000000000000604482015290519081900360640190fd5b61181c898989611df4565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611889576040805162461bcd60e51b815260206004820152600b60248201526a115b1ace881313d0d2d15160aa1b604482015290519081900360640190fd5b6000600c55600654604080516370a0823160e01b81523060048201529051611999926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516008546001600160701b0380821691600160701b900416611c17565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b03167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b60208310611a665780518252601f199092019160209182019101611a47565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ac8576040519150601f19603f3d011682016040523d82523d6000602084013e611acd565b606091505b5091509150818015611afb575080511580611afb5750808060200190516020811015611af857600080fd5b50515b611b4c576040805162461bcd60e51b815260206004820152601460248201527f456c6b3a205452414e534645525f4641494c4544000000000000000000000000604482015290519081900360640190fd5b5050505050565b6000811580611b6e57505080820282828281611b6b57fe5b04145b610bd7576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610bd7576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6001600160701b038411801590611c3557506001600160701b038311155b611c86576040805162461bcd60e51b815260206004820152600d60248201527f456c6b3a204f564552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff42811691600160e01b90048116820390811615801590611cb657506001600160701b03841615155b8015611cca57506001600160701b03831615155b15611d3b578063ffffffff16611cf885611ce38661220c565b6001600160e01b03169063ffffffff61221e16565b600980546001600160e01b03929092169290920201905563ffffffff8116611d2384611ce38761220c565b600a80546001600160e01b0392909216929092020190555b600880546dffffffffffffffffffffffffffff19166001600160701b03888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff16600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054611e7f908263ffffffff611bbf16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611eb4908263ffffffff61224316565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6020811015611f8b57600080fd5b5051600b546001600160a01b03821615801594509192509061205a578015612055576000611fce610f2c6001600160701b0388811690881663ffffffff611b5316565b90506000611fdb8361206e565b905080821115612052576000612009611ffa848463ffffffff611bbf16565b6000549063ffffffff611b5316565b9050600061202e8361202286600563ffffffff611b5316565b9063ffffffff61224316565b9050600081838161203b57fe5b049050801561204e5761204e87826120c0565b5050505b50505b612066565b8015612066576000600b555b505092915050565b600060038211156120b1575080600160028204015b818110156120ab5780915060028182858161209a57fe5b0401816120a357fe5b049050612083565b506120bb565b81156120bb575060015b919050565b6000546120d3908263ffffffff61224316565b60009081556001600160a01b0383168152600160205260409020546120fe908263ffffffff61224316565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106121655781612167565b825b9392505050565b6001600160a01b038216600090815260016020526040902054612197908263ffffffff611bbf16565b6001600160a01b038316600090815260016020526040812091909155546121c4908263ffffffff611bbf16565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b0384168161223b57fe5b049392505050565b80820182811015610bd7576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe456c6b3a20494e53554646494349454e545f4c49515549444954595f4255524e4544456c6b3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a72315820c7b8221695f6e1afec12c1d28217e23f2d542d8cf1385ea326b3d79004ea100764736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429"); -// console.log(code) -// const x = address_1.getCreate2Address( -// "0x4f8bdc85E3eec5b9dE67097c3f59B6Db025d9986", -// viem_1.keccak256( -// viem_1.encodePacked( -// ['address', 'address'], -// ["0x55d398326f99059fF775485246999027B3197955", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"], -// ), -// ), -// "0x75e986a1d8c57bd5530b4b59ab7dd63c4d4ad267f147e17774264956de33c282" -// ); -// console.log(x); diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 00fb7d8e03..f788813725 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -33,20 +33,19 @@ async function testDF( ` found pools(${name0}-${name1}): ${pools.size} time=${time}ms`, ) dataFetcher.providers.forEach((p) => { - const pooltype = p.getType() + const dexName = p.getType() const poolCodes = p.getCurrentPoolList(t0 as Token, t1 as Token) if (poolCodes.length) console.log( ` ${p.getPoolProviderName()} pools: ${poolCodes.length}`, ) - - // exclude non uni based dexes + // non uni based dexes if ( - pooltype !== LiquidityProviders.Trident && - pooltype !== LiquidityProviders.CurveSwap && - pooltype !== LiquidityProviders.NativeWrap + dexName !== LiquidityProviders.Trident && + dexName !== LiquidityProviders.CurveSwap && + dexName !== LiquidityProviders.NativeWrap ) - dexPools[pooltype] = poolCodes.length + dexPools[dexName] = poolCodes.length }) return dexPools } @@ -86,7 +85,7 @@ async function runTest() { ), ) - // only try remaining pairs in case there is a missing dex from the previous pairs results + // try other pairs in case at least one dex found no pools if (hasMissingDex(allFoundPools)) allFoundPools.push( await testDF( @@ -120,7 +119,7 @@ async function runTest() { 'USDT', ), ) - // only Blast chain + // only for Blast chain if (chainId === ChainId.BLAST && hasMissingDex(allFoundPools)) allFoundPools.push( await testDF( @@ -152,26 +151,23 @@ async function runTest() { dataFetcher.stopDataFetching() const fails = [] - const chainAllDexesKeys = Object.keys(allFoundPools[0]) - for (let i = 0; i < chainAllDexesKeys.length; i++) { - const key = chainAllDexesKeys[i] + const chainAllDexesNames = Object.keys(allFoundPools[0]) + for (let i = 0; i < chainAllDexesNames.length; i++) { + const dexName = chainAllDexesNames[i] let dexPoolsCount = 0 for (let j = 0; j < allFoundPools.length; j++) { - dexPoolsCount += allFoundPools[j][key] ?? 0 + dexPoolsCount += allFoundPools[j][dexName] ?? 0 } - if (dexPoolsCount === 0) fails.push(key) + if (dexPoolsCount === 0) fails.push(dexName) } if (fails.length) - assert.fail( - `did not find any pools on ${chName} chain for following dexes: ${fails.join( - ', ', - )}`, - ) + assert.fail(`found no pools on ${chName} for: ${fails.join(', ')}`) }) }) }) } +// checks if all available dexes on chain have found a pool or not function hasMissingDex(dexPools: Record[]): boolean { const dexKeys = Object.keys(dexPools[0]) if (!dexKeys.length) return true From d5d4fdd30415ecb6fbccf99102357fd34452cd19 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 05:22:47 +0000 Subject: [PATCH 050/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index f788813725..5f1f365f93 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -151,7 +151,11 @@ async function runTest() { dataFetcher.stopDataFetching() const fails = [] - const chainAllDexesNames = Object.keys(allFoundPools[0]) + const chainAllDexesNames = allFoundPools.find( + (v) => Object.keys(v).length > 0, + ) + if (!chainAllDexesNames) + assert.fail(`found no pools on ${chName} for all dexes`) for (let i = 0; i < chainAllDexesNames.length; i++) { const dexName = chainAllDexesNames[i] let dexPoolsCount = 0 @@ -169,8 +173,8 @@ async function runTest() { // checks if all available dexes on chain have found a pool or not function hasMissingDex(dexPools: Record[]): boolean { - const dexKeys = Object.keys(dexPools[0]) - if (!dexKeys.length) return true + const dexKeys = dexPools.find((v) => Object.keys(v).length > 0) + if (!dexKeys) return true for (let i = 0; i < dexKeys.length; i++) { const key = dexKeys[i] let dexPoolsCount = 0 From 18b7405e4333e5052e1c4e8880101736228dadd0 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 18 Jun 2024 23:51:15 +0000 Subject: [PATCH 051/140] update --- .../sushi/src/currency/token-addresses.ts | 3 + .../liquidity-providers/PancakeSwapV3.ts | 2 +- .../router/liquidity-providers/Solarbeam.ts | 7 +- .../router/liquidity-providers/ThrusterV3.ts | 2 +- .../route-processor/test/DataFetcher.test.ts | 160 +++++++++++------- 5 files changed, 112 insertions(+), 62 deletions(-) diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 5940308846..2ffc439e0f 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -450,6 +450,8 @@ export const USDC_ADDRESS = { [ChainId.FILECOIN]: axlUSDC_ADDRESS[ChainId.FILECOIN], [ChainId.ZETACHAIN]: '0x0cbe0dF132a6c6B4a2974Fa1b7Fb953CF0Cc798a', [ChainId.CRONOS]: '0xc21223249CA28397B4B6541dfFaEcC539BfF0c59', + [ChainId.FANTOM]: '0xd9820a17053d6314B20642E465a84Bf01a3D64f5', + [ChainId.MOONBEAM]: '0x8f552a71EFE5eeFc207Bf75485b356A0b3f01eC9', } as const export const USDT_ADDRESS = { @@ -512,6 +514,7 @@ export const DAI_ADDRESS = { [ChainId.BASE]: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb', [ChainId.SCROLL]: '0xcA77eB3fEFe3725Dc33bccB54eDEFc3D9f764f97', [ChainId.FILECOIN]: axlDAI_ADDRESS[ChainId.FILECOIN], + [ChainId.FANTOM]: '0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E', } as const export const MIM_ADDRESS = { diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index b00b821891..1c5462dec2 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -45,6 +45,6 @@ export class PancakeSwapV3Provider extends UniswapV3BaseProvider { return LiquidityProviders.PancakeSwapV3 } getPoolProviderName(): string { - return 'PancackeSwapV3' + return 'PancakeSwapV3' } } diff --git a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts index 3382b209e2..e8c179bf04 100644 --- a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts +++ b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts @@ -6,11 +6,14 @@ import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class SolarbeamProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.MOONBEAM]: '0x19B85ae92947E0725d5265fFB3389e7E4F191FDa', + [ChainId.MOONRIVER]: '0x049581aEB6Fe262727f290165C29BDAB065a1B68', + // [ChainId.MOONBEAM]: '0x19B85ae92947E0725d5265fFB3389e7E4F191FDa', } as const const initCodeHash = { - [ChainId.MOONBEAM]: + [ChainId.MOONRIVER]: '0x9a100ded5f254443fbd264cb7e87831e398a8b642e061670a9bc35ba27293dbf', + // [ChainId.MOONBEAM]: + // '0x36b89359c46a8b622814170939bcaa0d3c05c32c3ad83cac4d4217e1a0edf5fa', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts index d1d7dffd0b..ab7b3def22 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -6,7 +6,7 @@ import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class ThrusterV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.BLAST]: '0x71b08f13B3c3aF35aAdEb3949AFEb1ded1016127', + [ChainId.BLAST]: '0xa08ae3d3f4dA51C22d3c041E468bdF4C61405AaB', } as const const initCodeHash = { [ChainId.BLAST]: diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 5f1f365f93..ff04793946 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -50,6 +50,25 @@ async function testDF( return dexPools } +// checks if all available dexes on a chain have found a pool or not and returns the missing dexes names +function reportMissingDexes(reports: Record[]): { + hasMissingDex: boolean + missingDexNames: string[] +} { + const dexNames = reports.map((v) => Object.keys(v)).find((v) => v.length > 0) + if (!dexNames) return { hasMissingDex: true, missingDexNames: [] } + + const missingDexNames = [] + for (const name of dexNames) { + let poolsCount = 0 + for (const element of reports) poolsCount += element[name] ?? 0 + if (poolsCount === 0) missingDexNames.push(name) + } + + if (missingDexNames.length) return { hasMissingDex: true, missingDexNames } + else return { hasMissingDex: false, missingDexNames } +} + // exclude test nets and chains with no pool or no dex const excludedChains = [ ...TESTNET_CHAIN_IDS, @@ -73,7 +92,11 @@ async function runTest() { it(`${chName}(${chainId})`, async () => { dataFetcher.startDataFetching() console.log(chName) + const allFoundPools = [] + + // a pool with this pair is available in most dexes and chains, but some may not have this, so + // for those other pairs are tried if happened to find a missing dex from previous results allFoundPools.push( await testDF( chName, @@ -85,54 +108,62 @@ async function runTest() { ), ) - // try other pairs in case at least one dex found no pools - if (hasMissingDex(allFoundPools)) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - FRAX[chainId as keyof typeof FRAX], - 'SUSHI', - 'FRAX', - ), - ) - if (hasMissingDex(allFoundPools)) + // from here on, only try a new pair in case there is a missing dex from previous pair: + // only for Dfyn and JetSwap on fantom chain + if ( + chainId === ChainId.FANTOM && + reportMissingDexes(allFoundPools).hasMissingDex + ) allFoundPools.push( await testDF( chName, dataFetcher, - SUSHI[chainId as keyof typeof SUSHI], - USDT[chainId as keyof typeof USDT], - 'SUSHI', - 'USDT', + WNATIVE[chainId], + DAI[chainId as keyof typeof DAI], + 'WNATIVE', + 'DAI', ), ) - if (hasMissingDex(allFoundPools)) + // only for Blast chain + if ( + chainId === ChainId.BLAST && + reportMissingDexes(allFoundPools).hasMissingDex + ) allFoundPools.push( await testDF( chName, dataFetcher, WNATIVE[chainId], - USDT[chainId as keyof typeof USDT], + USDB[chainId as keyof typeof USDB], 'WNATIVE', - 'USDT', + 'USDB', ), ) - // only for Blast chain - if (chainId === ChainId.BLAST && hasMissingDex(allFoundPools)) + // only for Moonbeam chain + if ( + chainId === ChainId.MOONBEAM && + reportMissingDexes(allFoundPools).hasMissingDex + ) allFoundPools.push( await testDF( chName, dataFetcher, - WNATIVE[chainId], - USDB[chainId as keyof typeof USDB], - 'WNATIVE', - 'USDB', + new Token({ + chainId: ChainId.MOONBEAM, + address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', + decimals: 18, + symbol: 'BUSD', + }), + USDC[chainId as keyof typeof USDC], + 'USDC', + 'BUSD', ), ) - // only for Elk dex on Moonriver - if (chainId === ChainId.MOONRIVER && hasMissingDex(allFoundPools)) + // only for Elk dex on Moonriver since it only has 1 pool with these pair + if ( + chainId === ChainId.MOONRIVER && + reportMissingDexes(allFoundPools).hasMissingDex + ) allFoundPools.push( await testDF( chName, @@ -148,42 +179,55 @@ async function runTest() { 'ELK', ), ) + if (reportMissingDexes(allFoundPools).hasMissingDex) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDT[chainId as keyof typeof USDT], + 'WNATIVE', + 'USDT', + ), + ) + if (reportMissingDexes(allFoundPools).hasMissingDex) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + FRAX[chainId as keyof typeof FRAX], + 'SUSHI', + 'FRAX', + ), + ) + if (reportMissingDexes(allFoundPools).hasMissingDex) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + USDT[chainId as keyof typeof USDT], + 'SUSHI', + 'USDT', + ), + ) + dataFetcher.stopDataFetching() - const fails = [] - const chainAllDexesNames = allFoundPools.find( - (v) => Object.keys(v).length > 0, - ) - if (!chainAllDexesNames) - assert.fail(`found no pools on ${chName} for all dexes`) - for (let i = 0; i < chainAllDexesNames.length; i++) { - const dexName = chainAllDexesNames[i] - let dexPoolsCount = 0 - for (let j = 0; j < allFoundPools.length; j++) { - dexPoolsCount += allFoundPools[j][dexName] ?? 0 - } - if (dexPoolsCount === 0) fails.push(dexName) + const { hasMissingDex, missingDexNames } = + reportMissingDexes(allFoundPools) + if (hasMissingDex) { + if (!missingDexNames.length) + assert.fail(`found no pools for all available dexes on ${chName}`) + else + assert.fail( + `found no pools on ${chName} for: ${missingDexNames.join(', ')}`, + ) } - if (fails.length) - assert.fail(`found no pools on ${chName} for: ${fails.join(', ')}`) }) }) }) } -// checks if all available dexes on chain have found a pool or not -function hasMissingDex(dexPools: Record[]): boolean { - const dexKeys = dexPools.find((v) => Object.keys(v).length > 0) - if (!dexKeys) return true - for (let i = 0; i < dexKeys.length; i++) { - const key = dexKeys[i] - let dexPoolsCount = 0 - for (let j = 0; j < dexPools.length; j++) { - dexPoolsCount += dexPools[j][key] ?? 0 - } - if (dexPoolsCount === 0) return true - } - return false -} - runTest() From bcf95c382cb1787b38b770f2fa1176de46fb4d3f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 01:32:18 +0000 Subject: [PATCH 052/140] update --- .../sushi/src/router/liquidity-providers/SushiSwapV3.ts | 6 +++--- protocols/route-processor/test/DataFetcher.test.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts index fc84ea60f6..7139b54a70 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts @@ -27,7 +27,7 @@ export class SushiSwapV3Provider extends UniswapV3BaseProvider { [ChainId.KAVA]: '0x1e9B24073183d5c6B7aE5FB4b8f0b1dd83FDC77a', [ChainId.METIS]: '0x145d82bCa93cCa2AE057D1c6f26245d1b9522E6F', [ChainId.BTTC]: '0xBBDe1d67297329148Fe1ED5e6B00114842728e65', - // [ChainId.FILECOIN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // has no pools deployed + [ChainId.FILECOIN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.HAQQ]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.ZETACHAIN]: '0xB45e53277a7e0F1D35f2a77160e91e25507f1763', [ChainId.BLAST]: '0x7680D4B43f3d1d54d6cfEeB2169463bFa7a6cf0d', @@ -75,8 +75,8 @@ export class SushiSwapV3Provider extends UniswapV3BaseProvider { '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.BTTC]: '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', - // [ChainId.FILECOIN]: - // '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + [ChainId.FILECOIN]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.HAQQ]: '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', [ChainId.ZETACHAIN]: diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ff04793946..db06c383bf 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -39,7 +39,7 @@ async function testDF( console.log( ` ${p.getPoolProviderName()} pools: ${poolCodes.length}`, ) - // non uni based dexes + // ignore non uni dexes if ( dexName !== LiquidityProviders.Trident && dexName !== LiquidityProviders.CurveSwap && From 0571dda43cdd530fc0e1a7db429f4338c5db450c Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 02:41:54 +0000 Subject: [PATCH 053/140] update elk --- packages/sushi/src/config/sushiswap-v2.ts | 8 ++-- .../src/router/liquidity-providers/Elk.ts | 32 ++++++++++---- .../route-processor/test/DataFetcher.test.ts | 42 ++++++++++++++----- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/packages/sushi/src/config/sushiswap-v2.ts b/packages/sushi/src/config/sushiswap-v2.ts index 9f298a6d81..fe897ff831 100644 --- a/packages/sushi/src/config/sushiswap-v2.ts +++ b/packages/sushi/src/config/sushiswap-v2.ts @@ -20,7 +20,7 @@ export const SUSHISWAP_V2_SUPPORTED_CHAIN_IDS = [ ChainId.HAQQ, ChainId.HARMONY, // ChainId.HARMONY_TESTNET, - ChainId.HECO, + // ChainId.HECO, // ChainId.HECO_TESTNET, ChainId.MOONBEAM, ChainId.MOONRIVER, @@ -92,8 +92,8 @@ export const SUSHISWAP_V2_INIT_CODE_HASH: Record< '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', [ChainId.AVALANCHE_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', - [ChainId.HECO]: - '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', + // [ChainId.HECO]: + // '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', // [ChainId.HECO_TESTNET]: // '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', [ChainId.HARMONY]: @@ -173,7 +173,7 @@ export const SUSHISWAP_V2_FACTORY_ADDRESS: Record< [ChainId.AVALANCHE]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.AVALANCHE_TESTNET]: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', [ChainId.HAQQ]: '0xB45e53277a7e0F1D35f2a77160e91e25507f1763', - [ChainId.HECO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', + // [ChainId.HECO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // [ChainId.HECO_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.HARMONY]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // [ChainId.HARMONY_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', diff --git a/packages/sushi/src/router/liquidity-providers/Elk.ts b/packages/sushi/src/router/liquidity-providers/Elk.ts index e58a1c95df..0cac6fa93b 100644 --- a/packages/sushi/src/router/liquidity-providers/Elk.ts +++ b/packages/sushi/src/router/liquidity-providers/Elk.ts @@ -18,10 +18,14 @@ export class ElkProvider extends UniswapV2BaseProvider { [ChainId.ARBITRUM]: '0xA59B2044EAFD15ee4deF138D410d764c9023E1F0', [ChainId.OPTIMISM]: '0xedfad3a0F42A8920B011bb0332aDe632e552d846', [ChainId.KAVA]: '0xC012C4b3d253A8F22d5e4ADA67ea2236FF9778fc', - // [ChainId.BTTC]: '0xc06348AEE3f3E92eE452816E0D3F25C919F6fB04' - // [ChainId.HARMONY]: '0xCdde1AbfF5Ae3Cbfbdb55c1e866Ac56380e18720', - // [ChainId.HECO]: '0x997fCE9164D630CC58eE366d4D275B9D773d54A4', - // [ChainId.OKEX]: '0x1116f8B82028324f2065078b4ff6b47F1Cc22B97', + [ChainId.BTTC]: '0xc06348AEE3f3E92eE452816E0D3F25C919F6fB04', + [ChainId.HARMONY]: '0xCdde1AbfF5Ae3Cbfbdb55c1e866Ac56380e18720', + [ChainId.HECO]: '0x997fCE9164D630CC58eE366d4D275B9D773d54A4', + [ChainId.OKEX]: '0x997fCE9164D630CC58eE366d4D275B9D773d54A4', + [ChainId.CRONOS]: '0xEEa0e2830D09D8786Cb9F484cA20898b61819ef1', + [ChainId.METIS]: '0xfbb4E52FEcc90924c79F980eb24a9794ae4aFFA4', + [ChainId.BASE]: '0xfbb4E52FEcc90924c79F980eb24a9794ae4aFFA4', + [ChainId.LINEA]: '0xfbb4E52FEcc90924c79F980eb24a9794ae4aFFA4', } as const const initCodeHash = { [ChainId.AVALANCHE]: @@ -48,10 +52,22 @@ export class ElkProvider extends UniswapV2BaseProvider { '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', [ChainId.KAVA]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', - // [ChainId.BTTC]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', - // [ChainId.HARMONY]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', - // [ChainId.HECO]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', - // [ChainId.OKEX]: '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.BTTC]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.HARMONY]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.HECO]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.OKEX]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.CRONOS]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.METIS]: + '0x074ce6e2b043b11e990c9b71d400ce5b2c39c96ddad65144d0a879d31c2bbaf9', + [ChainId.BASE]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', + [ChainId.LINEA]: + '0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index db06c383bf..f8e0439540 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -70,17 +70,17 @@ function reportMissingDexes(reports: Record[]): { } // exclude test nets and chains with no pool or no dex -const excludedChains = [ - ...TESTNET_CHAIN_IDS, - ChainId.HECO, - ChainId.PALM, - ChainId.BOBA_AVAX, - ChainId.ZKSYNC_ERA, -] -const chainIds = Object.values(ChainId).filter((v) => - excludedChains.every((e) => v !== e), -) - +// const excludedChains = [ +// ...TESTNET_CHAIN_IDS, +// ChainId.HECO, +// ChainId.PALM, +// ChainId.BOBA_AVAX, +// ChainId.ZKSYNC_ERA, +// ] +// const chainIds = Object.values(ChainId).filter((v) => +// excludedChains.every((e) => v !== e), +// ) +const chainIds = [ChainId.HECO] async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { chainIds.forEach((chainId) => { @@ -179,6 +179,26 @@ async function runTest() { 'ELK', ), ) + // only for Elk dex on HECO + if ( + chainId === ChainId.HECO && + reportMissingDexes(allFoundPools).hasMissingDex + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + USDT[chainId as keyof typeof USDT], + new Token({ + chainId: ChainId.HECO, + address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + decimals: 18, + symbol: 'ELK', + }), + 'USDT', + 'ELK', + ), + ) if (reportMissingDexes(allFoundPools).hasMissingDex) allFoundPools.push( await testDF( From ef08a7aaa74f1ad20ae0024710ea075dfb65eb55 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 02:43:52 +0000 Subject: [PATCH 054/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index f8e0439540..6c607b1ba1 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' +import { ChainId, chainName } from 'sushi/chain' import { DAI, FRAX, From 1ddb7a85c1301874fd9703183413656b6332ab09 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 02:47:38 +0000 Subject: [PATCH 055/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 142 +++++++++--------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 6c607b1ba1..51fdff5df8 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,12 +1,12 @@ import assert from 'assert' import { ChainId, chainName } from 'sushi/chain' import { - DAI, + // DAI, FRAX, SUSHI, Token, Type, - USDB, + // USDB, USDC, USDT, WNATIVE, @@ -110,75 +110,75 @@ async function runTest() { // from here on, only try a new pair in case there is a missing dex from previous pair: // only for Dfyn and JetSwap on fantom chain - if ( - chainId === ChainId.FANTOM && - reportMissingDexes(allFoundPools).hasMissingDex - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - DAI[chainId as keyof typeof DAI], - 'WNATIVE', - 'DAI', - ), - ) - // only for Blast chain - if ( - chainId === ChainId.BLAST && - reportMissingDexes(allFoundPools).hasMissingDex - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - WNATIVE[chainId], - USDB[chainId as keyof typeof USDB], - 'WNATIVE', - 'USDB', - ), - ) - // only for Moonbeam chain - if ( - chainId === ChainId.MOONBEAM && - reportMissingDexes(allFoundPools).hasMissingDex - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - new Token({ - chainId: ChainId.MOONBEAM, - address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', - decimals: 18, - symbol: 'BUSD', - }), - USDC[chainId as keyof typeof USDC], - 'USDC', - 'BUSD', - ), - ) - // only for Elk dex on Moonriver since it only has 1 pool with these pair - if ( - chainId === ChainId.MOONRIVER && - reportMissingDexes(allFoundPools).hasMissingDex - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - DAI[chainId as keyof typeof DAI], - new Token({ - chainId: ChainId.MOONRIVER, - address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', - decimals: 18, - symbol: 'ELK', - }), - 'DAI', - 'ELK', - ), - ) + // if ( + // chainId === ChainId.FANTOM && + // reportMissingDexes(allFoundPools).hasMissingDex + // ) + // allFoundPools.push( + // await testDF( + // chName, + // dataFetcher, + // WNATIVE[chainId], + // DAI[chainId as keyof typeof DAI], + // 'WNATIVE', + // 'DAI', + // ), + // ) + // // only for Blast chain + // if ( + // chainId === ChainId.BLAST && + // reportMissingDexes(allFoundPools).hasMissingDex + // ) + // allFoundPools.push( + // await testDF( + // chName, + // dataFetcher, + // WNATIVE[chainId], + // USDB[chainId as keyof typeof USDB], + // 'WNATIVE', + // 'USDB', + // ), + // ) + // // only for Moonbeam chain + // if ( + // chainId === ChainId.MOONBEAM && + // reportMissingDexes(allFoundPools).hasMissingDex + // ) + // allFoundPools.push( + // await testDF( + // chName, + // dataFetcher, + // new Token({ + // chainId: ChainId.MOONBEAM, + // address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', + // decimals: 18, + // symbol: 'BUSD', + // }), + // USDC[chainId as keyof typeof USDC], + // 'USDC', + // 'BUSD', + // ), + // ) + // // only for Elk dex on Moonriver since it only has 1 pool with these pair + // if ( + // chainId === ChainId.MOONRIVER && + // reportMissingDexes(allFoundPools).hasMissingDex + // ) + // allFoundPools.push( + // await testDF( + // chName, + // dataFetcher, + // DAI[chainId as keyof typeof DAI], + // new Token({ + // chainId: ChainId.MOONRIVER, + // address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + // decimals: 18, + // symbol: 'ELK', + // }), + // 'DAI', + // 'ELK', + // ), + // ) // only for Elk dex on HECO if ( chainId === ChainId.HECO && From 1d09621d9e9f3e7ce8c53293244449805ce3152c Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 02:50:03 +0000 Subject: [PATCH 056/140] update --- packages/sushi/src/config/sushiswap-v2.ts | 2 +- .../route-processor/test/DataFetcher.test.ts | 142 +++++++++--------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/packages/sushi/src/config/sushiswap-v2.ts b/packages/sushi/src/config/sushiswap-v2.ts index fe897ff831..4370db0e78 100644 --- a/packages/sushi/src/config/sushiswap-v2.ts +++ b/packages/sushi/src/config/sushiswap-v2.ts @@ -224,7 +224,7 @@ export const SUSHISWAP_V2_ROUTER_ADDRESS: Record< // [ChainId.ARBITRUM_TESTNET]: '', [ChainId.AVALANCHE]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', [ChainId.AVALANCHE_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', - [ChainId.HECO]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', + // [ChainId.HECO]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', // [ChainId.HECO_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', [ChainId.HARMONY]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', // [ChainId.HARMONY_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 51fdff5df8..6c607b1ba1 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,12 +1,12 @@ import assert from 'assert' import { ChainId, chainName } from 'sushi/chain' import { - // DAI, + DAI, FRAX, SUSHI, Token, Type, - // USDB, + USDB, USDC, USDT, WNATIVE, @@ -110,75 +110,75 @@ async function runTest() { // from here on, only try a new pair in case there is a missing dex from previous pair: // only for Dfyn and JetSwap on fantom chain - // if ( - // chainId === ChainId.FANTOM && - // reportMissingDexes(allFoundPools).hasMissingDex - // ) - // allFoundPools.push( - // await testDF( - // chName, - // dataFetcher, - // WNATIVE[chainId], - // DAI[chainId as keyof typeof DAI], - // 'WNATIVE', - // 'DAI', - // ), - // ) - // // only for Blast chain - // if ( - // chainId === ChainId.BLAST && - // reportMissingDexes(allFoundPools).hasMissingDex - // ) - // allFoundPools.push( - // await testDF( - // chName, - // dataFetcher, - // WNATIVE[chainId], - // USDB[chainId as keyof typeof USDB], - // 'WNATIVE', - // 'USDB', - // ), - // ) - // // only for Moonbeam chain - // if ( - // chainId === ChainId.MOONBEAM && - // reportMissingDexes(allFoundPools).hasMissingDex - // ) - // allFoundPools.push( - // await testDF( - // chName, - // dataFetcher, - // new Token({ - // chainId: ChainId.MOONBEAM, - // address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', - // decimals: 18, - // symbol: 'BUSD', - // }), - // USDC[chainId as keyof typeof USDC], - // 'USDC', - // 'BUSD', - // ), - // ) - // // only for Elk dex on Moonriver since it only has 1 pool with these pair - // if ( - // chainId === ChainId.MOONRIVER && - // reportMissingDexes(allFoundPools).hasMissingDex - // ) - // allFoundPools.push( - // await testDF( - // chName, - // dataFetcher, - // DAI[chainId as keyof typeof DAI], - // new Token({ - // chainId: ChainId.MOONRIVER, - // address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', - // decimals: 18, - // symbol: 'ELK', - // }), - // 'DAI', - // 'ELK', - // ), - // ) + if ( + chainId === ChainId.FANTOM && + reportMissingDexes(allFoundPools).hasMissingDex + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + DAI[chainId as keyof typeof DAI], + 'WNATIVE', + 'DAI', + ), + ) + // only for Blast chain + if ( + chainId === ChainId.BLAST && + reportMissingDexes(allFoundPools).hasMissingDex + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + WNATIVE[chainId], + USDB[chainId as keyof typeof USDB], + 'WNATIVE', + 'USDB', + ), + ) + // only for Moonbeam chain + if ( + chainId === ChainId.MOONBEAM && + reportMissingDexes(allFoundPools).hasMissingDex + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + new Token({ + chainId: ChainId.MOONBEAM, + address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', + decimals: 18, + symbol: 'BUSD', + }), + USDC[chainId as keyof typeof USDC], + 'USDC', + 'BUSD', + ), + ) + // only for Elk dex on Moonriver since it only has 1 pool with these pair + if ( + chainId === ChainId.MOONRIVER && + reportMissingDexes(allFoundPools).hasMissingDex + ) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + DAI[chainId as keyof typeof DAI], + new Token({ + chainId: ChainId.MOONRIVER, + address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + decimals: 18, + symbol: 'ELK', + }), + 'DAI', + 'ELK', + ), + ) // only for Elk dex on HECO if ( chainId === ChainId.HECO && From b73a034b05757f76e2822b722b517794fb490ae9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 02:57:43 +0000 Subject: [PATCH 057/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 6c607b1ba1..db06c383bf 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { ChainId, chainName } from 'sushi/chain' +import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' import { DAI, FRAX, @@ -70,17 +70,17 @@ function reportMissingDexes(reports: Record[]): { } // exclude test nets and chains with no pool or no dex -// const excludedChains = [ -// ...TESTNET_CHAIN_IDS, -// ChainId.HECO, -// ChainId.PALM, -// ChainId.BOBA_AVAX, -// ChainId.ZKSYNC_ERA, -// ] -// const chainIds = Object.values(ChainId).filter((v) => -// excludedChains.every((e) => v !== e), -// ) -const chainIds = [ChainId.HECO] +const excludedChains = [ + ...TESTNET_CHAIN_IDS, + ChainId.HECO, + ChainId.PALM, + ChainId.BOBA_AVAX, + ChainId.ZKSYNC_ERA, +] +const chainIds = Object.values(ChainId).filter((v) => + excludedChains.every((e) => v !== e), +) + async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { chainIds.forEach((chainId) => { @@ -179,26 +179,6 @@ async function runTest() { 'ELK', ), ) - // only for Elk dex on HECO - if ( - chainId === ChainId.HECO && - reportMissingDexes(allFoundPools).hasMissingDex - ) - allFoundPools.push( - await testDF( - chName, - dataFetcher, - USDT[chainId as keyof typeof USDT], - new Token({ - chainId: ChainId.HECO, - address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', - decimals: 18, - symbol: 'ELK', - }), - 'USDT', - 'ELK', - ), - ) if (reportMissingDexes(allFoundPools).hasMissingDex) allFoundPools.push( await testDF( From 246188e19398bebe09825b575fbc14befd2ecedd Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 03:21:14 +0000 Subject: [PATCH 058/140] update --- .../sushi/src/router/liquidity-providers/Elk.ts | 2 +- .../route-processor/test/DataFetcher.test.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/Elk.ts b/packages/sushi/src/router/liquidity-providers/Elk.ts index 0cac6fa93b..9af43c7cbb 100644 --- a/packages/sushi/src/router/liquidity-providers/Elk.ts +++ b/packages/sushi/src/router/liquidity-providers/Elk.ts @@ -21,7 +21,7 @@ export class ElkProvider extends UniswapV2BaseProvider { [ChainId.BTTC]: '0xc06348AEE3f3E92eE452816E0D3F25C919F6fB04', [ChainId.HARMONY]: '0xCdde1AbfF5Ae3Cbfbdb55c1e866Ac56380e18720', [ChainId.HECO]: '0x997fCE9164D630CC58eE366d4D275B9D773d54A4', - [ChainId.OKEX]: '0x997fCE9164D630CC58eE366d4D275B9D773d54A4', + [ChainId.OKEX]: '0x1116f8B82028324f2065078b4ff6b47F1Cc22B97', [ChainId.CRONOS]: '0xEEa0e2830D09D8786Cb9F484cA20898b61819ef1', [ChainId.METIS]: '0xfbb4E52FEcc90924c79F980eb24a9794ae4aFFA4', [ChainId.BASE]: '0xfbb4E52FEcc90924c79F980eb24a9794ae4aFFA4', diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index db06c383bf..b6b9bf447c 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -39,7 +39,7 @@ async function testDF( console.log( ` ${p.getPoolProviderName()} pools: ${poolCodes.length}`, ) - // ignore non uni dexes + // ignore non uni protocol based dexes if ( dexName !== LiquidityProviders.Trident && dexName !== LiquidityProviders.CurveSwap && @@ -69,7 +69,7 @@ function reportMissingDexes(reports: Record[]): { else return { hasMissingDex: false, missingDexNames } } -// exclude test nets and chains with no pool or no dex +// exclude test nets and chains with no dex/pool const excludedChains = [ ...TESTNET_CHAIN_IDS, ChainId.HECO, @@ -92,11 +92,10 @@ async function runTest() { it(`${chName}(${chainId})`, async () => { dataFetcher.startDataFetching() console.log(chName) - const allFoundPools = [] // a pool with this pair is available in most dexes and chains, but some may not have this, so - // for those other pairs are tried if happened to find a missing dex from previous results + // for those, other pairs are tried if there happened to be a missing dex from previous results allFoundPools.push( await testDF( chName, @@ -108,7 +107,6 @@ async function runTest() { ), ) - // from here on, only try a new pair in case there is a missing dex from previous pair: // only for Dfyn and JetSwap on fantom chain if ( chainId === ChainId.FANTOM && @@ -124,6 +122,7 @@ async function runTest() { 'DAI', ), ) + // only for Blast chain if ( chainId === ChainId.BLAST && @@ -139,6 +138,7 @@ async function runTest() { 'USDB', ), ) + // only for Moonbeam chain if ( chainId === ChainId.MOONBEAM && @@ -159,6 +159,7 @@ async function runTest() { 'BUSD', ), ) + // only for Elk dex on Moonriver since it only has 1 pool with these pair if ( chainId === ChainId.MOONRIVER && @@ -179,6 +180,8 @@ async function runTest() { 'ELK', ), ) + + // shared pairs for all chains and dexes if (reportMissingDexes(allFoundPools).hasMissingDex) allFoundPools.push( await testDF( @@ -190,6 +193,7 @@ async function runTest() { 'USDT', ), ) + if (reportMissingDexes(allFoundPools).hasMissingDex) allFoundPools.push( await testDF( @@ -201,6 +205,7 @@ async function runTest() { 'FRAX', ), ) + if (reportMissingDexes(allFoundPools).hasMissingDex) allFoundPools.push( await testDF( From a1a7d4bb41046f99ca998b9aeb1370ece4235882 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 04:17:00 +0000 Subject: [PATCH 059/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index b6b9bf447c..10e83ff5ab 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -69,7 +69,7 @@ function reportMissingDexes(reports: Record[]): { else return { hasMissingDex: false, missingDexNames } } -// exclude test nets and chains with no dex/pool +// exclude testnets and unsupported chains (chains with no dex/pool) const excludedChains = [ ...TESTNET_CHAIN_IDS, ChainId.HECO, @@ -160,7 +160,7 @@ async function runTest() { ), ) - // only for Elk dex on Moonriver since it only has 1 pool with these pair + // only for Elk dex on Moonriver since it only has 1 pool deployed which is with following pair if ( chainId === ChainId.MOONRIVER && reportMissingDexes(allFoundPools).hasMissingDex From 00101a06d2b4682fac620fd10ac013cc6f204a4d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 19 Jun 2024 04:43:41 +0000 Subject: [PATCH 060/140] Update sushiswap-v2.ts --- packages/sushi/src/config/sushiswap-v2.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/sushi/src/config/sushiswap-v2.ts b/packages/sushi/src/config/sushiswap-v2.ts index 4370db0e78..9f298a6d81 100644 --- a/packages/sushi/src/config/sushiswap-v2.ts +++ b/packages/sushi/src/config/sushiswap-v2.ts @@ -20,7 +20,7 @@ export const SUSHISWAP_V2_SUPPORTED_CHAIN_IDS = [ ChainId.HAQQ, ChainId.HARMONY, // ChainId.HARMONY_TESTNET, - // ChainId.HECO, + ChainId.HECO, // ChainId.HECO_TESTNET, ChainId.MOONBEAM, ChainId.MOONRIVER, @@ -92,8 +92,8 @@ export const SUSHISWAP_V2_INIT_CODE_HASH: Record< '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', [ChainId.AVALANCHE_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', - // [ChainId.HECO]: - // '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', + [ChainId.HECO]: + '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', // [ChainId.HECO_TESTNET]: // '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303', [ChainId.HARMONY]: @@ -173,7 +173,7 @@ export const SUSHISWAP_V2_FACTORY_ADDRESS: Record< [ChainId.AVALANCHE]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.AVALANCHE_TESTNET]: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', [ChainId.HAQQ]: '0xB45e53277a7e0F1D35f2a77160e91e25507f1763', - // [ChainId.HECO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', + [ChainId.HECO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // [ChainId.HECO_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', [ChainId.HARMONY]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', // [ChainId.HARMONY_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4', @@ -224,7 +224,7 @@ export const SUSHISWAP_V2_ROUTER_ADDRESS: Record< // [ChainId.ARBITRUM_TESTNET]: '', [ChainId.AVALANCHE]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', [ChainId.AVALANCHE_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', - // [ChainId.HECO]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', + [ChainId.HECO]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', // [ChainId.HECO_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', [ChainId.HARMONY]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', // [ChainId.HARMONY_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', From 81739716e77376a9e2a496ff7320ab66e9171883 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 24 Jun 2024 19:07:50 +0000 Subject: [PATCH 061/140] init --- packages/sushi/src/config/route-processor.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sushi/src/config/route-processor.ts b/packages/sushi/src/config/route-processor.ts index 394e589fcd..e873041526 100644 --- a/packages/sushi/src/config/route-processor.ts +++ b/packages/sushi/src/config/route-processor.ts @@ -296,6 +296,7 @@ export const ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS = [ ChainId.CORE, ChainId.CRONOS, ChainId.BLAST, + ChainId.FLARE ] as const export type RouteProcessor4ChainId = (typeof ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS)[number] @@ -334,6 +335,7 @@ export const ROUTE_PROCESSOR_4_ADDRESS: Record< [ChainId.CORE]: '0x0389879e0156033202C44BF784ac18fC02edeE4f', [ChainId.CRONOS]: '0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959', [ChainId.BLAST]: '0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959', + [ChainId.FLARE]: '0x4Aa9AEf59C7B63CD5C4B2eDE81F65A4225a99d9d', } as const export const isRouteProcessor4ChainId = ( chainId: ChainId, From 5226a4fc6d1cb86bed94f6064df453f75a2d838b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 24 Jun 2024 19:18:20 +0000 Subject: [PATCH 062/140] Update route-processor.ts --- packages/sushi/src/config/route-processor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/config/route-processor.ts b/packages/sushi/src/config/route-processor.ts index e873041526..ba70134819 100644 --- a/packages/sushi/src/config/route-processor.ts +++ b/packages/sushi/src/config/route-processor.ts @@ -296,7 +296,7 @@ export const ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS = [ ChainId.CORE, ChainId.CRONOS, ChainId.BLAST, - ChainId.FLARE + ChainId.FLARE, ] as const export type RouteProcessor4ChainId = (typeof ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS)[number] From 17187981c477df081223a50f46ff6470deb8d843 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 04:19:25 +0000 Subject: [PATCH 063/140] init --- .../liquidity-providers/PancakeSwapV3.ts | 6 + .../liquidity-providers/UniswapV3Base.ts | 79 +++++---- .../route-processor/test/DataFetcher.test.ts | 155 +++++++++++++++--- 3 files changed, 188 insertions(+), 52 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index 1c5462dec2..cd4725ab3b 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -1,9 +1,15 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +// import { +// PANCAKESWAP_V3_FEE_SPACING_MAP, +// PancakeSwapV3FeeAmount, +// } from '../../config/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class PancakeSwapV3Provider extends UniswapV3BaseProvider { + // override FEE = PancakeSwapV3FeeAmount + // override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index fa356b5436..7b28f1e0a6 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -11,30 +11,35 @@ import { memoizer } from '../memoizer.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' +export interface UniV3FeeType { + readonly LOWEST: number + readonly LOW: number + readonly MEDIUM: number + readonly HIGH: number +} + +export type UniV3TickSpacingType = { + readonly [key: UniV3FeeType[keyof UniV3FeeType]]: number +} + interface StaticPool { address: Address token0: Token token1: Token - fee: SushiSwapV3FeeAmount + fee: keyof UniV3TickSpacingType } interface V3Pool { address: Address token0: Token token1: Token - fee: SushiSwapV3FeeAmount + fee: keyof UniV3TickSpacingType sqrtPriceX96: bigint activeTick: number } export const NUMBER_OF_SURROUNDING_TICKS = 1000 // 10% price impact -const getActiveTick = (tickCurrent: number, feeAmount: SushiSwapV3FeeAmount) => - typeof tickCurrent === 'number' && feeAmount - ? Math.floor(tickCurrent / TICK_SPACINGS[feeAmount]) * - TICK_SPACINGS[feeAmount] - : undefined - const bitmapIndex = (tick: number, tickSpacing: number) => { return Math.floor(tick / tickSpacing / 256) } @@ -42,6 +47,8 @@ const bitmapIndex = (tick: number, tickSpacing: number) => { type PoolFilter = { has: (arg: string) => boolean } export abstract class UniswapV3BaseProvider extends LiquidityProvider { + TICK_SPACINGS: UniV3TickSpacingType = TICK_SPACINGS + FEE: UniV3FeeType = SushiSwapV3FeeAmount poolsByTrade: Map = new Map() pools: Map = new Map() @@ -76,6 +83,15 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } } + getActiveTick = ( + tickCurrent: number, + feeAmount: UniV3FeeType[keyof UniV3FeeType], + ) => + typeof tickCurrent === 'number' && feeAmount + ? Math.floor(tickCurrent / this.TICK_SPACINGS[feeAmount]!) * + this.TICK_SPACINGS[feeAmount]! + : undefined + async fetchPoolsForToken( t0: Token, t1: Token, @@ -165,7 +181,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const tick = slot0[i]!.result?.[1] if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') return - const activeTick = getActiveTick(tick, pool.fee) + const activeTick = this.getActiveTick(tick, pool.fee) if (typeof activeTick !== 'number') return existingPools.push({ ...pool, @@ -287,13 +303,13 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const minIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - TICK_SPACINGS[pool.fee], + this.TICK_SPACINGS[pool.fee]!, ), ) const maxIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - TICK_SPACINGS[pool.fee], + this.TICK_SPACINGS[pool.fee]!, ), ) @@ -383,7 +399,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { })).sort((a, b) => a.index - b.index) const lowerUnknownTick = - minIndexes[i]! * TICK_SPACINGS[pool.fee] * 256 - TICK_SPACINGS[pool.fee] + minIndexes[i]! * this.TICK_SPACINGS[pool.fee]! * 256 - + this.TICK_SPACINGS[pool.fee]! console.assert( poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, 'Error 236: unexpected min tick index', @@ -393,7 +410,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { DLiquidity: 0n, }) const upperUnknownTick = - (maxIndexes[i]! + 1) * TICK_SPACINGS[pool.fee] * 256 + (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.fee]! * 256 console.assert( poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, 'Error 244: unexpected max tick index', @@ -435,25 +452,23 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { getStaticPools(t1: Token, t2: Token): StaticPool[] { const currencyCombinations = getCurrencyCombinations(this.chainId, t1, t2) - const allCurrencyCombinationsWithAllFees: [ - Type, - Type, - SushiSwapV3FeeAmount, - ][] = currencyCombinations.reduce< - [Currency, Currency, SushiSwapV3FeeAmount][] - >((list, [tokenA, tokenB]) => { - if (tokenA !== undefined && tokenB !== undefined) { - return list.concat([ - [tokenA, tokenB, SushiSwapV3FeeAmount.LOWEST], - [tokenA, tokenB, SushiSwapV3FeeAmount.LOW], - [tokenA, tokenB, SushiSwapV3FeeAmount.MEDIUM], - [tokenA, tokenB, SushiSwapV3FeeAmount.HIGH], - ]) - } - return [] - }, []) - - const filtered: [Token, Token, SushiSwapV3FeeAmount][] = [] + const allCurrencyCombinationsWithAllFees: [Type, Type, number][] = + currencyCombinations.reduce<[Currency, Currency, number][]>( + (list, [tokenA, tokenB]) => { + if (tokenA !== undefined && tokenB !== undefined) { + return list.concat([ + [tokenA, tokenB, this.FEE.LOWEST], + [tokenA, tokenB, this.FEE.LOW], + [tokenA, tokenB, this.FEE.MEDIUM], + [tokenA, tokenB, this.FEE.HIGH], + ]) + } + return [] + }, + [], + ) + + const filtered: [Token, Token, number][] = [] allCurrencyCombinationsWithAllFees.forEach( ([currencyA, currencyB, feeAmount]) => { if (currencyA && currencyB && feeAmount) { diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 10e83ff5ab..bea1bd906d 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -11,7 +11,7 @@ import { USDT, WNATIVE, } from 'sushi/currency' -import { DataFetcher, LiquidityProviders } from 'sushi/router' +import { DataFetcher, LiquidityProviders, Router } from 'sushi/router' async function testDF( _chainName: string, @@ -69,6 +69,40 @@ function reportMissingDexes(reports: Record[]): { else return { hasMissingDex: false, missingDexNames } } +// tries to find a route for a token pair from current fetched pools +function findRoute( + dataFetcher: DataFetcher, + fromToken: Type, + toToken: Type, + chainId: ChainId, +): boolean { + try { + // find the best route map + const pcMap = dataFetcher.getCurrentPoolCodeMap(fromToken, toToken) + const route = Router.findBestRoute( + pcMap, + chainId, + fromToken, + BigInt(`1${'0'.repeat(fromToken.decimals)}`), + toToken, + 30e9, + ) + // call rp4 route data encoder to build route data + Router.routeProcessor4Params( + pcMap, + route, + fromToken, + toToken, + `0x${'1'.repeat(40)}`, + `0x${'2'.repeat(40)}`, + ) + return route.status !== 'NoWay' + } catch { + // no route found + return false + } +} + // exclude testnets and unsupported chains (chains with no dex/pool) const excludedChains = [ ...TESTNET_CHAIN_IDS, @@ -93,6 +127,7 @@ async function runTest() { dataFetcher.startDataFetching() console.log(chName) const allFoundPools = [] + const foundRouteReports = [] // a pool with this pair is available in most dexes and chains, but some may not have this, so // for those, other pairs are tried if there happened to be a missing dex from previous results @@ -107,11 +142,22 @@ async function runTest() { ), ) + // check that route is found and rp4 encoder encoded a route data correctly + // this is repeated for each pair throughout the test + foundRouteReports.push( + findRoute( + dataFetcher, + WNATIVE[chainId], + USDC[chainId as keyof typeof USDC], + chainId, + ), + ) + // only for Dfyn and JetSwap on fantom chain if ( chainId === ChainId.FANTOM && reportMissingDexes(allFoundPools).hasMissingDex - ) + ) { allFoundPools.push( await testDF( chName, @@ -122,12 +168,21 @@ async function runTest() { 'DAI', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + WNATIVE[chainId], + DAI[chainId as keyof typeof DAI], + chainId, + ), + ) + } // only for Blast chain if ( chainId === ChainId.BLAST && reportMissingDexes(allFoundPools).hasMissingDex - ) + ) { allFoundPools.push( await testDF( chName, @@ -138,51 +193,80 @@ async function runTest() { 'USDB', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + WNATIVE[chainId], + USDB[chainId as keyof typeof USDB], + chainId, + ), + ) + } // only for Moonbeam chain if ( chainId === ChainId.MOONBEAM && reportMissingDexes(allFoundPools).hasMissingDex - ) + ) { + const token = new Token({ + chainId: ChainId.MOONBEAM, + address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', + decimals: 18, + symbol: 'BUSD', + }) allFoundPools.push( await testDF( chName, dataFetcher, - new Token({ - chainId: ChainId.MOONBEAM, - address: '0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F', - decimals: 18, - symbol: 'BUSD', - }), + token, USDC[chainId as keyof typeof USDC], 'USDC', 'BUSD', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + token, + USDC[chainId as keyof typeof USDC], + chainId, + ), + ) + } // only for Elk dex on Moonriver since it only has 1 pool deployed which is with following pair if ( chainId === ChainId.MOONRIVER && reportMissingDexes(allFoundPools).hasMissingDex - ) + ) { + const token = new Token({ + chainId: ChainId.MOONRIVER, + address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', + decimals: 18, + symbol: 'ELK', + }) allFoundPools.push( await testDF( chName, dataFetcher, DAI[chainId as keyof typeof DAI], - new Token({ - chainId: ChainId.MOONRIVER, - address: '0xE1C110E1B1b4A1deD0cAf3E42BfBdbB7b5d7cE1C', - decimals: 18, - symbol: 'ELK', - }), + token, 'DAI', 'ELK', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + DAI[chainId as keyof typeof DAI], + token, + chainId, + ), + ) + } // shared pairs for all chains and dexes - if (reportMissingDexes(allFoundPools).hasMissingDex) + if (reportMissingDexes(allFoundPools).hasMissingDex) { allFoundPools.push( await testDF( chName, @@ -193,8 +277,17 @@ async function runTest() { 'USDT', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + WNATIVE[chainId], + USDT[chainId as keyof typeof USDT], + chainId, + ), + ) + } - if (reportMissingDexes(allFoundPools).hasMissingDex) + if (reportMissingDexes(allFoundPools).hasMissingDex) { allFoundPools.push( await testDF( chName, @@ -205,8 +298,17 @@ async function runTest() { 'FRAX', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + FRAX[chainId as keyof typeof FRAX], + chainId, + ), + ) + } - if (reportMissingDexes(allFoundPools).hasMissingDex) + if (reportMissingDexes(allFoundPools).hasMissingDex) { allFoundPools.push( await testDF( chName, @@ -217,9 +319,22 @@ async function runTest() { 'USDT', ), ) + foundRouteReports.push( + findRoute( + dataFetcher, + SUSHI[chainId as keyof typeof SUSHI], + USDT[chainId as keyof typeof USDT], + chainId, + ), + ) + } dataFetcher.stopDataFetching() + // should have found route + assert.ok(foundRouteReports.some((v) => v)) + + // should not have any missing dex const { hasMissingDex, missingDexNames } = reportMissingDexes(allFoundPools) if (hasMissingDex) { From e0a979ef2796ed3c1a69341e2bf09afa68e7dbf7 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 04:24:16 +0000 Subject: [PATCH 064/140] Update PancakeSwapV3.ts --- .../src/router/liquidity-providers/PancakeSwapV3.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index cd4725ab3b..5cbf4374b0 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -1,15 +1,15 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -// import { -// PANCAKESWAP_V3_FEE_SPACING_MAP, -// PancakeSwapV3FeeAmount, -// } from '../../config/index.js' +import { + PANCAKESWAP_V3_FEE_SPACING_MAP, + PancakeSwapV3FeeAmount, +} from '../../config/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class PancakeSwapV3Provider extends UniswapV3BaseProvider { - // override FEE = PancakeSwapV3FeeAmount - // override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP + override FEE = PancakeSwapV3FeeAmount + override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', From 065bde99be92b319768c36709df251d657d834a9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 15:00:32 +0000 Subject: [PATCH 065/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index bea1bd906d..ea5af40f9f 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,6 +1,7 @@ import assert from 'assert' import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' import { + BUSD, DAI, FRAX, SUSHI, @@ -75,6 +76,7 @@ function findRoute( fromToken: Type, toToken: Type, chainId: ChainId, + liquidityProviders?: LiquidityProviders[], ): boolean { try { // find the best route map @@ -86,6 +88,7 @@ function findRoute( BigInt(`1${'0'.repeat(fromToken.decimals)}`), toToken, 30e9, + liquidityProviders, ) // call rp4 route data encoder to build route data Router.routeProcessor4Params( @@ -153,6 +156,36 @@ async function runTest() { ), ) + // only for pancakev3 with 0.2.5% fee pool pair + if (chainId === ChainId.BSC) { + const token = new Token({ + chainId: ChainId.BSC, + address: '0x4BE35Ec329343d7d9F548d42B0F8c17FFfe07db4', + decimals: 18, + symbol: 'USDT.z', + }) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + token, + BUSD[chainId as keyof typeof BUSD], + 'USDT.z', + 'BUSD', + ), + ) + // explicitly find route for pancakev3 + const route = findRoute( + dataFetcher, + token, + BUSD[chainId as keyof typeof BUSD], + chainId, + [LiquidityProviders.PancakeSwapV3], + ) + assert(route) + foundRouteReports.push(route) + } + // only for Dfyn and JetSwap on fantom chain if ( chainId === ChainId.FANTOM && From 85624696f5716c2c2463488243cf20e8566e0bb2 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 15:18:12 +0000 Subject: [PATCH 066/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ea5af40f9f..9cda277ca9 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -174,16 +174,25 @@ async function runTest() { 'BUSD', ), ) - // explicitly find route for pancakev3 - const route = findRoute( - dataFetcher, + const pcMap = dataFetcher.getCurrentPoolCodeMap( token, BUSD[chainId as keyof typeof BUSD], - chainId, - [LiquidityProviders.PancakeSwapV3], ) - assert(route) - foundRouteReports.push(route) + assert.ok( + !pcMap.get( + '0xB30b2030b2F950401aBCD69763e9D0F81958d72d'.toLowerCase(), + ), + ) + + foundRouteReports.push( + findRoute( + dataFetcher, + token, + BUSD[chainId as keyof typeof BUSD], + chainId, + [LiquidityProviders.PancakeSwapV3], + ), + ) } // only for Dfyn and JetSwap on fantom chain From 5dc4df2494e5e73fbb8fd8e460d41f862d17317b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 18:55:57 +0000 Subject: [PATCH 067/140] explicitly checks univ3 dexes fess/ticks --- .../liquidity-providers/LiquidityProvider.ts | 45 ++++++++++++++ .../liquidity-providers/PancakeSwapV3.ts | 60 ++++++++++++++++++- .../liquidity-providers/UniswapV3Base.ts | 31 +++++++++- .../route-processor/test/DataFetcher.test.ts | 32 ++++++---- 4 files changed, 155 insertions(+), 13 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 9037bdbd08..8c770c7462 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -123,3 +123,48 @@ export abstract class LiquidityProvider { .sort((first, second) => (first > second ? -1 : 1)) .join(':') } + +export const UniV2LiquidityProviders: LiquidityProviders[] = [ + LiquidityProviders.SushiSwapV2, + LiquidityProviders.UniswapV2, + LiquidityProviders.QuickSwap, + LiquidityProviders.ApeSwap, + LiquidityProviders.PancakeSwapV2, + LiquidityProviders.TraderJoe, + LiquidityProviders.Dfyn, + LiquidityProviders.Elk, + LiquidityProviders.JetSwap, + LiquidityProviders.SpookySwapV2, + LiquidityProviders.NetSwap, + LiquidityProviders.HoneySwap, + LiquidityProviders.UbeSwap, + LiquidityProviders.Biswap, + LiquidityProviders.LaserSwap, + LiquidityProviders.BaseSwap, + LiquidityProviders.Solarbeam, + LiquidityProviders.Swapsicle, + LiquidityProviders.VVSStandard, + LiquidityProviders.Fraxswap, + LiquidityProviders.SwapBlast, + LiquidityProviders.BlastDEX, + LiquidityProviders.MonoswapV2, + LiquidityProviders.ThrusterV2, + LiquidityProviders.DyorV2, + LiquidityProviders.HyperBlast, + LiquidityProviders.KinetixV2, + LiquidityProviders.Camelot, + LiquidityProviders.Enosys, + LiquidityProviders.BlazeSwap, +] + +export const UniV3LiquidityProviders = [ + LiquidityProviders.SushiSwapV3, + LiquidityProviders.UniswapV3, + LiquidityProviders.DovishV3, + LiquidityProviders.KinetixV3, + LiquidityProviders.MonoswapV3, + LiquidityProviders.ThrusterV3, + LiquidityProviders.SpookySwapV3, + LiquidityProviders.PancakeSwapV3, + LiquidityProviders.Wagmi, +] as const diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index 5cbf4374b0..e406e22e25 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -1,4 +1,5 @@ -import { PublicClient } from 'viem' +import { Address, PublicClient } from 'viem' +import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' import { PANCAKESWAP_V3_FEE_SPACING_MAP, @@ -53,4 +54,61 @@ export class PancakeSwapV3Provider extends UniswapV3BaseProvider { getPoolProviderName(): string { return 'PancakeSwapV3' } + override async ensureFeeAndTicks(): Promise { + const feeList = [ + this.FEE.LOWEST, + this.FEE.LOW, + this.FEE.MEDIUM, + this.FEE.HIGH, + ] as number[] + const factoryAddress = ( + await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: [ + { + address: this.factory[this.chainId as keyof typeof this.factory]!, + abi: [ + { + inputs: [], + name: 'factoryAddress', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'factoryAddress', + } as const, + ], + }) + )[0] + + const results = (await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: feeList.map( + (fee) => + ({ + chainId: this.chainId, + address: factoryAddress as Address, + abi: uniswapV3FactoryAbi, + functionName: 'feeAmountTickSpacing', + args: [fee], + }) as const, + ), + })) as number[] + + // fetched fee map to ticks should match correctly with hardcoded literals in the dex + return results.every( + (v, i) => this.TICK_SPACINGS[feeList[i] as PancakeSwapV3FeeAmount] === v, + ) + } } diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 7b28f1e0a6..1090a08462 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -1,5 +1,5 @@ import { Address, PublicClient } from 'viem' -import { erc20Abi, tickLensAbi } from '../../abi/index.js' +import { erc20Abi, tickLensAbi, uniswapV3FactoryAbi } from '../../abi/index.js' import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount, TICK_SPACINGS } from '../../config/index.js' import { Currency, Token, Type } from '../../currency/index.js' @@ -536,4 +536,33 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { if (this.unwatchBlockNumber) this.unwatchBlockNumber() this.blockListener = undefined } + + async ensureFeeAndTicks(): Promise { + const feeList = [ + this.FEE.LOWEST, + this.FEE.LOW, + this.FEE.MEDIUM, + this.FEE.HIGH, + ] as number[] + const results = (await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: feeList.map( + (fee) => + ({ + chainId: this.chainId, + address: this.factory[this.chainId as keyof typeof this.factory]!, + abi: uniswapV3FactoryAbi, + functionName: 'feeAmountTickSpacing', + args: [fee], + }) as const, + ), + })) as number[] + + // fetched fee map to ticks should match correctly with hardcoded literals in the dex + return results.every( + (v, i) => this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v, + ) + } } diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 9cda277ca9..89f04f5a0e 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -1,7 +1,6 @@ import assert from 'assert' import { ChainId, TESTNET_CHAIN_IDS, chainName } from 'sushi/chain' import { - BUSD, DAI, FRAX, SUSHI, @@ -12,7 +11,13 @@ import { USDT, WNATIVE, } from 'sushi/currency' -import { DataFetcher, LiquidityProviders, Router } from 'sushi/router' +import { + DataFetcher, + LiquidityProviders, + Router, + UniV3LiquidityProviders, +} from 'sushi/router' +import { UniswapV3BaseProvider } from '../../../packages/sushi/dist/router/liquidity-providers/UniswapV3Base.js' async function testDF( _chainName: string, @@ -169,26 +174,22 @@ async function runTest() { chName, dataFetcher, token, - BUSD[chainId as keyof typeof BUSD], + USDT[chainId as keyof typeof USDT], 'USDT.z', - 'BUSD', + 'USDT', ), ) const pcMap = dataFetcher.getCurrentPoolCodeMap( token, - BUSD[chainId as keyof typeof BUSD], - ) - assert.ok( - !pcMap.get( - '0xB30b2030b2F950401aBCD69763e9D0F81958d72d'.toLowerCase(), - ), + USDT[chainId as keyof typeof USDT], ) + assert.ok(!!pcMap.get('0xB30b2030b2F950401aBCD69763e9D0F81958d72d')) foundRouteReports.push( findRoute( dataFetcher, token, - BUSD[chainId as keyof typeof BUSD], + USDT[chainId as keyof typeof USDT], chainId, [LiquidityProviders.PancakeSwapV3], ), @@ -373,6 +374,15 @@ async function runTest() { dataFetcher.stopDataFetching() + for (const dex of dataFetcher.providers) { + const dexName = dex.getType() + // if the current provider is univ3 type, ensure its fees and ticks + if (UniV3LiquidityProviders.some((v) => v === dexName)) { + const res = await (dex as UniswapV3BaseProvider).ensureFeeAndTicks() + assert.ok(res, `invalid fees/ticks for ${dexName} at ${chName}`) + } + } + // should have found route assert.ok(foundRouteReports.some((v) => v)) From 1836604dbe3875873747444cae383e5f253f4a26 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 20:43:40 +0000 Subject: [PATCH 068/140] fix bad dexes fees/ticks --- packages/sushi/src/config/viem.ts | 2 +- .../liquidity-providers/LiquidityProvider.ts | 2 +- .../router/liquidity-providers/MonoSwapV3.ts | 20 +++++ .../router/liquidity-providers/ThrusterV3.ts | 82 ++++++++++++++++++- .../src/router/liquidity-providers/Wagmi.ts | 30 +++++++ .../route-processor/test/DataFetcher.test.ts | 13 ++- 6 files changed, 144 insertions(+), 5 deletions(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index fbf29f3516..62fad389e5 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -518,7 +518,7 @@ export const publicTransports = { [ChainId.GNOSIS]: http(gnosis.rpcUrls.default.http[0]), [ChainId.HARMONY]: http(harmonyOne.rpcUrls.default.http[0]), [ChainId.KAVA]: http(kava.rpcUrls.default.http[0]), - [ChainId.METIS]: http(metis.rpcUrls.default.http[0]), + [ChainId.METIS]: http('https://metis-mainnet.public.blastapi.io'), [ChainId.MOONBEAM]: http(moonbeam.rpcUrls.default.http[0]), [ChainId.MOONRIVER]: http(moonriver.rpcUrls.default.http[0]), [ChainId.OPTIMISM]: http(optimism.rpcUrls.default.http[0]), diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 8c770c7462..dc394543b6 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -155,7 +155,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Camelot, LiquidityProviders.Enosys, LiquidityProviders.BlazeSwap, -] +] as const export const UniV3LiquidityProviders = [ LiquidityProviders.SushiSwapV3, diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts index 6ebf4d9855..81400d4e24 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts @@ -3,7 +3,27 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' +enum MonoswapV3FeeAmount { + /** 0.01% */ + LOWEST = 100, + /** 0.05% */ + LOW = 500, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +const MonoswapV3TickSpacing: Record = { + 100: 0, + 500: 10, + 3000: 60, + 10_000: 200, +} + export class MonoswapV3Provider extends UniswapV3BaseProvider { + override FEE = MonoswapV3FeeAmount + override TICK_SPACINGS = MonoswapV3TickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0x48d0F09710794313f33619c95147F34458BF7C3b', diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts index ab7b3def22..2b8fc3962e 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -1,9 +1,31 @@ -import { PublicClient } from 'viem' +import { Address, PublicClient } from 'viem' +import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' +import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' +enum ThrusterV3FeeAmount { + /** 0.01% */ + LOWEST = 100, + /** 0.05% */ + LOW = 500, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +const ThrusterV3TickSpacing: Record = { + 100: 0, + 500: 10, + 3000: 60, + 10_000: 200, +} + export class ThrusterV3Provider extends UniswapV3BaseProvider { + override FEE = ThrusterV3FeeAmount + override TICK_SPACINGS = ThrusterV3TickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0xa08ae3d3f4dA51C22d3c041E468bdF4C61405AaB', @@ -23,4 +45,62 @@ export class ThrusterV3Provider extends UniswapV3BaseProvider { getPoolProviderName(): string { return 'ThrusterV3' } + + override async ensureFeeAndTicks(): Promise { + const feeList = [ + this.FEE.LOWEST, + this.FEE.LOW, + this.FEE.MEDIUM, + this.FEE.HIGH, + ] as number[] + const factoryAddress = ( + await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: [ + { + address: this.factory[this.chainId as keyof typeof this.factory]!, + abi: [ + { + inputs: [], + name: 'factory', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'factory', + } as const, + ], + }) + )[0] + + const results = (await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: feeList.map( + (fee) => + ({ + chainId: this.chainId, + address: factoryAddress as Address, + abi: uniswapV3FactoryAbi, + functionName: 'feeAmountTickSpacing', + args: [fee], + }) as const, + ), + })) as number[] + + // fetched fee map to ticks should match correctly with hardcoded literals in the dex + return results.every( + (v, i) => this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v, + ) + } } diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts index 1ec5b38959..ab687f2d02 100644 --- a/packages/sushi/src/router/liquidity-providers/Wagmi.ts +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -3,7 +3,27 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' +enum WagmiFeeAmount { + /** 0.01% */ + LOWEST = 500, + /** 0.15% */ + LOW = 1500, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +const WagmiTickSpacing: Record = { + 500: 10, + 1500: 0, + 3000: 60, + 10_000: 200, +} + export class WagmiProvider extends UniswapV3BaseProvider { + override FEE = WagmiFeeAmount + override TICK_SPACINGS = WagmiTickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0xB9a14EE1cd3417f3AcC988F61650895151abde24', @@ -32,6 +52,16 @@ export class WagmiProvider extends UniswapV3BaseProvider { [ChainId.METIS]: '0x428065998a96F82bf66A0A427A157429A6Fdd649', } as const super(chainId, web3Client, factory, initCodeHash, tickLens) + + // ticks for Kava and Metis are different than other supported chains + if (chainId === ChainId.KAVA || chainId === ChainId.METIS) { + this.TICK_SPACINGS = { + 500: 10, + 1500: 30, + 3000: 60, + 10_000: 200, + } + } } getType(): LiquidityProviders { return LiquidityProviders.Wagmi diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 89f04f5a0e..90ec2c9a04 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -374,17 +374,26 @@ async function runTest() { dataFetcher.stopDataFetching() + // univ3 based dexes should all have correct fees/ticks + const invalidDexes = [] for (const dex of dataFetcher.providers) { const dexName = dex.getType() // if the current provider is univ3 type, ensure its fees and ticks if (UniV3LiquidityProviders.some((v) => v === dexName)) { const res = await (dex as UniswapV3BaseProvider).ensureFeeAndTicks() - assert.ok(res, `invalid fees/ticks for ${dexName} at ${chName}`) + if (!res) invalidDexes.push(dexName) } } + assert.ok( + !!invalidDexes.length, + `invalid fees/ticks at ${chName} for: ${invalidDexes.join(', ')}`, + ) // should have found route - assert.ok(foundRouteReports.some((v) => v)) + assert.ok( + foundRouteReports.some((v) => v), + 'did not find any valid route', + ) // should not have any missing dex const { hasMissingDex, missingDexNames } = From 6bad66f70a1ef998c77e00325f3a9dac7855285a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 21:02:10 +0000 Subject: [PATCH 069/140] fix --- .../src/router/liquidity-providers/LiquidityProvider.ts | 6 +++--- protocols/route-processor/test/DataFetcher.test.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index dc394543b6..ee0bee8d28 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -155,9 +155,9 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Camelot, LiquidityProviders.Enosys, LiquidityProviders.BlazeSwap, -] as const +] -export const UniV3LiquidityProviders = [ +export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.SushiSwapV3, LiquidityProviders.UniswapV3, LiquidityProviders.DovishV3, @@ -167,4 +167,4 @@ export const UniV3LiquidityProviders = [ LiquidityProviders.SpookySwapV3, LiquidityProviders.PancakeSwapV3, LiquidityProviders.Wagmi, -] as const +] diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 90ec2c9a04..b46364a1ed 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -385,7 +385,7 @@ async function runTest() { } } assert.ok( - !!invalidDexes.length, + invalidDexes.length === 0, `invalid fees/ticks at ${chName} for: ${invalidDexes.join(', ')}`, ) From e1471c0a6a0a65ae6cccd99aab83e58649282bd4 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 21:08:45 +0000 Subject: [PATCH 070/140] Update viem.ts --- packages/sushi/src/config/viem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 62fad389e5..fbf29f3516 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -518,7 +518,7 @@ export const publicTransports = { [ChainId.GNOSIS]: http(gnosis.rpcUrls.default.http[0]), [ChainId.HARMONY]: http(harmonyOne.rpcUrls.default.http[0]), [ChainId.KAVA]: http(kava.rpcUrls.default.http[0]), - [ChainId.METIS]: http('https://metis-mainnet.public.blastapi.io'), + [ChainId.METIS]: http(metis.rpcUrls.default.http[0]), [ChainId.MOONBEAM]: http(moonbeam.rpcUrls.default.http[0]), [ChainId.MOONRIVER]: http(moonriver.rpcUrls.default.http[0]), [ChainId.OPTIMISM]: http(optimism.rpcUrls.default.http[0]), From 06ab3cbd3776a2bb5ca683e06ceddf46a2e5bd2d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 23:00:35 +0000 Subject: [PATCH 071/140] standalone CI test for each chain --- .github/workflows/rain-ci.yml | 63 +++++++++++++++++-- .../route-processor/test/DataFetcher.test.ts | 9 ++- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index f55884d649..35042c5212 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -2,7 +2,7 @@ name: Rain CI on: [push] jobs: - install-build-lint-test: + router-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -21,8 +21,61 @@ jobs: - name: Check ./packages/sushi Types run: nix develop -c pnpm exec turbo run check --filter=./packages/sushi - + - name: Test ./packages/sushi - run: | - nix develop -c pnpm exec turbo run test --filter=./packages/sushi - nix develop -c pnpm exec turbo run test --filter=./protocols/route-processor \ No newline at end of file + run: nix develop -c pnpm exec turbo run test --filter=./packages/sushi + + datafetcher-test: + strategy: + fail-fast: false + # chains to run datafetcher on (all supported chains) + matrix: + chain: [ + ETHEREUM, + POLYGON, + FANTOM, + GNOSIS, + BSC, + ARBITRUM, + ARBITRUM_NOVA, + AVALANCHE, + HARMONY, + OKEX, + CELO, + MOONRIVER, + FUSE, + TELOS, + MOONBEAM, + OPTIMISM, + KAVA, + METIS, + BOBA, + BOBA_BNB, + BTTC, + POLYGON_ZKEVM, + THUNDERCORE, + FILECOIN, + HAQQ, + CORE, + LINEA, + BASE, + SCROLL, + ZETACHAIN, + CRONOS, + BLAST, + FLARE, + ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + + - name: Install deps + run: nix develop -c pnpm install --frozen-lockfile + + - name: Test DataFecther + run: nix develop -c pnpm exec turbo run test --filter=./protocols/route-processor + env: + CHAIN: ${{ matrix.chain }} \ No newline at end of file diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index b46364a1ed..36cc6b4519 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -119,9 +119,12 @@ const excludedChains = [ ChainId.BOBA_AVAX, ChainId.ZKSYNC_ERA, ] -const chainIds = Object.values(ChainId).filter((v) => - excludedChains.every((e) => v !== e), -) +const chainIds = Object.values(ChainId).filter((v) => { + if (excludedChains.every((e) => v !== e) && process?.env?.CHAIN) { + return v === ChainId[process.env.CHAIN as keyof typeof ChainId] + } + return false +}) async function runTest() { describe.only('DataFetcher Pools/Time check', async () => { From 9496f1262fb6df6c3f1064211ecdf2258d806d10 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Jun 2024 23:47:00 +0000 Subject: [PATCH 072/140] update --- .../router/liquidity-providers/MonoSwapV3.ts | 20 ---------------- .../liquidity-providers/PancakeSwapV3.ts | 4 +++- .../router/liquidity-providers/ThrusterV3.ts | 23 ++----------------- .../liquidity-providers/UniswapV3Base.ts | 4 +++- .../src/router/liquidity-providers/Wagmi.ts | 18 ++++----------- 5 files changed, 12 insertions(+), 57 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts index 81400d4e24..6ebf4d9855 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts @@ -3,27 +3,7 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' -enum MonoswapV3FeeAmount { - /** 0.01% */ - LOWEST = 100, - /** 0.05% */ - LOW = 500, - /** 0.3% */ - MEDIUM = 3000, - /** 1% */ - HIGH = 10000, -} - -const MonoswapV3TickSpacing: Record = { - 100: 0, - 500: 10, - 3000: 60, - 10_000: 200, -} - export class MonoswapV3Provider extends UniswapV3BaseProvider { - override FEE = MonoswapV3FeeAmount - override TICK_SPACINGS = MonoswapV3TickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0x48d0F09710794313f33619c95147F34458BF7C3b', diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index e406e22e25..8fc5620b6e 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -108,7 +108,9 @@ export class PancakeSwapV3Provider extends UniswapV3BaseProvider { // fetched fee map to ticks should match correctly with hardcoded literals in the dex return results.every( - (v, i) => this.TICK_SPACINGS[feeList[i] as PancakeSwapV3FeeAmount] === v, + (v, i) => + this.TICK_SPACINGS[feeList[i] as PancakeSwapV3FeeAmount] === v || + v === 0, ) } } diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts index 2b8fc3962e..d8c7447385 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -5,27 +5,7 @@ import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' -enum ThrusterV3FeeAmount { - /** 0.01% */ - LOWEST = 100, - /** 0.05% */ - LOW = 500, - /** 0.3% */ - MEDIUM = 3000, - /** 1% */ - HIGH = 10000, -} - -const ThrusterV3TickSpacing: Record = { - 100: 0, - 500: 10, - 3000: 60, - 10_000: 200, -} - export class ThrusterV3Provider extends UniswapV3BaseProvider { - override FEE = ThrusterV3FeeAmount - override TICK_SPACINGS = ThrusterV3TickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0xa08ae3d3f4dA51C22d3c041E468bdF4C61405AaB', @@ -100,7 +80,8 @@ export class ThrusterV3Provider extends UniswapV3BaseProvider { // fetched fee map to ticks should match correctly with hardcoded literals in the dex return results.every( - (v, i) => this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v, + (v, i) => + this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v || v === 0, ) } } diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 1090a08462..1cc8f433d7 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -561,8 +561,10 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { })) as number[] // fetched fee map to ticks should match correctly with hardcoded literals in the dex + // a tick can be 0 if there is no pools deployed with that fee yet return results.every( - (v, i) => this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v, + (v, i) => + this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v || v === 0, ) } } diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts index ab687f2d02..4c6b5f846c 100644 --- a/packages/sushi/src/router/liquidity-providers/Wagmi.ts +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -15,10 +15,10 @@ enum WagmiFeeAmount { } const WagmiTickSpacing: Record = { - 500: 10, - 1500: 0, - 3000: 60, - 10_000: 200, + [WagmiFeeAmount.LOWEST]: 10, + [WagmiFeeAmount.LOW]: 30, + [WagmiFeeAmount.MEDIUM]: 60, + [WagmiFeeAmount.HIGH]: 200, } export class WagmiProvider extends UniswapV3BaseProvider { @@ -52,16 +52,6 @@ export class WagmiProvider extends UniswapV3BaseProvider { [ChainId.METIS]: '0x428065998a96F82bf66A0A427A157429A6Fdd649', } as const super(chainId, web3Client, factory, initCodeHash, tickLens) - - // ticks for Kava and Metis are different than other supported chains - if (chainId === ChainId.KAVA || chainId === ChainId.METIS) { - this.TICK_SPACINGS = { - 500: 10, - 1500: 30, - 3000: 60, - 10_000: 200, - } - } } getType(): LiquidityProviders { return LiquidityProviders.Wagmi From 469e7b9811ed918488d90e55b0395636b2b6b8a2 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Thu, 4 Jul 2024 03:37:38 +0000 Subject: [PATCH 073/140] init --- packages/sushi/src/router/data-fetcher.ts | 6 +- .../liquidity-providers/AlgebraV1Base.ts | 201 ++++++++++++++++++ .../liquidity-providers/LiquidityProvider.ts | 6 +- .../{QuickSwap.ts => QuickSwapV2.ts} | 6 +- .../router/liquidity-providers/QuickswapV3.ts | 34 +++ .../liquidity-providers/UniswapV3Base.ts | 35 ++- packages/sushi/src/router/scripts/check.ts | 2 +- .../route-processor/test/DataFetcher.test.ts | 13 ++ 8 files changed, 286 insertions(+), 17 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts rename packages/sushi/src/router/liquidity-providers/{QuickSwap.ts => QuickSwapV2.ts} (83%) create mode 100644 packages/sushi/src/router/liquidity-providers/QuickswapV3.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index e5c76bcbd9..063182136d 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -30,7 +30,8 @@ import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' import { NetSwapProvider } from './liquidity-providers/NetSwap.js' import { PancakeSwapV2Provider } from './liquidity-providers/PancakeSwapV2.js' import { PancakeSwapV3Provider } from './liquidity-providers/PancakeSwapV3.js' -import { QuickSwapProvider } from './liquidity-providers/QuickSwap.js' +import { QuickSwapV2Provider } from './liquidity-providers/QuickSwapV2.js' +import { QuickSwapV3Provider } from './liquidity-providers/QuickswapV3.js' import { SolarbeamProvider } from './liquidity-providers/Solarbeam.js' import { SpookySwapV2Provider } from './liquidity-providers/SpookySwapV2.js' import { SpookySwapV3Provider } from './liquidity-providers/SpookySwapV3.js' @@ -170,7 +171,8 @@ export class DataFetcher { NetSwapProvider, PancakeSwapV2Provider, PancakeSwapV3Provider, - QuickSwapProvider, + QuickSwapV2Provider, + QuickSwapV3Provider, SolarbeamProvider, SpookySwapV2Provider, SpookySwapV3Provider, diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts new file mode 100644 index 0000000000..9369a6ee67 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -0,0 +1,201 @@ +import { + Address, + Hex, + PublicClient, + encodeAbiParameters, + getAddress, + keccak256, +} from 'viem' +import { ChainId } from '../../chain/index.js' +import { Token } from '../../currency/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { memoizer } from '../memoizer.js' +import { + PoolFilter, + StaticPoolUniV3, + UniswapV3BaseProvider, + V3Pool, +} from './UniswapV3Base.js' + +export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { + override TICK_SPACINGS: Record = {} + + readonly BASE_FEE = 100 + readonly DEFAULT_TICK_SPACING = 60 + + poolDeployer: Record = {} + + constructor( + chainId: ChainId, + web3Client: PublicClient, + factory: Record, + initCodeHash: Record, + tickLens: Record, + poolDeployer: Record, + isTest = false, + ) { + super(chainId, web3Client, factory, initCodeHash, tickLens, isTest) + this.poolDeployer = poolDeployer + if (!(chainId in this.poolDeployer)) { + throw new Error( + `${this.getType()} cannot be instantiated for chainid ${chainId}, no poolDeployer address`, + ) + } + } + + override async fetchPoolData( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + let staticPools = this.getStaticPools(t0, t1) + if (excludePools) + staticPools = staticPools.filter((p) => !excludePools.has(p.address)) + + const multicallMemoize = await memoizer.fn(this.client.multicall) + + const globalStateData = { + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: [ + { + inputs: [], + name: 'globalState', + outputs: [ + { internalType: 'uint160', name: 'price', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'fee', type: 'uint16' }, + { + internalType: 'uint16', + name: 'timepointIndex', + type: 'uint16', + }, + { + internalType: 'uint8', + name: 'communityFeeToken0', + type: 'uint8', + }, + { + internalType: 'uint8', + name: 'communityFeeToken1', + type: 'uint8', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'globalState', + }) as const, + ), + } + const globalState = options?.memoize + ? await (multicallMemoize(globalStateData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(globalStateData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const existingPools: V3Pool[] = [] + + staticPools.forEach((pool, i) => { + if (globalState === undefined || !globalState[i]) return + const sqrtPriceX96 = globalState[i]!.result?.[0] // price + const tick = globalState[i]!.result?.[1] // tick + if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') + return + const fee = globalState[i]!.result?.[2] // fee + if (!fee) return + const activeTick = + Math.floor(tick / this.DEFAULT_TICK_SPACING) * this.DEFAULT_TICK_SPACING + if (typeof activeTick !== 'number') return + this.TICK_SPACINGS[fee] = this.DEFAULT_TICK_SPACING + existingPools.push({ + ...pool, + fee, + sqrtPriceX96, + activeTick, + }) + }) + + return existingPools + } + + override getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { + const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) + const currencyCombinations: [Token, Token][] = [] + allCombinations.forEach(([currencyA, currencyB]) => { + if (currencyA && currencyB) { + const tokenA = currencyA.wrapped + const tokenB = currencyB.wrapped + if (tokenA.equals(tokenB)) return + currencyCombinations.push( + tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA], + ) + } + }) + return currencyCombinations.map(([currencyA, currencyB]) => ({ + address: getAlgebraPoolAddress( + this.poolDeployer[this.chainId as keyof typeof this.poolDeployer]!, + currencyA.wrapped.address, + currencyB.wrapped.address, + this.initCodeHash[ + this.chainId as keyof typeof this.initCodeHash + ] as `0x${string}`, + ), + token0: currencyA, + token1: currencyB, + fee: this.BASE_FEE, + })) + } + + // algebra doesnt have the fee/ticks setup the same way univ3 has + override async ensureFeeAndTicks(): Promise { + return true + } +} + +// from packages/extractor/src/AlgebraExtractor.ts +export function getAlgebraPoolAddress( + poolDeployer: Address, + tokenA: Address, + tokenB: Address, + initCodeHash: Hex, +): Address { + const constructorArgumentsEncoded = encodeAbiParameters( + [ + { name: 'TokenA', type: 'address' }, + { name: 'TokenB', type: 'address' }, + ], + [tokenA, tokenB], + ) + const create2Inputs = [ + '0xff', + poolDeployer, + keccak256(constructorArgumentsEncoded as Hex), + initCodeHash, + ] + const sanitizedInputs = `0x${create2Inputs.map((i) => i.slice(2)).join('')}` + + return getAddress(`0x${keccak256(sanitizedInputs as Hex).slice(-40)}`) +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index ee0bee8d28..18bb70f411 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -10,7 +10,8 @@ export enum LiquidityProviders { UniswapV2 = 'UniswapV2', UniswapV3 = 'UniswapV3', Trident = 'Trident', - QuickSwap = 'QuickSwap', + QuickSwapV2 = 'QuickSwapV2', + QuickSwapV3 = 'QuickSwapV3', ApeSwap = 'ApeSwap', PancakeSwapV2 = 'PancakeSwapV2', PancakeSwapV3 = 'PancakeSwapV3', @@ -127,7 +128,7 @@ export abstract class LiquidityProvider { export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.SushiSwapV2, LiquidityProviders.UniswapV2, - LiquidityProviders.QuickSwap, + LiquidityProviders.QuickSwapV2, LiquidityProviders.ApeSwap, LiquidityProviders.PancakeSwapV2, LiquidityProviders.TraderJoe, @@ -160,6 +161,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.SushiSwapV3, LiquidityProviders.UniswapV3, + LiquidityProviders.QuickSwapV3, LiquidityProviders.DovishV3, LiquidityProviders.KinetixV3, LiquidityProviders.MonoswapV3, diff --git a/packages/sushi/src/router/liquidity-providers/QuickSwap.ts b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts similarity index 83% rename from packages/sushi/src/router/liquidity-providers/QuickSwap.ts rename to packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts index ccadf12a1c..01b23f7ce3 100644 --- a/packages/sushi/src/router/liquidity-providers/QuickSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts @@ -3,7 +3,7 @@ import { ChainId } from '../../chain/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class QuickSwapProvider extends UniswapV2BaseProvider { +export class QuickSwapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32', @@ -15,9 +15,9 @@ export class QuickSwapProvider extends UniswapV2BaseProvider { super(chainId, web3Client, factory, initCodeHash) } getType(): LiquidityProviders { - return LiquidityProviders.QuickSwap + return LiquidityProviders.QuickSwapV2 } getPoolProviderName(): string { - return 'QuickSwap' + return 'QuickSwapV2' } } diff --git a/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts b/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts new file mode 100644 index 0000000000..76b0a6e225 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts @@ -0,0 +1,34 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class QuickSwapV3Provider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.POLYGON]: '0x411b0fAcC3489691f28ad58c47006AF5E3Ab3A28', + [ChainId.POLYGON_ZKEVM]: '0x4B9f4d2435Ef65559567e5DbFC1BbB37abC43B57', + } as const + const poolDeployer = { + [ChainId.POLYGON]: '0x2D98E2FA9da15aa6dC9581AB097Ced7af697CB92', + [ChainId.POLYGON_ZKEVM]: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270', + } as const + const initCodeHash = { + [ChainId.POLYGON]: + '0x6ec6c9c8091d160c0aa74b2b14ba9c1717e95093bd3ac085cee99a49aab294a4', + [ChainId.POLYGON_ZKEVM]: + '0x6ec6c9c8091d160c0aa74b2b14ba9c1717e95093bd3ac085cee99a49aab294a4', + } as const + const tickLens = { + [ChainId.POLYGON]: '0x5e9793f398c68A55F9C85A965CdB0d0c9a094d70', + [ChainId.POLYGON_ZKEVM]: '0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.QuickSwapV3 + } + getPoolProviderName(): string { + return 'QuickswapV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 1cc8f433d7..905c222775 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -22,29 +22,29 @@ export type UniV3TickSpacingType = { readonly [key: UniV3FeeType[keyof UniV3FeeType]]: number } -interface StaticPool { +export interface StaticPoolUniV3 { address: Address token0: Token token1: Token - fee: keyof UniV3TickSpacingType + fee: UniV3FeeType[keyof UniV3FeeType] } -interface V3Pool { +export interface V3Pool { address: Address token0: Token token1: Token - fee: keyof UniV3TickSpacingType + fee: UniV3FeeType[keyof UniV3FeeType] sqrtPriceX96: bigint activeTick: number } export const NUMBER_OF_SURROUNDING_TICKS = 1000 // 10% price impact -const bitmapIndex = (tick: number, tickSpacing: number) => { +export const bitmapIndex = (tick: number, tickSpacing: number) => { return Math.floor(tick / tickSpacing / 256) } -type PoolFilter = { has: (arg: string) => boolean } +export type PoolFilter = { has: (arg: string) => boolean } export abstract class UniswapV3BaseProvider extends LiquidityProvider { TICK_SPACINGS: UniV3TickSpacingType = TICK_SPACINGS @@ -92,12 +92,12 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { this.TICK_SPACINGS[feeAmount]! : undefined - async fetchPoolsForToken( + async fetchPoolData( t0: Token, t1: Token, excludePools?: Set | PoolFilter, options?: DataFetcherOptions, - ): Promise { + ): Promise { let staticPools = this.getStaticPools(t0, t1) if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) @@ -190,8 +190,25 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) }) + return existingPools + } + + async fetchPoolsForToken( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + const existingPools = await this.fetchPoolData( + t0, + t1, + excludePools, + options, + ) if (existingPools.length === 0) return + const multicallMemoize = await memoizer.fn(this.client.multicall) + const liquidityContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -449,7 +466,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ) } - getStaticPools(t1: Token, t2: Token): StaticPool[] { + getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { const currencyCombinations = getCurrencyCombinations(this.chainId, t1, t2) const allCurrencyCombinationsWithAllFees: [Type, Type, number][] = diff --git a/packages/sushi/src/router/scripts/check.ts b/packages/sushi/src/router/scripts/check.ts index 607d0b563a..75c71a9995 100644 --- a/packages/sushi/src/router/scripts/check.ts +++ b/packages/sushi/src/router/scripts/check.ts @@ -151,7 +151,7 @@ function getProtocol(lp: LiquidityProviders, chainId: ChainId) { switch (lp) { case LiquidityProviders.SushiSwapV2: return `${prefix}SUSHISWAP` - case LiquidityProviders.QuickSwap: + case LiquidityProviders.QuickSwapV2: return `${prefix}QUICKSWAP` case LiquidityProviders.Trident: return `${prefix}TRIDENT` diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 36cc6b4519..5ce9a8fa24 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -164,6 +164,19 @@ async function runTest() { ), ) + // only for quickswapv3 + if (chainId === ChainId.POLYGON) { + const foundRoute = findRoute( + dataFetcher, + WNATIVE[chainId], + USDC[chainId as keyof typeof USDC], + chainId, + [LiquidityProviders.QuickSwapV3], + ) + assert.ok(foundRoute) + foundRouteReports.push(foundRoute) + } + // only for pancakev3 with 0.2.5% fee pool pair if (chainId === ChainId.BSC) { const token = new Token({ From 1ff5c51ab505c2f4f94534fb1bfb62b4e3793435 Mon Sep 17 00:00:00 2001 From: Siddharth2207 Date: Fri, 19 Jul 2024 14:49:17 +0530 Subject: [PATCH 074/140] bump solc version --- protocols/route-processor/contracts/Approve.sol | 2 +- protocols/route-processor/contracts/InputStream.sol | 2 +- protocols/route-processor/contracts/RouteProcessor.sol | 2 +- protocols/route-processor/contracts/RouteProcessor3.sol | 2 +- protocols/route-processor/contracts/RouteProcessor3_1.sol | 2 +- protocols/route-processor/contracts/RouteProcessor3_2.sol | 2 +- protocols/route-processor/contracts/RouteProcessor4.sol | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/protocols/route-processor/contracts/Approve.sol b/protocols/route-processor/contracts/Approve.sol index b9b86c064c..099a4028e4 100644 --- a/protocols/route-processor/contracts/Approve.sol +++ b/protocols/route-processor/contracts/Approve.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; diff --git a/protocols/route-processor/contracts/InputStream.sol b/protocols/route-processor/contracts/InputStream.sol index b1056c28ae..e9c82bc1be 100644 --- a/protocols/route-processor/contracts/InputStream.sol +++ b/protocols/route-processor/contracts/InputStream.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; /** @notice Simple read stream */ library InputStream { diff --git a/protocols/route-processor/contracts/RouteProcessor.sol b/protocols/route-processor/contracts/RouteProcessor.sol index c45ea67343..8178019ba9 100644 --- a/protocols/route-processor/contracts/RouteProcessor.sol +++ b/protocols/route-processor/contracts/RouteProcessor.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '../interfaces/IUniswapV2Pair.sol'; import '../interfaces/IBentoBoxMinimal.sol'; diff --git a/protocols/route-processor/contracts/RouteProcessor3.sol b/protocols/route-processor/contracts/RouteProcessor3.sol index 2f03cc198f..08cd9a06d0 100644 --- a/protocols/route-processor/contracts/RouteProcessor3.sol +++ b/protocols/route-processor/contracts/RouteProcessor3.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '../interfaces/IUniswapV2Pair.sol'; import '../interfaces/IUniswapV3Pool.sol'; diff --git a/protocols/route-processor/contracts/RouteProcessor3_1.sol b/protocols/route-processor/contracts/RouteProcessor3_1.sol index 6eecbf02ff..53d4faad22 100644 --- a/protocols/route-processor/contracts/RouteProcessor3_1.sol +++ b/protocols/route-processor/contracts/RouteProcessor3_1.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '../interfaces/IUniswapV2Pair.sol'; import '../interfaces/IUniswapV3Pool.sol'; diff --git a/protocols/route-processor/contracts/RouteProcessor3_2.sol b/protocols/route-processor/contracts/RouteProcessor3_2.sol index 14bb5e7514..65fe9a04fa 100644 --- a/protocols/route-processor/contracts/RouteProcessor3_2.sol +++ b/protocols/route-processor/contracts/RouteProcessor3_2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '../interfaces/IUniswapV2Pair.sol'; import '../interfaces/IUniswapV3Pool.sol'; diff --git a/protocols/route-processor/contracts/RouteProcessor4.sol b/protocols/route-processor/contracts/RouteProcessor4.sol index f9436e48c3..955e4c6a33 100644 --- a/protocols/route-processor/contracts/RouteProcessor4.sol +++ b/protocols/route-processor/contracts/RouteProcessor4.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.10; +pragma solidity =0.8.25; import '../interfaces/IUniswapV2Pair.sol'; import '../interfaces/IUniswapV3Pool.sol'; From 271f000e1bf6bbaa153b01b1b4a65dc70ed22f20 Mon Sep 17 00:00:00 2001 From: Siddharth2207 Date: Fri, 19 Jul 2024 21:13:45 +0530 Subject: [PATCH 075/140] bump solc version --- protocols/route-processor/interfaces/ITridentCLPool.sol | 2 +- protocols/route-processor/interfaces/IUniswapV3Pool.sol | 2 +- protocols/route-processor/interfaces/IWETH.sol | 2 +- protocols/tines-sandbox/contracts/ERC20Mock.sol | 2 +- protocols/tines-sandbox/contracts/TestRouter.sol | 2 +- protocols/tines-sandbox/hardhat.config.cts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/protocols/route-processor/interfaces/ITridentCLPool.sol b/protocols/route-processor/interfaces/ITridentCLPool.sol index 0859307ef1..bcf090c393 100644 --- a/protocols/route-processor/interfaces/ITridentCLPool.sol +++ b/protocols/route-processor/interfaces/ITridentCLPool.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.10; +pragma solidity =0.8.25; interface ITridentCLPool { function token0() external returns (address); diff --git a/protocols/route-processor/interfaces/IUniswapV3Pool.sol b/protocols/route-processor/interfaces/IUniswapV3Pool.sol index b0a729aca8..18d03b1125 100644 --- a/protocols/route-processor/interfaces/IUniswapV3Pool.sol +++ b/protocols/route-processor/interfaces/IUniswapV3Pool.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.10; +pragma solidity =0.8.25; interface IUniswapV3Pool { function token0() external returns (address); diff --git a/protocols/route-processor/interfaces/IWETH.sol b/protocols/route-processor/interfaces/IWETH.sol index 713b55c89e..da15bb8ffd 100644 --- a/protocols/route-processor/interfaces/IWETH.sol +++ b/protocols/route-processor/interfaces/IWETH.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.10; +pragma solidity =0.8.25; interface IWETH { function deposit() external payable; diff --git a/protocols/tines-sandbox/contracts/ERC20Mock.sol b/protocols/tines-sandbox/contracts/ERC20Mock.sol index dd437fa4bc..2f1042affb 100644 --- a/protocols/tines-sandbox/contracts/ERC20Mock.sol +++ b/protocols/tines-sandbox/contracts/ERC20Mock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.10; +pragma solidity =0.8.25; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract ERC20Mock is ERC20 { diff --git a/protocols/tines-sandbox/contracts/TestRouter.sol b/protocols/tines-sandbox/contracts/TestRouter.sol index 2c5289bb4a..4cbd4521bc 100644 --- a/protocols/tines-sandbox/contracts/TestRouter.sol +++ b/protocols/tines-sandbox/contracts/TestRouter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Unlicense -pragma solidity 0.8.10; +pragma solidity =0.8.25; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; diff --git a/protocols/tines-sandbox/hardhat.config.cts b/protocols/tines-sandbox/hardhat.config.cts index 889a2a0079..eda51c55ef 100644 --- a/protocols/tines-sandbox/hardhat.config.cts +++ b/protocols/tines-sandbox/hardhat.config.cts @@ -27,7 +27,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: '0.8.10', + version: '0.8.25', settings: { optimizer: { enabled: true, From 4cd10fb842ed117d43a82e2a9bda22fce4daee61 Mon Sep 17 00:00:00 2001 From: Siddharth2207 Date: Sat, 20 Jul 2024 11:01:30 +0530 Subject: [PATCH 076/140] bump solc --- protocols/route-processor/hardhat.config.cts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/route-processor/hardhat.config.cts b/protocols/route-processor/hardhat.config.cts index a0309d1a72..56d52c96b9 100644 --- a/protocols/route-processor/hardhat.config.cts +++ b/protocols/route-processor/hardhat.config.cts @@ -86,7 +86,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: '0.8.10', + version: '0.8.25', settings: { optimizer: { enabled: true, From a4f6a604e32f50534586855501b298d15f8767f8 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 29 Jul 2024 22:18:30 +0000 Subject: [PATCH 077/140] init --- packages/sushi/src/router/data-fetcher.ts | 2 + .../liquidity-providers/LiquidityProvider.ts | 2 + .../liquidity-providers/LynexV1Provider.ts | 142 ++++++++++++++++++ .../route-processor/test/DataFetcher.test.ts | 1 + 4 files changed, 147 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 063182136d..a2b5b79ed5 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -24,6 +24,7 @@ import { LiquidityProvider, LiquidityProviders, } from './liquidity-providers/LiquidityProvider.js' +import { LynexV1Provider } from './liquidity-providers/LynexV1Provider.js' import { MonoswapV2Provider } from './liquidity-providers/MonoSwapV2.js' import { MonoswapV3Provider } from './liquidity-providers/MonoSwapV3.js' import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' @@ -166,6 +167,7 @@ export class DataFetcher { KinetixV2Provider, KinetixV3Provider, LaserSwapV2Provider, + LynexV1Provider, MonoswapV2Provider, MonoswapV3Provider, NetSwapProvider, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 18bb70f411..c54804f3bb 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -49,6 +49,7 @@ export enum LiquidityProviders { Camelot = 'Camelot', Enosys = 'Enosys', BlazeSwap = 'BlazeSwap', + LynexV1 = 'LynexV1', } export abstract class LiquidityProvider { @@ -156,6 +157,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Camelot, LiquidityProviders.Enosys, LiquidityProviders.BlazeSwap, + LiquidityProviders.LynexV1, ] export const UniV3LiquidityProviders: LiquidityProviders[] = [ diff --git a/packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts b/packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts new file mode 100644 index 0000000000..b9d14e40a3 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts @@ -0,0 +1,142 @@ +import { getCreate2Address } from '@ethersproject/address' +import { Address, PublicClient, encodePacked, keccak256, parseAbi } from 'viem' +import { ChainId } from '../../chain/index.js' +import { Token } from '../../currency/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { memoizer } from '../memoizer.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' + +const GetFeesAbi = parseAbi([ + 'function getFee(bool _stable) public view returns(uint256)', +]) + +export class LynexV1Provider extends UniswapV2BaseProvider { + STABLE_FEE = 0.0001 + VOLATILE_FEE = 0.0025 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.LINEA]: '0xBc7695Fd00E3b32D08124b7a4287493aEE99f9ee', + } as const + const initCodeHash = { + [ChainId.LINEA]: + '0xf40e8808230a29863f9f7f99beb90d28bca2c60094e78d93cca67f746dbfd142', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.LynexV1 + } + getPoolProviderName(): string { + return 'LynexV1' + } + + // overriden to read the fees from the factory, + // LynexV1 can have different fee for pools that are `stable` or not + // so read the stable and non stable fees before generating pools + // addresses and use those fees for fetched pools and then reading the pools reserves + override async fetchPoolsForToken( + t0: Token, + t1: Token, + excludePools?: Set, + options?: DataFetcherOptions, + ): Promise { + // get current fees + const multicallMemoize = await memoizer.fn(this.client.multicall) + const getFeesData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + blockNumber: options?.blockNumber, + contracts: [true, false].map( + (isStable) => + ({ + address: this.factory[ + this.chainId as keyof typeof this.factory + ] as Address, + chainId: this.chainId, + abi: GetFeesAbi, + functionName: 'getFee', + args: [isStable], + }) as const, + ), + } + const fees = options?.memoize + ? await (multicallMemoize(getFeesData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(getFeesData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + // convert to % in number + // returned values are represented in 1/100th of a percent + // so returned value of 25 is 0.25%, ie 0.0025 in numeric value + this.STABLE_FEE = Number(fees[0]) * 0.0001 + this.VOLATILE_FEE = Number(fees[1]) * 0.0001 + + // proceed the rest as a normal univ2 based dex + await this.getOnDemandPools(t0, t1, excludePools, options) + } + + // LynexV1 has an extra bool variable in its pool address salt + _getPoolAddresses(t1: Token, t2: Token): Address[] { + return [ + getCreate2Address( + this.factory[this.chainId as keyof typeof this.factory]!, + keccak256( + encodePacked( + ['address', 'address', 'bool'], + [t1.address as Address, t2.address as Address, true], + ), + ), + this.initCodeHash[this.chainId as keyof typeof this.initCodeHash]!, + ) as Address, + getCreate2Address( + this.factory[this.chainId as keyof typeof this.factory]!, + keccak256( + encodePacked( + ['address', 'address', 'bool'], + [t1.address as Address, t2.address as Address, false], + ), + ), + this.initCodeHash[this.chainId as keyof typeof this.initCodeHash]!, + ) as Address, + ] + } + + // same as original getStaticPools() in UniswapV2BaseProvider, but + // just overriden to do flatMap() to flatten array of pool addresses + // per token pair, since LynexV1 also has bool variable in the pool address salt + // also has 2 fees if the pair is `stable` or not + override getStaticPools(t1: Token, t2: Token): StaticPool[] { + const currencyCombination = getCurrencyCombinations( + this.chainId, + t1, + t2, + ).map(([c0, c1]) => (c0.sortsBefore(c1) ? [c0, c1] : [c1, c0])) + return currencyCombination.flatMap((combination) => { + const poolAddresses = this._getPoolAddresses( + combination[0]!, + combination[1]!, + ) + return poolAddresses.map((poolAddress, i) => ({ + address: poolAddress, + token0: combination[0]!, + token1: combination[1]!, + // set fee for stable and volatile + fee: i === 0 ? this.STABLE_FEE : this.VOLATILE_FEE, + })) + }) + } +} diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 5ce9a8fa24..f177fc6234 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -119,6 +119,7 @@ const excludedChains = [ ChainId.BOBA_AVAX, ChainId.ZKSYNC_ERA, ] + const chainIds = Object.values(ChainId).filter((v) => { if (excludedChains.every((e) => v !== e) && process?.env?.CHAIN) { return v === ChainId[process.env.CHAIN as keyof typeof ChainId] From 6505694de2ed76041b91bb8b6ff239c54ac67988 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 29 Jul 2024 23:08:32 +0000 Subject: [PATCH 078/140] add lynex v2 --- packages/sushi/src/router/data-fetcher.ts | 4 ++- .../liquidity-providers/LiquidityProvider.ts | 2 ++ .../{LynexV1Provider.ts => LynexV1.ts} | 0 .../src/router/liquidity-providers/LynexV2.ts | 29 +++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) rename packages/sushi/src/router/liquidity-providers/{LynexV1Provider.ts => LynexV1.ts} (100%) create mode 100644 packages/sushi/src/router/liquidity-providers/LynexV2.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index a2b5b79ed5..951b278993 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -24,7 +24,8 @@ import { LiquidityProvider, LiquidityProviders, } from './liquidity-providers/LiquidityProvider.js' -import { LynexV1Provider } from './liquidity-providers/LynexV1Provider.js' +import { LynexV1Provider } from './liquidity-providers/LynexV1.js' +import { LynexV2Provider } from './liquidity-providers/LynexV2.js' import { MonoswapV2Provider } from './liquidity-providers/MonoSwapV2.js' import { MonoswapV3Provider } from './liquidity-providers/MonoSwapV3.js' import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' @@ -168,6 +169,7 @@ export class DataFetcher { KinetixV3Provider, LaserSwapV2Provider, LynexV1Provider, + LynexV2Provider, MonoswapV2Provider, MonoswapV3Provider, NetSwapProvider, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index c54804f3bb..3b1e4d0a96 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -50,6 +50,7 @@ export enum LiquidityProviders { Enosys = 'Enosys', BlazeSwap = 'BlazeSwap', LynexV1 = 'LynexV1', + LynexV2 = 'LynexV2', } export abstract class LiquidityProvider { @@ -171,4 +172,5 @@ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.SpookySwapV3, LiquidityProviders.PancakeSwapV3, LiquidityProviders.Wagmi, + LiquidityProviders.LynexV2, ] diff --git a/packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts b/packages/sushi/src/router/liquidity-providers/LynexV1.ts similarity index 100% rename from packages/sushi/src/router/liquidity-providers/LynexV1Provider.ts rename to packages/sushi/src/router/liquidity-providers/LynexV1.ts diff --git a/packages/sushi/src/router/liquidity-providers/LynexV2.ts b/packages/sushi/src/router/liquidity-providers/LynexV2.ts new file mode 100644 index 0000000000..21a4b26c58 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/LynexV2.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class LynexV2Provider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.LINEA]: '0x622b2c98123D303ae067DB4925CD6282B3A08D0F', + } as const + const poolDeployer = { + [ChainId.LINEA]: '0x9A89490F1056A7BC607EC53F93b921fE666A2C48', + } as const + const initCodeHash = { + [ChainId.LINEA]: + '0xc65e01e65f37c1ec2735556a24a9c10e4c33b2613ad486dd8209d465524bc3f4', + } as const + const tickLens = { + [ChainId.LINEA]: '0x23406481b28cb7C1914C460b8B96cE4b2580BCB9', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.LynexV2 + } + getPoolProviderName(): string { + return 'LynexV2' + } +} From 6b29dd40187d0f23ca69be8304edb442ab32a570 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 31 Jul 2024 04:20:30 +0000 Subject: [PATCH 079/140] Update UniswapV2Base.ts --- packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index 2c532e5b67..7d422b47a4 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -207,7 +207,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { pool.address, token0, token1, - this.fee, + 'fee' in pool ? pool.fee : this.fee, 0n, 0n, ) From ea3ce9cf8d2db0488335f3a58be9380303505b33 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 18:53:24 +0000 Subject: [PATCH 080/140] init --- packages/sushi/src/router/data-fetcher.ts | 4 +++ .../liquidity-providers/LiquidityProvider.ts | 4 +++ .../router/liquidity-providers/SparkDexV2.ts | 23 ++++++++++++++++ .../router/liquidity-providers/SparkDexV3.ts | 26 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/SparkDexV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/SparkDexV3.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 951b278993..c8eb4bf446 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -35,6 +35,8 @@ import { PancakeSwapV3Provider } from './liquidity-providers/PancakeSwapV3.js' import { QuickSwapV2Provider } from './liquidity-providers/QuickSwapV2.js' import { QuickSwapV3Provider } from './liquidity-providers/QuickswapV3.js' import { SolarbeamProvider } from './liquidity-providers/Solarbeam.js' +import { SparkDexV2Provider } from './liquidity-providers/SparkDexV2.js' +import { SparkDexV3Provider } from './liquidity-providers/SparkDexV3.js' import { SpookySwapV2Provider } from './liquidity-providers/SpookySwapV2.js' import { SpookySwapV3Provider } from './liquidity-providers/SpookySwapV3.js' import { SushiSwapV2Provider } from './liquidity-providers/SushiSwapV2.js' @@ -178,6 +180,8 @@ export class DataFetcher { QuickSwapV2Provider, QuickSwapV3Provider, SolarbeamProvider, + SparkDexV2Provider, + SparkDexV3Provider, SpookySwapV2Provider, SpookySwapV3Provider, SushiSwapV2Provider, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 3b1e4d0a96..492f4569ba 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -51,6 +51,8 @@ export enum LiquidityProviders { BlazeSwap = 'BlazeSwap', LynexV1 = 'LynexV1', LynexV2 = 'LynexV2', + SparkDexV2 = 'SparkDexV2', + SparkDexV3 = 'SparkDexV3', } export abstract class LiquidityProvider { @@ -159,6 +161,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Enosys, LiquidityProviders.BlazeSwap, LiquidityProviders.LynexV1, + LiquidityProviders.SparkDexV2, ] export const UniV3LiquidityProviders: LiquidityProviders[] = [ @@ -173,4 +176,5 @@ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.PancakeSwapV3, LiquidityProviders.Wagmi, LiquidityProviders.LynexV2, + LiquidityProviders.SparkDexV3, ] diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts new file mode 100644 index 0000000000..7823c5b031 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts @@ -0,0 +1,23 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class SparkDexV2Provider extends UniswapV2BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FLARE]: '0x16b619B04c961E8f4F06C10B42FDAbb328980A89', + } as const + const initCodeHash = { + [ChainId.FLARE]: + '0x60cc0e9ad39c5fa4ee52571f511012ed76fbaa9bbaffd2f3fafffcb3c47cff6e', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.SparkDexV2 + } + getPoolProviderName(): string { + return 'SparkDexV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts new file mode 100644 index 0000000000..3a20fce34e --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class SparkDexV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FLARE]: '0xb3fB4f96175f6f9D716c17744e5A6d4BA9da8176', + } as const + const initCodeHash = { + [ChainId.FLARE]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.FLARE]: '0x80BE099457DF46e7EA0C38A7B4bB8DAF74079957', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.SparkDexV3 + } + getPoolProviderName(): string { + return 'SparkDexV3' + } +} From 4fdfb7b1b891693c30da532ec64d0ddccad5d055 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 20:16:02 +0000 Subject: [PATCH 081/140] fix --- .../src/config/bases-to-check-trades-against.ts | 9 +++------ packages/sushi/src/currency/token-addresses.ts | 3 ++- packages/sushi/src/currency/tokens.ts | 15 ++++++++------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index f26945152e..6d66e44e44 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -1,10 +1,8 @@ import { ChainId } from '../chain/index.js' import { ENOSYS_APS, - ENOSYS_BNZ, - ENOSYS_EETH, - ENOSYS_EQNT, ENOSYS_HLN, + ENOSYS_USDT, MUSD, Token, USDB, @@ -492,10 +490,9 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { WNATIVE[ChainId.FLARE], WETH9[ChainId.FLARE], USDT[ChainId.FLARE], - ENOSYS_BNZ, - ENOSYS_EQNT, + USDC[ChainId.FLARE], + ENOSYS_USDT, ENOSYS_HLN, ENOSYS_APS, - ENOSYS_EETH, ], } diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 2ffc439e0f..425d15ec38 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -452,6 +452,7 @@ export const USDC_ADDRESS = { [ChainId.CRONOS]: '0xc21223249CA28397B4B6541dfFaEcC539BfF0c59', [ChainId.FANTOM]: '0xd9820a17053d6314B20642E465a84Bf01a3D64f5', [ChainId.MOONBEAM]: '0x8f552a71EFE5eeFc207Bf75485b356A0b3f01eC9', + [ChainId.FLARE]: '0x0B38e83B86d491735fEaa0a791F65c2B99535396', } as const export const USDT_ADDRESS = { @@ -485,7 +486,7 @@ export const USDT_ADDRESS = { [ChainId.HAQQ]: axlUSDT_ADDRESS[ChainId.HAQQ], [ChainId.SCROLL]: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df', [ChainId.ZETACHAIN]: '0x7c8dDa80bbBE1254a7aACf3219EBe1481c6E01d7', - [ChainId.FLARE]: '0x96B41289D90444B8adD57e6F265DB5aE8651DF29', + [ChainId.FLARE]: '0x0B38e83B86d491735fEaa0a791F65c2B99535396', } as const export const DAI_ADDRESS = { diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index 787b1cc8c8..92f04b53e9 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -832,13 +832,6 @@ export const USDT: Record = { symbol: 'USDT', name: 'Tether USD', }), - [ChainId.FLARE]: new Token({ - chainId: ChainId.FLARE, - address: USDT_ADDRESS[ChainId.FLARE], - decimals: 6, - symbol: 'eUSDT', - name: 'Tether USD', - }), } export const DAI = addressMapToTokenMap( @@ -1167,6 +1160,14 @@ export const MUSD = new Token({ decimals: 18, }) +export const ENOSYS_USDT = new Token({ + chainId: ChainId.FLARE, + address: '0x96B41289D90444B8adD57e6F265DB5aE8651DF29', + decimals: 6, + symbol: 'eUSDT', + name: 'Enosys USDT', +}) + export const ENOSYS_BNZ = new Token({ chainId: ChainId.FLARE, address: '0xfD3449E8Ee31117a848D41Ee20F497a9bCb53164', From 459c2a5cce5c6b0f84d7aee537590196a43e7576 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 20:25:30 +0000 Subject: [PATCH 082/140] update --- packages/sushi/src/currency/token-addresses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 425d15ec38..13183b0558 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -311,7 +311,7 @@ export const WETH9_ADDRESS = { [ChainId.ZETACHAIN]: '0xd97B1de3619ed2c6BEb3860147E30cA8A7dC9891', [ChainId.CRONOS]: '0xe44Fd7fCb2b1581822D0c862B68222998a0c299a', [ChainId.BLAST]: '0x4300000000000000000000000000000000000004', - [ChainId.FLARE]: '0x62bd084cbcd6c85347c50292a141ea4d3e7e3511', + [ChainId.FLARE]: '0x1502FA4be69d526124D453619276FacCab275d3D', } as const export const WNATIVE_ADDRESS = { From d825c010a7362937032622f1d15e9c6f87eb891d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 20:29:57 +0000 Subject: [PATCH 083/140] update --- .../sushi/src/config/bases-to-check-trades-against.ts | 2 ++ packages/sushi/src/currency/tokens.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index 6d66e44e44..3f92c9564d 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -3,6 +3,7 @@ import { ENOSYS_APS, ENOSYS_HLN, ENOSYS_USDT, + ENOSYS_WETH, MUSD, Token, USDB, @@ -491,6 +492,7 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { WETH9[ChainId.FLARE], USDT[ChainId.FLARE], USDC[ChainId.FLARE], + ENOSYS_WETH, ENOSYS_USDT, ENOSYS_HLN, ENOSYS_APS, diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index 92f04b53e9..d50ff8913f 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -1168,6 +1168,14 @@ export const ENOSYS_USDT = new Token({ name: 'Enosys USDT', }) +export const ENOSYS_WETH = new Token({ + chainId: ChainId.FLARE, + address: '0x62bD084cbcD6c85347C50292A141EA4D3e7e3511', + decimals: 18, + symbol: 'WETH', + name: 'Enosys WETH', +}) + export const ENOSYS_BNZ = new Token({ chainId: ChainId.FLARE, address: '0xfD3449E8Ee31117a848D41Ee20F497a9bCb53164', From 4260d6032d58117cf5764a1d370f9bda70c67505 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 20:38:56 +0000 Subject: [PATCH 084/140] fix flare USDC address --- packages/sushi/src/currency/token-addresses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 13183b0558..6431792579 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -452,7 +452,7 @@ export const USDC_ADDRESS = { [ChainId.CRONOS]: '0xc21223249CA28397B4B6541dfFaEcC539BfF0c59', [ChainId.FANTOM]: '0xd9820a17053d6314B20642E465a84Bf01a3D64f5', [ChainId.MOONBEAM]: '0x8f552a71EFE5eeFc207Bf75485b356A0b3f01eC9', - [ChainId.FLARE]: '0x0B38e83B86d491735fEaa0a791F65c2B99535396', + [ChainId.FLARE]: '0xFbDa5F676cB37624f28265A144A48B0d6e87d3b6', } as const export const USDT_ADDRESS = { From e2e3a0741560322054cc3111344d0739f04c273f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 9 Aug 2024 21:27:54 +0000 Subject: [PATCH 085/140] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 36a68486af..4260f106c4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ -blank_issues_enabled: false -contact_links: - - name: Ask Question - url: https://github.com/sushiswap/sushiswap/discussions/new?category=q-a - about: Ask questions and discuss with other community members - - name: Request Feature - url: https://github.com/sushiswap/sushiswap/discussions/new?category=ideas - about: Requests features or brainstorm ideas for new functionality \ No newline at end of file +# blank_issues_enabled: false +# contact_links: +# - name: Ask Question +# url: https://github.com/sushiswap/sushiswap/discussions/new?category=q-a +# about: Ask questions and discuss with other community members +# - name: Request Feature +# url: https://github.com/sushiswap/sushiswap/discussions/new?category=ideas +# about: Requests features or brainstorm ideas for new functionality \ No newline at end of file From a2abb53c28179b07f8b6452d6a0af5d3f1e29e7d Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 3 Sep 2024 02:57:23 +0000 Subject: [PATCH 086/140] init --- packages/sushi/src/chain/constants.ts | 2 + packages/sushi/src/chain/generated.ts | 17 +++++++++ .../config/bases-to-check-trades-against.ts | 6 +++ packages/sushi/src/config/native-ids.ts | 1 + packages/sushi/src/config/viem.ts | 38 +++++++++++++++++++ .../sushi/src/currency/token-addresses.ts | 4 ++ packages/sushi/src/currency/tokens.ts | 7 ++++ packages/sushi/src/router/data-fetcher.ts | 2 + .../liquidity-providers/LiquidityProvider.ts | 2 + .../src/router/liquidity-providers/MSwap.ts | 24 ++++++++++++ 10 files changed, 103 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/MSwap.ts diff --git a/packages/sushi/src/chain/constants.ts b/packages/sushi/src/chain/constants.ts index d742176352..c0269e30aa 100644 --- a/packages/sushi/src/chain/constants.ts +++ b/packages/sushi/src/chain/constants.ts @@ -53,6 +53,7 @@ export const ChainId = { BLAST: 81457, // RONIN: 2020, FLARE: 14, + MATCHAIN: 698, } as const export type ChainId = (typeof ChainId)[keyof typeof ChainId] @@ -132,5 +133,6 @@ export const ChainKey = { [ChainId.CRONOS]: 'cronos', [ChainId.BLAST]: 'blast', [ChainId.FLARE]: 'flare', + [ChainId.MATCHAIN]: 'matchain', } as const export type ChainKey = (typeof ChainKey)[keyof typeof ChainKey] diff --git a/packages/sushi/src/chain/generated.ts b/packages/sushi/src/chain/generated.ts index 6a7bec1536..2bfa8acd99 100644 --- a/packages/sushi/src/chain/generated.ts +++ b/packages/sushi/src/chain/generated.ts @@ -980,4 +980,21 @@ export default [ name: 'Palm', shortName: 'palm', }, + { + chainId: 698, + explorers: [ + { + name: 'matchain', + url: 'https://matchscan.io', + standard: 'none', + }, + ], + nativeCurrency: { + name: 'BNB', + symbol: 'BNB', + decimals: 18, + }, + name: 'MatChain Mainnet', + shortName: 'matchain', + }, ] as const diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index 3f92c9564d..f0f6afa03c 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -497,4 +497,10 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { ENOSYS_HLN, ENOSYS_APS, ], + [ChainId.MATCHAIN]: [ + WNATIVE[ChainId.MATCHAIN], + WETH9[ChainId.MATCHAIN], + USDT[ChainId.MATCHAIN], + USDC[ChainId.MATCHAIN], + ], } diff --git a/packages/sushi/src/config/native-ids.ts b/packages/sushi/src/config/native-ids.ts index d4b1aba7ad..147cc74072 100644 --- a/packages/sushi/src/config/native-ids.ts +++ b/packages/sushi/src/config/native-ids.ts @@ -55,4 +55,5 @@ export const nativeCurrencyIds = { [ChainId.CRONOS]: 'CRO', [ChainId.BLAST]: 'ETH', [ChainId.FLARE]: 'FLR', + [ChainId.MATCHAIN]: 'BNB', } as const diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index fbf29f3516..a9448c4ee1 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -502,6 +502,37 @@ export const blast = { }, } as const +export const matchain = { + id: ChainId.MATCHAIN, + name: 'MatChain', + network: 'matchain', + nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://rpc.matchain.io'], + }, + public: { + http: ['https://rpc.matchain.io'], + }, + }, + blockExplorers: { + etherscan: { + name: 'Matchain Explorer', + url: 'https://matchscan.io', + }, + default: { + name: 'Matchain Explorer', + url: 'https://matchscan.io', + }, + }, + contracts: { + multicall3: { + address: '0xcA11bde05977b3631167028862bE2a173976CA11' as Address, + blockCreated: 0, + }, + }, +} as const + export const publicTransports = { [ChainId.ARBITRUM_NOVA]: http(arbitrumNova.rpcUrls.default.http[0]), [ChainId.ARBITRUM]: http(arbitrum.rpcUrls.default.http[0]), @@ -547,6 +578,7 @@ export const publicTransports = { [ChainId.FANTOM_TESTNET]: http(fantomTestnet.rpcUrls.default.http[0]), [ChainId.POLYGON_TESTNET]: http(polygonMumbai.rpcUrls.default.http[0]), [ChainId.SEPOLIA]: http(sepolia.rpcUrls.default.http[0]), + [ChainId.MATCHAIN]: http(matchain.rpcUrls.default.http[0]), } as const satisfies Record export const publicChains = [ @@ -587,6 +619,7 @@ export const publicChains = [ filecoin, zetachain, flare, + matchain, /* Testnets */ arbitrumSepolia, @@ -746,6 +779,11 @@ export const publicClientConfig = { chain: flare, transport: publicTransports[ChainId.FLARE], }, + [ChainId.MATCHAIN]: { + chain: matchain, + transport: publicTransports[ChainId.MATCHAIN], + }, + /* Testnets */ [ChainId.ARBITRUM_TESTNET]: { chain: arbitrumSepolia, diff --git a/packages/sushi/src/currency/token-addresses.ts b/packages/sushi/src/currency/token-addresses.ts index 6431792579..66809a206b 100644 --- a/packages/sushi/src/currency/token-addresses.ts +++ b/packages/sushi/src/currency/token-addresses.ts @@ -312,6 +312,7 @@ export const WETH9_ADDRESS = { [ChainId.CRONOS]: '0xe44Fd7fCb2b1581822D0c862B68222998a0c299a', [ChainId.BLAST]: '0x4300000000000000000000000000000000000004', [ChainId.FLARE]: '0x1502FA4be69d526124D453619276FacCab275d3D', + [ChainId.MATCHAIN]: '0xFF13A7A12fd485BC9687fF88D8Ae1A6b655Ab469', } as const export const WNATIVE_ADDRESS = { @@ -369,6 +370,7 @@ export const WNATIVE_ADDRESS = { [ChainId.CRONOS]: '0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23', [ChainId.BLAST]: WETH9_ADDRESS[ChainId.BLAST], [ChainId.FLARE]: '0x1D80c49BbBCd1C0911346656B529DF9E5c2F783d', + [ChainId.MATCHAIN]: '0x4200000000000000000000000000000000000006', } as const export const SUSHI_ADDRESS = { @@ -453,6 +455,7 @@ export const USDC_ADDRESS = { [ChainId.FANTOM]: '0xd9820a17053d6314B20642E465a84Bf01a3D64f5', [ChainId.MOONBEAM]: '0x8f552a71EFE5eeFc207Bf75485b356A0b3f01eC9', [ChainId.FLARE]: '0xFbDa5F676cB37624f28265A144A48B0d6e87d3b6', + [ChainId.MATCHAIN]: '0x97eec1c29f745dC7c267F90292AA663d997a601D', } as const export const USDT_ADDRESS = { @@ -487,6 +490,7 @@ export const USDT_ADDRESS = { [ChainId.SCROLL]: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df', [ChainId.ZETACHAIN]: '0x7c8dDa80bbBE1254a7aACf3219EBe1481c6E01d7', [ChainId.FLARE]: '0x0B38e83B86d491735fEaa0a791F65c2B99535396', + [ChainId.MATCHAIN]: '0xB6dc6C8b71e88642cEAD3be1025565A9eE74d1C6', } as const export const DAI_ADDRESS = { diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index d50ff8913f..8826af525b 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -691,6 +691,13 @@ export const WNATIVE = { symbol: 'WFLR', name: 'Wrapped FLR', }), + [ChainId.MATCHAIN]: new Token({ + chainId: ChainId.MATCHAIN, + address: WNATIVE_ADDRESS[ChainId.MATCHAIN], + decimals: 18, + symbol: 'WBNB', + name: 'Wrapped BNB', + }), } as const export const SUSHI = addressMapToTokenMap( diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index c8eb4bf446..ea88ebbc8b 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -26,6 +26,7 @@ import { } from './liquidity-providers/LiquidityProvider.js' import { LynexV1Provider } from './liquidity-providers/LynexV1.js' import { LynexV2Provider } from './liquidity-providers/LynexV2.js' +import { MSwapProvider } from './liquidity-providers/MSwap.js' import { MonoswapV2Provider } from './liquidity-providers/MonoSwapV2.js' import { MonoswapV3Provider } from './liquidity-providers/MonoSwapV3.js' import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' @@ -174,6 +175,7 @@ export class DataFetcher { LynexV2Provider, MonoswapV2Provider, MonoswapV3Provider, + MSwapProvider, NetSwapProvider, PancakeSwapV2Provider, PancakeSwapV3Provider, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 492f4569ba..6a6dbc920b 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -40,6 +40,7 @@ export enum LiquidityProviders { BlastDEX = 'BlastDEX', MonoswapV2 = 'MonoswapV2', MonoswapV3 = 'MonoswapV3', + MSwap = 'MSwap', ThrusterV2 = 'ThrusterV2', ThrusterV3 = 'ThrusterV3', DyorV2 = 'DyorV2', @@ -162,6 +163,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.BlazeSwap, LiquidityProviders.LynexV1, LiquidityProviders.SparkDexV2, + LiquidityProviders.MSwap, ] export const UniV3LiquidityProviders: LiquidityProviders[] = [ diff --git a/packages/sushi/src/router/liquidity-providers/MSwap.ts b/packages/sushi/src/router/liquidity-providers/MSwap.ts new file mode 100644 index 0000000000..03b97498d6 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/MSwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class MSwapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.MATCHAIN]: '0x338bCC4efd3cA000D123d7352b362Fc6D5B3D829', + } as const + const initCodeHash = { + [ChainId.MATCHAIN]: + '0x32c26bd70ba438539c5a5bf79114c634822021bef9c0ea35fe1d9842a36bd662', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.MSwap + } + getPoolProviderName(): string { + return 'MSwap' + } +} From 34fbe7d482e43cdb847b8a5116d0d2b6e18e6d18 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 3 Sep 2024 17:02:14 +0000 Subject: [PATCH 087/140] Update route-processor.ts --- packages/sushi/src/config/route-processor.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sushi/src/config/route-processor.ts b/packages/sushi/src/config/route-processor.ts index ba70134819..095fc4787f 100644 --- a/packages/sushi/src/config/route-processor.ts +++ b/packages/sushi/src/config/route-processor.ts @@ -297,6 +297,7 @@ export const ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS = [ ChainId.CRONOS, ChainId.BLAST, ChainId.FLARE, + ChainId.MATCHAIN, ] as const export type RouteProcessor4ChainId = (typeof ROUTE_PROCESSOR_4_SUPPORTED_CHAIN_IDS)[number] @@ -336,6 +337,7 @@ export const ROUTE_PROCESSOR_4_ADDRESS: Record< [ChainId.CRONOS]: '0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959', [ChainId.BLAST]: '0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959', [ChainId.FLARE]: '0x4Aa9AEf59C7B63CD5C4B2eDE81F65A4225a99d9d', + [ChainId.MATCHAIN]: '0xbD8849759749B4d8506bC851aceF0E19F34EaBEE', } as const export const isRouteProcessor4ChainId = ( chainId: ChainId, From a674d07646ee2d470ec732fdfc33c59eb63549e8 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 19 Oct 2024 20:16:03 +0000 Subject: [PATCH 088/140] init --- .../config/bases-to-check-trades-against.ts | 8 +++--- packages/sushi/src/router/data-fetcher.ts | 2 ++ .../liquidity-providers/LiquidityProvider.ts | 2 ++ .../liquidity-providers/SparkDexV3_1.ts | 26 +++++++++++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index f0f6afa03c..293f216c12 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -1,7 +1,6 @@ import { ChainId } from '../chain/index.js' import { - ENOSYS_APS, - ENOSYS_HLN, + ENOSYS_EETH, ENOSYS_USDT, ENOSYS_WETH, MUSD, @@ -492,10 +491,9 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { WETH9[ChainId.FLARE], USDT[ChainId.FLARE], USDC[ChainId.FLARE], - ENOSYS_WETH, ENOSYS_USDT, - ENOSYS_HLN, - ENOSYS_APS, + ENOSYS_EETH, + ENOSYS_WETH, ], [ChainId.MATCHAIN]: [ WNATIVE[ChainId.MATCHAIN], diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index ea88ebbc8b..5edf79faf7 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -38,6 +38,7 @@ import { QuickSwapV3Provider } from './liquidity-providers/QuickswapV3.js' import { SolarbeamProvider } from './liquidity-providers/Solarbeam.js' import { SparkDexV2Provider } from './liquidity-providers/SparkDexV2.js' import { SparkDexV3Provider } from './liquidity-providers/SparkDexV3.js' +import { SparkDexV3_1Provider } from './liquidity-providers/SparkDexV3_1.js' import { SpookySwapV2Provider } from './liquidity-providers/SpookySwapV2.js' import { SpookySwapV3Provider } from './liquidity-providers/SpookySwapV3.js' import { SushiSwapV2Provider } from './liquidity-providers/SushiSwapV2.js' @@ -184,6 +185,7 @@ export class DataFetcher { SolarbeamProvider, SparkDexV2Provider, SparkDexV3Provider, + SparkDexV3_1Provider, SpookySwapV2Provider, SpookySwapV3Provider, SushiSwapV2Provider, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 6a6dbc920b..282b88352a 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -54,6 +54,7 @@ export enum LiquidityProviders { LynexV2 = 'LynexV2', SparkDexV2 = 'SparkDexV2', SparkDexV3 = 'SparkDexV3', + SparkDexV3_1 = 'SparkDexV3_1', } export abstract class LiquidityProvider { @@ -179,4 +180,5 @@ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Wagmi, LiquidityProviders.LynexV2, LiquidityProviders.SparkDexV3, + LiquidityProviders.SparkDexV3_1, ] diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts new file mode 100644 index 0000000000..ff10214707 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class SparkDexV3_1Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FLARE]: '0x8A2578d23d4C532cC9A98FaD91C0523f5efDE652', + } as const + const initCodeHash = { + [ChainId.FLARE]: + '0x209015062f691a965df159762a8d966b688e328361c53ec32da2ad31287e3b72', + } as const + const tickLens = { + [ChainId.FLARE]: '0xdB5F2Ca65aAeB277E36be69553E0e7aA3585204d', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.SparkDexV3_1 + } + getPoolProviderName(): string { + return 'SparkDexV3_1' + } +} From 97c0a77d8fd5137690531afb29c10e25cb27af8a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 27 Oct 2024 03:34:03 +0000 Subject: [PATCH 089/140] init --- apis/extractor/package.json | 4 +- apis/router/package.json | 4 +- apis/tokens/package.json | 4 +- apps/evm/package.json | 4 +- jobs/pool/package.json | 4 +- packages/bonds-sdk/package.json | 2 +- packages/client/package.json | 4 +- packages/extractor/package.json | 2 +- packages/react-query/package.json | 6 +- packages/steer-sdk/package.json | 2 +- packages/sushi/package.json | 4 +- packages/sushi/src/config/viem.ts | 154 ++-- .../liquidity-providers/AlgebraV1Base.ts | 93 ++- .../src/router/liquidity-providers/Camelot.ts | 73 +- .../src/router/liquidity-providers/LynexV2.ts | 1 + .../liquidity-providers/UniswapV2Base.ts | 75 +- packages/wagmi/package.json | 6 +- pnpm-lock.yaml | 715 +++++++++++------- protocols/route-processor/package.json | 2 +- protocols/tines-sandbox/package.json | 2 +- 20 files changed, 730 insertions(+), 431 deletions(-) diff --git a/apis/extractor/package.json b/apis/extractor/package.json index 0827c75624..98c5926ddd 100644 --- a/apis/extractor/package.json +++ b/apis/extractor/package.json @@ -35,9 +35,9 @@ "dotenv": "16.3.1", "express": "4.18.2", "sushi": "workspace:*", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20", - "zod": "3.21.4" + "zod": "3.22.0" }, "devDependencies": { "@tsconfig/esm": "1.0.4", diff --git a/apis/router/package.json b/apis/router/package.json index 19ecadb05e..65ec2f06b3 100644 --- a/apis/router/package.json +++ b/apis/router/package.json @@ -36,9 +36,9 @@ "dotenv": "16.3.1", "express": "4.18.2", "sushi": "workspace:*", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20", - "zod": "3.21.4" + "zod": "3.22.0" }, "devDependencies": { "@tsconfig/esm": "1.0.4", diff --git a/apis/tokens/package.json b/apis/tokens/package.json index 2c16debcac..d28af20c12 100644 --- a/apis/tokens/package.json +++ b/apis/tokens/package.json @@ -34,8 +34,8 @@ "drizzle-orm": "^0.29.5", "postgres": "^3.4.3", "sushi": "workspace:*", - "viem": "2.8.14", - "zod": "3.21.4" + "viem": "2.21.35", + "zod": "3.22.0" }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", diff --git a/apps/evm/package.json b/apps/evm/package.json index ff2656f74b..f404c43c1a 100644 --- a/apps/evm/package.json +++ b/apps/evm/package.json @@ -74,9 +74,9 @@ "sushi": "workspace:*", "swr": "2.1.5", "tiny-invariant": "1.3.1", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20", - "zod": "3.21.4" + "zod": "3.22.0" }, "devDependencies": { "@0xsquid/squid-types": "^0.1.59", diff --git a/jobs/pool/package.json b/jobs/pool/package.json index be955fb123..6e8494a113 100644 --- a/jobs/pool/package.json +++ b/jobs/pool/package.json @@ -71,8 +71,8 @@ "lodash.zip": "4.2.0", "sushi": "workspace:*", "tsx": "^4.7.1", - "viem": "2.8.14", - "zod": "3.21.4" + "viem": "2.21.35", + "zod": "3.22.0" }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", diff --git a/packages/bonds-sdk/package.json b/packages/bonds-sdk/package.json index 308b00ec84..9fea95bd8c 100644 --- a/packages/bonds-sdk/package.json +++ b/packages/bonds-sdk/package.json @@ -67,7 +67,7 @@ "jest": "29.7.0", "ts-jest": "29.1.1", "typescript": "5.2.2", - "viem": "2.8.14" + "viem": "2.21.35" }, "peerDependencies": { "react": "18.2.0", diff --git a/packages/client/package.json b/packages/client/package.json index fd3c8881df..e4d306211f 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -72,8 +72,8 @@ "@whatwg-node/fetch": "0.8.4", "deepmerge-ts": "^4.3.0", "tslib": "latest", - "viem": "2.8.14", - "zod": "3.21.4" + "viem": "2.21.35", + "zod": "3.22.0" }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", diff --git a/packages/extractor/package.json b/packages/extractor/package.json index dc151c44c5..7e40cb893e 100644 --- a/packages/extractor/package.json +++ b/packages/extractor/package.json @@ -36,7 +36,7 @@ "@uniswap/v3-core": "1.0.1", "abitype": "0.9.8", "sushi": "workspace:*", - "viem": "2.8.14" + "viem": "2.21.35" }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", diff --git a/packages/react-query/package.json b/packages/react-query/package.json index 2235894d7a..26abeffd25 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -50,7 +50,7 @@ "idb-keyval": "6.2.0", "ms": "2.1.3", "nanoid": "4.0.0", - "zod": "3.21.4" + "zod": "3.22.0" }, "devDependencies": { "@sentry/nextjs": "7.101.1", @@ -68,7 +68,7 @@ "react-dom": "18.2.0", "sushi": "workspace:*", "typescript": "5.2.2", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20" }, "peerDependencies": { @@ -78,7 +78,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "sushi": "*", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20" }, "peerDependenciesMeta": { diff --git a/packages/steer-sdk/package.json b/packages/steer-sdk/package.json index daffcd2092..47e0e2fdb9 100644 --- a/packages/steer-sdk/package.json +++ b/packages/steer-sdk/package.json @@ -62,7 +62,7 @@ "@whatwg-node/fetch": "0.8.4", "sushi": "workspace:*", "tslib": "latest", - "viem": "2.8.14" + "viem": "2.21.35" }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 13d5264f0d..f56eda3c8b 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -221,9 +221,9 @@ "@wagmi/core": "2.6.17", "ts-node": "10.9.2", "typescript": "5.2.2", - "viem": "2.8.14", + "viem": "2.21.35", "vitest": "0.34.6", - "zod": "3.21.4" + "zod": "3.22.0" }, "peerDependencies": { "viem": "*", diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index a9448c4ee1..9fa0d0816b 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -533,7 +533,7 @@ export const matchain = { }, } as const -export const publicTransports = { +export const publicTransports: Record = { [ChainId.ARBITRUM_NOVA]: http(arbitrumNova.rpcUrls.default.http[0]), [ChainId.ARBITRUM]: http(arbitrum.rpcUrls.default.http[0]), [ChainId.AVALANCHE]: http(avalanche.rpcUrls.default.http[0]), @@ -582,231 +582,231 @@ export const publicTransports = { } as const satisfies Record export const publicChains = [ - arbitrumNova, - arbitrum, - avalanche, - boba, + arbitrumNova as Chain, + arbitrum as Chain, + avalanche as Chain, + boba as Chain, bobaAvax, bobaBnb, - bsc, + bsc as Chain, bttc, blast, - celo as unknown as Omit & { id: 42220 }, - cronos, - mainnet, - fantom, - fuse, - gnosis, - harmonyOne, + celo as Chain, + cronos as Chain, + mainnet as Chain, + fantom as Chain, + fuse as Chain, + gnosis as Chain, + harmonyOne as Chain, kava, - metis, - optimism, - moonbeam, - moonriver, - polygon, - polygonZkEvm, + metis as Chain, + optimism as Chain, + moonbeam as Chain, + moonriver as Chain, + polygon as Chain, + polygonZkEvm as Chain, thundercore, - haqq, + haqq as Chain, core, - telos, + telos as Chain, palm, - okc, + okc as Chain, heco, - zkSync, - linea, - base, - scroll, + zkSync as Chain, + linea as Chain, + base as Chain, + scroll as Chain, filecoin, zetachain, - flare, + flare as Chain, matchain, /* Testnets */ - arbitrumSepolia, - avalancheFuji, - bscTestnet, - fantomTestnet, - polygonMumbai, - sepolia, + arbitrumSepolia as Chain, + avalancheFuji as Chain, + bscTestnet as Chain, + fantomTestnet as Chain, + polygonMumbai as Chain, + sepolia as Chain, ] as const satisfies Readonly export const publicClientConfig = { [ChainId.ARBITRUM_NOVA]: { - chain: arbitrumNova, + chain: arbitrumNova as Chain, transport: publicTransports[ChainId.ARBITRUM_NOVA], }, [ChainId.ARBITRUM]: { - chain: arbitrum, + chain: arbitrum as Chain, transport: publicTransports[ChainId.ARBITRUM], }, [ChainId.AVALANCHE]: { - chain: avalanche, + chain: avalanche as Chain, transport: publicTransports[ChainId.AVALANCHE], }, [ChainId.BOBA]: { - chain: boba, + chain: boba as Chain, transport: publicTransports[ChainId.BOBA], }, [ChainId.BOBA_AVAX]: { - chain: bobaAvax, + chain: bobaAvax as Chain, transport: publicTransports[ChainId.BOBA_AVAX], }, [ChainId.BOBA_BNB]: { - chain: bobaBnb, + chain: bobaBnb as Chain, transport: publicTransports[ChainId.BOBA_BNB], }, [ChainId.BSC]: { - chain: bsc, + chain: bsc as Chain, transport: publicTransports[ChainId.BSC], }, [ChainId.BTTC]: { - chain: bttc, + chain: bttc as Chain, transport: publicTransports[ChainId.BTTC], }, [ChainId.CELO]: { - chain: celo as unknown as typeof mainnet & { id: 42220 }, + chain: celo as unknown as typeof mainnet & { id: 42220 } as Chain, transport: publicTransports[ChainId.CELO], }, [ChainId.ETHEREUM]: { - chain: mainnet, + chain: mainnet as Chain, transport: publicTransports[ChainId.ETHEREUM], }, [ChainId.FANTOM]: { - chain: fantom, + chain: fantom as Chain, transport: publicTransports[ChainId.FANTOM], }, [ChainId.FUSE]: { - chain: fuse, + chain: fuse as Chain, transport: publicTransports[ChainId.FUSE], }, [ChainId.GNOSIS]: { - chain: gnosis, + chain: gnosis as Chain, transport: publicTransports[ChainId.GNOSIS], }, [ChainId.HARMONY]: { - chain: harmonyOne, + chain: harmonyOne as Chain, transport: publicTransports[ChainId.HARMONY], }, [ChainId.KAVA]: { - chain: kava, + chain: kava as Chain, transport: publicTransports[ChainId.KAVA], }, [ChainId.METIS]: { - chain: metis, + chain: metis as Chain, transport: publicTransports[ChainId.METIS], }, [ChainId.MOONBEAM]: { - chain: moonbeam, + chain: moonbeam as Chain, transport: publicTransports[ChainId.MOONBEAM], }, [ChainId.MOONRIVER]: { - chain: moonriver, + chain: moonriver as Chain, transport: publicTransports[ChainId.MOONRIVER], }, [ChainId.OPTIMISM]: { - chain: optimism, + chain: optimism as Chain, transport: publicTransports[ChainId.OPTIMISM], }, [ChainId.POLYGON]: { - chain: polygon, + chain: polygon as Chain, transport: publicTransports[ChainId.POLYGON], }, [ChainId.POLYGON_ZKEVM]: { - chain: polygonZkEvm, + chain: polygonZkEvm as Chain, transport: publicTransports[ChainId.POLYGON_ZKEVM], }, [ChainId.THUNDERCORE]: { - chain: thundercore, + chain: thundercore as Chain, transport: publicTransports[ChainId.THUNDERCORE], }, [ChainId.HAQQ]: { - chain: haqq, + chain: haqq as Chain, transport: publicTransports[ChainId.HAQQ], }, [ChainId.CORE]: { - chain: core, + chain: core as Chain, transport: publicTransports[ChainId.CORE], }, [ChainId.TELOS]: { - chain: telos, + chain: telos as Chain, transport: publicTransports[ChainId.TELOS], }, [ChainId.PALM]: { - chain: palm, + chain: palm as Chain, transport: publicTransports[ChainId.PALM], }, [ChainId.OKEX]: { - chain: okc, + chain: okc as Chain, transport: publicTransports[ChainId.OKEX], }, [ChainId.HECO]: { - chain: heco, + chain: heco as Chain, transport: publicTransports[ChainId.HECO], }, [ChainId.ZKSYNC_ERA]: { - chain: zkSync, + chain: zkSync as Chain, transport: publicTransports[ChainId.ZKSYNC_ERA], }, [ChainId.LINEA]: { - chain: linea, + chain: linea as Chain, transport: publicTransports[ChainId.LINEA], }, [ChainId.BASE]: { - chain: base, + chain: base as Chain, transport: publicTransports[ChainId.BASE], }, [ChainId.SCROLL]: { - chain: scroll, + chain: scroll as Chain, transport: publicTransports[ChainId.SCROLL], }, [ChainId.FILECOIN]: { - chain: filecoin, + chain: filecoin as Chain, transport: publicTransports[ChainId.FILECOIN], }, [ChainId.ZETACHAIN]: { - chain: zetachain, + chain: zetachain as Chain, transport: publicTransports[ChainId.ZETACHAIN], }, [ChainId.CRONOS]: { - chain: cronos, + chain: cronos as Chain, transport: publicTransports[ChainId.CRONOS], }, [ChainId.BLAST]: { - chain: blast, + chain: blast as Chain, transport: publicTransports[ChainId.BLAST], }, [ChainId.FLARE]: { - chain: flare, + chain: flare as Chain, transport: publicTransports[ChainId.FLARE], }, [ChainId.MATCHAIN]: { - chain: matchain, + chain: matchain as Chain, transport: publicTransports[ChainId.MATCHAIN], }, /* Testnets */ [ChainId.ARBITRUM_TESTNET]: { - chain: arbitrumSepolia, + chain: arbitrumSepolia as Chain, transport: publicTransports[ChainId.ARBITRUM_TESTNET], }, [ChainId.AVALANCHE_TESTNET]: { - chain: avalancheFuji, + chain: avalancheFuji as Chain, transport: publicTransports[ChainId.AVALANCHE_TESTNET], }, [ChainId.BSC_TESTNET]: { - chain: bscTestnet, + chain: bscTestnet as Chain, transport: publicTransports[ChainId.BSC_TESTNET], }, [ChainId.FANTOM_TESTNET]: { - chain: fantomTestnet, + chain: fantomTestnet as Chain, transport: publicTransports[ChainId.FANTOM_TESTNET], }, [ChainId.POLYGON_TESTNET]: { - chain: polygonMumbai, + chain: polygonMumbai as Chain, transport: publicTransports[ChainId.POLYGON_TESTNET], }, [ChainId.SEPOLIA]: { - chain: sepolia, + chain: sepolia as Chain, transport: publicTransports[ChainId.SEPOLIA], }, } as const satisfies Record< diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index 9369a6ee67..f6fbd3c935 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -22,7 +22,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { override TICK_SPACINGS: Record = {} readonly BASE_FEE = 100 - readonly DEFAULT_TICK_SPACING = 60 + DEFAULT_TICK_SPACING = 1 poolDeployer: Record = {} @@ -116,19 +116,92 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return undefined }) + let tickSpacings: + | ( + | number + | { + error?: undefined + result: number + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + | undefined + + try { + const tickSpacingsData = { + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: [ + { + inputs: [], + name: 'tickSpacing', + outputs: [{ internalType: 'int24', name: '', type: 'int24' }], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'tickSpacing', + }) as const, + ), + } + tickSpacings = options?.memoize + ? await (multicallMemoize(tickSpacingsData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, + ) + : await this.client.multicall(tickSpacingsData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + } catch (_error) {} + const existingPools: V3Pool[] = [] - staticPools.forEach((pool, i) => { - if (globalState === undefined || !globalState[i]) return + for (let i = 0; i < staticPools.length; i++) { + const pool = staticPools[i]! + let thisTickSpacing = this.DEFAULT_TICK_SPACING + if (tickSpacings !== undefined && Array.isArray(tickSpacings)) { + if (tickSpacings[i] !== undefined) { + const ts = tickSpacings[i] + if (typeof ts === 'number') { + thisTickSpacing = ts + } else { + if (ts?.status === 'success') { + thisTickSpacing = ts.result + } + } + } + } + if (globalState === undefined || !globalState[i]) continue const sqrtPriceX96 = globalState[i]!.result?.[0] // price const tick = globalState[i]!.result?.[1] // tick if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') - return + continue const fee = globalState[i]!.result?.[2] // fee - if (!fee) return - const activeTick = - Math.floor(tick / this.DEFAULT_TICK_SPACING) * this.DEFAULT_TICK_SPACING - if (typeof activeTick !== 'number') return + if (!fee) continue + const activeTick = Math.floor(tick / thisTickSpacing) * thisTickSpacing + if (typeof activeTick !== 'number') continue this.TICK_SPACINGS[fee] = this.DEFAULT_TICK_SPACING existingPools.push({ ...pool, @@ -136,7 +209,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { sqrtPriceX96, activeTick, }) - }) + } return existingPools } @@ -199,3 +272,5 @@ export function getAlgebraPoolAddress( return getAddress(`0x${keccak256(sanitizedInputs as Hex).slice(-40)}`) } + +// [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"liquidityAmount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"communityFee0New","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"communityFee1New","type":"uint16"}],"name":"CommunityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"fee","type":"uint16"}],"name":"Fee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid1","type":"uint256"}],"name":"Flash","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"virtualPoolAddress","type":"address"}],"name":"Incentive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"price","type":"uint160"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"liquidityCooldown","type":"uint32"}],"name":"LiquidityCooldown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"liquidityAmount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"int256","name":"amount0","type":"int256"},{"indexed":false,"internalType":"int256","name":"amount1","type":"int256"},{"indexed":false,"internalType":"uint160","name":"price","type":"uint160"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int24","name":"newTickSpacing","type":"int24"}],"name":"TickSpacing","type":"event"},{"inputs":[],"name":"activeIncentive","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"}],"name":"collect","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dataStorageOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"}],"name":"getInnerCumulatives","outputs":[{"internalType":"int56","name":"innerTickCumulative","type":"int56"},{"internalType":"uint160","name":"innerSecondsSpentPerLiquidity","type":"uint160"},{"internalType":"uint32","name":"innerSecondsSpent","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"secondsAgos","type":"uint32[]"}],"name":"getTimepoints","outputs":[{"internalType":"int56[]","name":"tickCumulatives","type":"int56[]"},{"internalType":"uint160[]","name":"secondsPerLiquidityCumulatives","type":"uint160[]"},{"internalType":"uint112[]","name":"volatilityCumulatives","type":"uint112[]"},{"internalType":"uint256[]","name":"volumePerAvgLiquiditys","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalState","outputs":[{"internalType":"uint160","name":"price","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"uint16","name":"timepointIndex","type":"uint16"},{"internalType":"uint16","name":"communityFeeToken0","type":"uint16"},{"internalType":"uint16","name":"communityFeeToken1","type":"uint16"},{"internalType":"bool","name":"unlocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"initialPrice","type":"uint160"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityCooldown","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLiquidityPerTick","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"liquidityDesired","type":"uint128"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint128","name":"liquidityActual","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"positions","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint32","name":"lastLiquidityAddTimestamp","type":"uint32"},{"internalType":"uint256","name":"innerFeeGrowth0Token","type":"uint256"},{"internalType":"uint256","name":"innerFeeGrowth1Token","type":"uint256"},{"internalType":"uint128","name":"fees0","type":"uint128"},{"internalType":"uint128","name":"fees1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"communityFee0","type":"uint16"},{"internalType":"uint16","name":"communityFee1","type":"uint16"}],"name":"setCommunityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"virtualPoolAddress","type":"address"}],"name":"setIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newLiquidityCooldown","type":"uint32"}],"name":"setLiquidityCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"newTickSpacing","type":"int24"}],"name":"setTickSpacing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroToOne","type":"bool"},{"internalType":"int256","name":"amountRequired","type":"int256"},{"internalType":"uint160","name":"limitSqrtPrice","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroToOne","type":"bool"},{"internalType":"int256","name":"amountRequired","type":"int256"},{"internalType":"uint160","name":"limitSqrtPrice","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swapSupportingFeeOnInputTokens","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tickSpacing","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int16","name":"","type":"int16"}],"name":"tickTable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"","type":"int24"}],"name":"ticks","outputs":[{"internalType":"uint128","name":"liquidityTotal","type":"uint128"},{"internalType":"int128","name":"liquidityDelta","type":"int128"},{"internalType":"uint256","name":"outerFeeGrowth0Token","type":"uint256"},{"internalType":"uint256","name":"outerFeeGrowth1Token","type":"uint256"},{"internalType":"int56","name":"outerTickCumulative","type":"int56"},{"internalType":"uint160","name":"outerSecondsPerLiquidity","type":"uint160"},{"internalType":"uint32","name":"outerSecondsSpent","type":"uint32"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"timepoints","outputs":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"int56","name":"tickCumulative","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityCumulative","type":"uint160"},{"internalType":"uint88","name":"volatilityCumulative","type":"uint88"},{"internalType":"int24","name":"averageTick","type":"int24"},{"internalType":"uint144","name":"volumePerLiquidityCumulative","type":"uint144"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeGrowth0Token","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeGrowth1Token","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index a70e4ac029..718127beb1 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -1,5 +1,8 @@ -import { PublicClient, parseAbi } from 'viem' +import { Address, PublicClient, parseAbi } from 'viem' import { ChainId } from '../../chain/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { memoizer } from '../memoizer.js' +import { type PoolCode } from '../pool-codes/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' @@ -9,6 +12,7 @@ export class CamelotProvider extends UniswapV2BaseProvider { override getReservesAbi = parseAbi([ 'function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint16 _token0FeePercent, uint16 _token1FeePercent)', ]) + FEE_DENOMINATOR = 100_000n constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM]: '0x6EcCab422D763aC031210895C81787E87B43A652', @@ -25,4 +29,71 @@ export class CamelotProvider extends UniswapV2BaseProvider { getPoolProviderName(): string { return 'Camelot' } + + override async getReserves( + poolCodesToCreate: PoolCode[], + options?: DataFetcherOptions, + ): Promise { + const multicallMemoize = await memoizer.fn(this.client.multicall) + + const multicallData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: poolCodesToCreate.map( + (poolCode) => + ({ + address: poolCode.pool.address as Address, + chainId: this.chainId, + abi: this.getReservesAbi, + functionName: 'getReserves', + }) as const, + ), + } + const reserves = options?.memoize + ? await (multicallMemoize(multicallData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(multicallData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + if (reserves !== undefined && Array.isArray(reserves)) { + reserves.forEach( + (reserve: { + result?: [bigint, bigint, number, number] | undefined + status: 'failure' | 'success' + }) => { + if ( + reserve && + reserve.status === 'success' && + reserve.result !== undefined + ) { + if (reserve.result?.[0]) { + reserve.result[0] -= + (reserve.result[0] * BigInt(reserve.result[2])) / + this.FEE_DENOMINATOR + } + if (reserve.result?.[1]) { + reserve.result[1] -= + (reserve.result[1] * BigInt(reserve.result[3])) / + this.FEE_DENOMINATOR + } + } + }, + ) + } + return reserves + } } diff --git a/packages/sushi/src/router/liquidity-providers/LynexV2.ts b/packages/sushi/src/router/liquidity-providers/LynexV2.ts index 21a4b26c58..50f815cf58 100644 --- a/packages/sushi/src/router/liquidity-providers/LynexV2.ts +++ b/packages/sushi/src/router/liquidity-providers/LynexV2.ts @@ -4,6 +4,7 @@ import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' import { LiquidityProviders } from './LiquidityProvider.js' export class LynexV2Provider extends AlgebraV1BaseProvider { + override DEFAULT_TICK_SPACING = 1 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.LINEA]: '0x622b2c98123D303ae067DB4925CD6282B3A08D0F', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index 7d422b47a4..b47af3aa1f 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -159,6 +159,46 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { return new Map() } + async getReserves( + poolCodesToCreate: PoolCode[], + options?: DataFetcherOptions, + ): Promise { + const multicallMemoize = await memoizer.fn(this.client.multicall) + + const multicallData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: poolCodesToCreate.map( + (poolCode) => + ({ + address: poolCode.pool.address as Address, + chainId: this.chainId, + abi: this.getReservesAbi, + functionName: 'getReserves', + }) as const, + ), + } + return options?.memoize + ? await (multicallMemoize(multicallData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(multicallData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + } + async getOnDemandPools( t0: Token, t1: Token, @@ -223,40 +263,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall) - - const multicallData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: poolCodesToCreate.map( - (poolCode) => - ({ - address: poolCode.pool.address as Address, - chainId: this.chainId, - abi: this.getReservesAbi, - functionName: 'getReserves', - }) as const, - ), - } - const reserves = options?.memoize - ? await (multicallMemoize(multicallData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(multicallData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const reserves = await this.getReserves(poolCodesToCreate, options) poolCodesToCreate.forEach((poolCode, i) => { const pool = poolCode.pool diff --git a/packages/wagmi/package.json b/packages/wagmi/package.json index e954231424..c46fc24db0 100644 --- a/packages/wagmi/package.json +++ b/packages/wagmi/package.json @@ -65,7 +65,7 @@ "@uniswap/v3-periphery": "1.4.1", "next-themes": "0.2.1", "sushi": "workspace:*", - "zod": "3.21.4" + "zod": "3.22.0" }, "devDependencies": { "@sentry/nextjs": "7.101.1", @@ -80,7 +80,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "typescript": "5.2.2", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20" }, "peerDependencies": { @@ -89,7 +89,7 @@ "next": "14.1.0", "react": "18.2.0", "react-dom": "18.2.0", - "viem": "2.8.14", + "viem": "2.21.35", "wagmi": "2.5.20" }, "peerDependenciesMeta": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2988565ef7..0167f28201 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,7 +64,7 @@ importers: version: link:../../packages/extractor '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) cors: specifier: 2.8.5 version: 2.8.5 @@ -78,14 +78,14 @@ importers: specifier: workspace:* version: link:../../packages/sushi viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@tsconfig/esm': specifier: 1.0.4 @@ -125,7 +125,7 @@ importers: version: link:../../packages/extractor '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) cors: specifier: 2.8.5 version: 2.8.5 @@ -139,14 +139,14 @@ importers: specifier: workspace:* version: link:../../packages/sushi viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@tsconfig/esm': specifier: 1.0.4 @@ -229,7 +229,7 @@ importers: version: 3.0.9 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) drizzle-orm: specifier: ^0.29.5 version: 0.29.5(@neondatabase/serverless@0.9.0)(postgres@3.4.4)(react@18.2.0) @@ -240,11 +240,11 @@ importers: specifier: workspace:* version: link:../../packages/sushi viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@sushiswap/jest-config': specifier: workspace:* @@ -333,7 +333,7 @@ importers: version: 0.82.3(@babel/core@7.24.4)(@types/node@20.10.0)(graphql-tag@2.12.6)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/graphql': specifier: 0.94.2 - version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.8.0) '@next/eslint-plugin-next': specifier: 14.1.0 version: 14.1.0 @@ -439,7 +439,7 @@ importers: version: 0.82.3(@babel/core@7.24.4)(@types/node@20.10.0)(graphql-tag@2.12.6)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/graphql': specifier: 0.94.2 - version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.8.0) '@next/eslint-plugin-next': specifier: 14.1.0 version: 14.1.0 @@ -583,10 +583,10 @@ importers: version: 0.4.1 '@wagmi/connectors': specifier: ^4.1.14 - version: 4.1.19(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 4.1.19(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) cors: specifier: 2.8.5 version: 2.8.5 @@ -666,14 +666,14 @@ importers: specifier: 1.3.1 version: 1.3.1 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(@upstash/redis@1.22.1)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(@upstash/redis@1.22.1)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@0xsquid/squid-types': specifier: ^0.1.59 @@ -1117,7 +1117,7 @@ importers: version: 2.0.2 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) jest: specifier: 29.7.0 version: 29.7.0(@types/node@20.10.0) @@ -1150,37 +1150,37 @@ importers: version: 3.0.0(@babel/core@7.24.4)(@envelop/core@4.0.0)(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/delegate@10.0.4)(@graphql-tools/merge@9.0.0)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.5)(@swc/core@1.4.2)(@types/node@20.12.7)(graphql-tag@2.12.6)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/cache-localforage': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/cross-helpers': specifier: 0.4.0 version: 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/graphql': specifier: 0.94.2 - version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(@types/node@20.12.7)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(@types/node@20.12.7)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/http': specifier: 0.94.4 - version: 0.94.4(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/runtime@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.4(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/runtime@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/merger-stitching': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/runtime': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/store': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-filter-schema': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-prefix': specifier: 0.94.2 - version: 0.94.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-type-merging': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': specifier: 0.94.1 - version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/merge': specifier: 9.0.0 version: 9.0.0(graphql@16.6.0) @@ -1204,7 +1204,7 @@ importers: version: link:../../config/wagmi '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@whatwg-node/fetch': specifier: 0.8.4 version: 0.8.4 @@ -1233,11 +1233,11 @@ importers: specifier: ^4.7.1 version: 4.7.1 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@sushiswap/jest-config': specifier: workspace:* @@ -1317,8 +1317,8 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) packages/client: dependencies: @@ -1344,11 +1344,11 @@ importers: specifier: latest version: 2.6.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@sushiswap/jest-config': specifier: workspace:* @@ -1489,13 +1489,13 @@ importers: version: 1.0.1 abitype: specifier: 0.9.8 - version: 0.9.8(typescript@5.2.2)(zod@3.21.4) + version: 0.9.8(typescript@5.2.2)(zod@3.22.0) sushi: specifier: workspace:* version: link:../sushi viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) devDependencies: '@sushiswap/jest-config': specifier: workspace:* @@ -1535,19 +1535,19 @@ importers: version: 3.0.0(@babel/core@7.24.4)(@envelop/core@4.0.0)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@10.0.4)(@graphql-tools/merge@9.0.3)(@graphql-tools/utils@9.2.1)(@graphql-tools/wrap@10.0.5)(@types/node@20.10.0)(graphql-tag@2.12.6)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/transform-filter-schema': specifier: 0.96.6 - version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-prefix': specifier: 0.96.6 - version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-prune': specifier: 0.96.6 - version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-rename': specifier: 0.96.7 - version: 0.96.7(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + version: 0.96.7(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/transform-type-merging': specifier: 0.96.6 - version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.6.2) + version: 0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/merge': specifier: 9.0.3 version: 9.0.3(graphql@16.6.0) @@ -1575,7 +1575,7 @@ importers: version: 20.10.0 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) graphql: specifier: 16.6.0 version: 16.6.0 @@ -1668,8 +1668,8 @@ importers: specifier: 4.0.0 version: 4.0.0 zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 devDependencies: '@sentry/nextjs': specifier: 7.101.1 @@ -1717,11 +1717,11 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) packages/steer-sdk: dependencies: @@ -1741,11 +1741,11 @@ importers: specifier: latest version: 2.6.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@5.29.2)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + version: 2.5.20(@tanstack/react-query@5.29.2)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) optionalDependencies: next: specifier: 14.1.0 @@ -1765,7 +1765,7 @@ importers: version: 20.10.0 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) eslint: specifier: 8.43.0 version: 8.43.0 @@ -1859,7 +1859,7 @@ importers: version: 3.0.1 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) ts-node: specifier: 10.9.2 version: 10.9.2(@swc/core@1.4.2)(@types/node@20.12.7)(typescript@5.2.2) @@ -1867,14 +1867,14 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) vitest: specifier: 0.34.6 version: 0.34.6 zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 packages/ui: dependencies: @@ -2085,7 +2085,7 @@ importers: version: 5.2.2 wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@5.29.2)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + version: 2.5.20(@tanstack/react-query@5.29.2)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) packages/wagmi: dependencies: @@ -2144,8 +2144,8 @@ importers: specifier: workspace:* version: link:../sushi zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: 3.22.0 + version: 3.22.0 optionalDependencies: next: specifier: 14.1.0 @@ -2171,7 +2171,7 @@ importers: version: 18.2.6 '@wagmi/core': specifier: 2.6.17 - version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) eslint-config-sushi: specifier: workspace:* version: link:../../config/eslint @@ -2185,11 +2185,11 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) wagmi: specifier: 2.5.20 - version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + version: 2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) protocols/route-processor: devDependencies: @@ -2314,8 +2314,8 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) protocols/tines-sandbox: devDependencies: @@ -2455,8 +2455,8 @@ importers: specifier: 5.2.2 version: 5.2.2 viem: - specifier: 2.8.14 - version: 2.8.14(typescript@5.2.2)(zod@3.21.4) + specifier: 2.21.35 + version: 2.21.35(typescript@5.2.2)(zod@3.22.0) packages: @@ -2502,6 +2502,9 @@ packages: /@adraffy/ens-normalize@1.10.0: resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + /@adraffy/ens-normalize@1.11.0: + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -7932,7 +7935,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: 16.6.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.4(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.5(graphql@16.6.0) @@ -7951,7 +7954,7 @@ packages: '@graphql-tools/wrap': ^9.4.2 || ^10.0.0 graphql: 16.6.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.4(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.5(graphql@16.6.0) @@ -7969,7 +7972,7 @@ packages: graphql: 16.6.0 dependencies: '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.5.0) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.4(graphql@16.6.0) graphql: 16.6.0 tslib: 2.5.0 @@ -7986,7 +7989,7 @@ packages: graphql: 16.6.0 dependencies: '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.5.0) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.4(graphql@16.6.0) graphql: 16.6.0 tslib: 2.5.0 @@ -8471,14 +8474,14 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) graphql: 16.6.0 localforage: 1.10.0 tslib: 2.6.2 dev: false - /@graphql-mesh/cache-localforage@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/cache-localforage@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-0cix/UXVVw+EzDAI1mfrPMHNJ5lwKHqmp9DcyzB1XIffu6qZVHWvG9wEqn/yTd0BCAV8HoTcNuPaREh0YX3lAg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8487,11 +8490,11 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) graphql: 16.6.0 localforage: 1.10.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/cli@0.82.3(@babel/core@7.24.4)(@types/node@20.10.0)(graphql-tag@2.12.6)(graphql@16.6.0)(react-native@0.73.7): @@ -8565,7 +8568,7 @@ packages: '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.6.2) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) ajv: 8.12.0 @@ -8617,10 +8620,10 @@ packages: '@graphql-mesh/config': 0.93.1(@babel/core@7.24.4)(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/runtime@0.93.2)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) ajv: 8.12.0 change-case: 4.1.2 @@ -8675,7 +8678,7 @@ packages: '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.24.4)(graphql@16.6.0) '@graphql-tools/graphql-file-loader': 7.5.17(graphql@16.6.0) @@ -8800,10 +8803,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.5.0) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/url-loader': 7.17.18(@types/node@20.10.0)(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) @@ -8829,10 +8832,10 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.5.0) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/url-loader': 7.17.18(@types/node@20.12.7)(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) @@ -8846,7 +8849,7 @@ packages: - utf-8-validate dev: false - /@graphql-mesh/graphql@0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(@types/node@20.12.7)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/graphql@0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(@types/node@20.12.7)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-uKPaHpnZqxU0pGa79xlfrJB85vbZ5rTfhdBK+HtYAp+1MCL4xB9Rjomyu2VG+KDvfdtu2sj9Bqql+5NGztZFMQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8859,24 +8862,24 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/url-loader': 8.0.0(@types/node@20.12.7)(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 lodash.get: 4.4.2 - tslib: 2.6.2 + tslib: 2.8.0 transitivePeerDependencies: - '@types/node' - bufferutil - utf-8-validate dev: false - /@graphql-mesh/graphql@0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/graphql@0.94.2(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(@types/node@20.10.0)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-uKPaHpnZqxU0pGa79xlfrJB85vbZ5rTfhdBK+HtYAp+1MCL4xB9Rjomyu2VG+KDvfdtu2sj9Bqql+5NGztZFMQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8889,17 +8892,17 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/url-loader': 8.0.0(@types/node@20.10.0)(graphql@16.6.0) '@graphql-tools/utils': 10.1.3(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 lodash.get: 4.4.2 - tslib: 2.6.2 + tslib: 2.8.0 transitivePeerDependencies: - '@types/node' - bufferutil @@ -8941,7 +8944,7 @@ packages: dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) fets: 0.1.5 graphql: 16.6.0 @@ -8949,7 +8952,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/http@0.94.4(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/runtime@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/http@0.94.4(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/runtime@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-eUye4S9tnp+BijW1ol7bD8TUyM7ptRqgxAhBej79pVlx/fs98z1IUxIgTb39HzNBBZaPaLdNtWv5Yqd/PImXEw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8961,13 +8964,13 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/runtime': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/runtime': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@whatwg-node/server': 0.9.33 graphql: 16.6.0 graphql-yoga: 4.0.5(graphql@16.6.0) - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/merger-bare@0.16.4(graphql@16.6.0)(react-native@0.73.7): @@ -8997,7 +9000,7 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/schema': 9.0.19(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) @@ -9038,7 +9041,7 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/schema': 9.0.19(graphql@16.6.0) @@ -9049,7 +9052,7 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/merger-stitching@0.94.1(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/merger-stitching@0.94.1(@graphql-mesh/store@0.94.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-s9yPkX9mJG4Ceyl0kyMdwX/nmD+mxHU/SXW8xIo1+YkFOOogJbwEgiF2QZaxIsBJgsE1uB8vAc6FmUg6wNLgKg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9060,16 +9063,16 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/schema': 10.0.0(graphql@16.6.0) '@graphql-tools/stitch': 9.1.0(graphql@16.6.0) '@graphql-tools/stitching-directives': 3.0.0(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/runtime@0.46.2(graphql@16.6.0)(react-native@0.73.7): @@ -9111,7 +9114,7 @@ packages: '@envelop/extended-validation': 2.0.6(@envelop/core@3.0.6)(graphql@16.6.0) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.6.0) '@graphql-tools/batch-execute': 8.5.22(graphql@16.6.0) @@ -9123,7 +9126,33 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/runtime@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): + resolution: {integrity: sha512-8z9ag3jZLmkzawMzF6+i/+P1nQai+HmSZzNeJJen6fRkwprSM1Z7B4lfYBYhdiCbK11HHubDfw4LYwRuBcISMQ==} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.3.4 + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + '@graphql-tools/utils': ^9.2.1 + graphql: 16.6.0 + tslib: ^2.4.0 + dependencies: + '@envelop/core': 3.0.6 + '@envelop/extended-validation': 2.0.6(@envelop/core@3.0.6)(graphql@16.6.0) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) + '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-tools/batch-delegate': 8.4.27(graphql@16.6.0) + '@graphql-tools/batch-execute': 8.5.22(graphql@16.6.0) + '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) + '@graphql-tools/utils': 9.2.1(graphql@16.6.0) + '@graphql-tools/wrap': 9.4.2(graphql@16.6.0) + '@whatwg-node/fetch': 0.8.4 + graphql: 16.6.0 + tslib: 2.8.0 + dev: false + + /@graphql-mesh/runtime@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-C2f2XmdKD1j7SU/btRFGupJHFBkVJ25WyhHCOw6k31dbbK/o8zuwsD1bPTW5JIzs4zpGmAdEoNcs7G/axe5XJw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9137,9 +9166,9 @@ packages: '@envelop/core': 4.0.0 '@envelop/extended-validation': 3.0.3(@envelop/core@4.0.0)(graphql@16.6.0) '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/batch-delegate': 9.0.0(graphql@16.6.0) '@graphql-tools/batch-execute': 9.0.1(graphql@16.6.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) @@ -9147,7 +9176,7 @@ packages: '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) '@whatwg-node/fetch': 0.9.9 graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/store@0.9.3(graphql@16.6.0)(react-native@0.73.7): @@ -9179,14 +9208,33 @@ packages: dependencies: '@graphql-inspector/core': 3.3.0(graphql@16.6.0) '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) graphql: 16.6.0 tslib: 2.6.2 dev: false - /@graphql-mesh/store@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): + resolution: {integrity: sha512-OEljVuaZn2htU1rt4Yll/aJmynw3/Kvhd6eE8V0/del0u9iuLJqiKkzFJl8HUSMh0IkO10OnficJnTM0tCmxRw==} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.3.4 + '@graphql-mesh/types': ^0.93.1 + '@graphql-mesh/utils': ^0.93.1 + '@graphql-tools/utils': ^9.2.1 + graphql: 16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-inspector/core': 3.3.0(graphql@16.6.0) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-tools/utils': 9.2.1(graphql@16.6.0) + graphql: 16.6.0 + tslib: 2.8.0 + dev: false + + /@graphql-mesh/store@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-EbHLSPdlRqq0VYjdKXhKCAGdpP0n9qFPduugdGrd35Vk4UaBo4VdBhXQ1vkenAI3VK1VXWjCB+aaC2ikva/2yQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9199,14 +9247,14 @@ packages: dependencies: '@graphql-inspector/core': 5.0.0(graphql@16.6.0) '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/store@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/store@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-EbHLSPdlRqq0VYjdKXhKCAGdpP0n9qFPduugdGrd35Vk4UaBo4VdBhXQ1vkenAI3VK1VXWjCB+aaC2ikva/2yQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9219,11 +9267,11 @@ packages: dependencies: '@graphql-inspector/core': 5.0.0(graphql@16.6.0) '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/utils': 10.1.3(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /@graphql-mesh/string-interpolation@0.4.1(graphql@16.6.0): @@ -9263,7 +9311,20 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/string-interpolation@0.5.1(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/string-interpolation@0.4.4(graphql@16.6.0)(tslib@2.8.0): + resolution: {integrity: sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ==} + peerDependencies: + graphql: 16.6.0 + tslib: ^2.4.0 + dependencies: + dayjs: 1.11.7 + graphql: 16.6.0 + json-pointer: 0.6.2 + lodash.get: 4.4.2 + tslib: 2.8.0 + dev: false + + /@graphql-mesh/string-interpolation@0.5.1(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-xrShpJ4silpWekpeVntDNt6NY6RxEMMbZ1CenIkLsl/QN3mMjxWa3rQX0qrByBeyDn7SorSN3lrClCCsPvmWZw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9274,9 +9335,9 @@ packages: graphql: 16.6.0 json-pointer: 0.6.2 lodash.get: 4.4.2 - tslib: 2.6.2 + tslib: 2.8.0 - /@graphql-mesh/transform-filter-schema@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-filter-schema@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-833mj7JsSJbP3797Ls+fS6SXzf13ZKe92ghOn+3b6CMSHpP7k3jacVjhvoMdmw7IdYo6OC0+XjbQzF/A6YE/cA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9286,17 +9347,17 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 minimatch: 9.0.3 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-filter-schema@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-filter-schema@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-l6P0FYmS4f3Sq0rCnLWcSQi6QawyAcXFtEs61+aDLZU/EUp9NmjLYKjO4pWjxvOEbguBWx+ZcKRH3jNGaavokQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9306,17 +9367,17 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 minimatch: 9.0.3 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-prefix@0.94.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-prefix@0.94.2(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-1G9mscftMPIAnN3yZfOLka1lUQ38pXIzdxjg77SmkCt85BE0Asjsbn8hitdQGiCMd5urVvj/WmxGDx+iJt8y8g==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9326,17 +9387,17 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 graphql-scalars: 1.23.0(graphql@16.6.0) - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-prefix@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-prefix@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-950SfyNr2VIC4viujk/nedAehBKjv5FowRlZs/6fWZiktN6/6KELMZcZcbk6VI2fi3yB5evl4X43tJRRY3Zl+A==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9346,17 +9407,17 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 graphql-scalars: 1.23.0(graphql@16.6.0) - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-prune@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-prune@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-brKG+MVd2gsGbYitV1TtpMOShXKrZsbM2jI/2YHz1wrnMDEx2gQLT1/XYi/rKbKLizJjKAPUwiAbOJKzpdf3UA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9365,13 +9426,13 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-rename@0.96.7(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-rename@0.96.7(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-v1oUlx6HXIqwhPnGGLQ/MgoHYF1yQVUCVB154nNghYlQtOCkMhktK+45QXAdVho398icyRyVAY+N1sl6oFynPA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9381,14 +9442,14 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 10.0.0(graphql@16.6.0) graphql: 16.6.0 graphql-scalars: 1.23.0(graphql@16.6.0) - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.5.0): @@ -9399,8 +9460,8 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.6.0) graphql: 16.6.0 @@ -9415,15 +9476,15 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.6.0) graphql: 16.6.0 tslib: 2.5.0 dev: false - /@graphql-mesh/transform-type-merging@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.94.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-VO/28veFKTAY1Ngd+jUxb6wo6XDManhpc+eQ6bL8OpsEU6viJkL/2Hxi7SoC37bXA9/5zAkPaMAP+tdQ26O6GQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9432,15 +9493,15 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/stitching-directives': 3.0.0(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/transform-type-merging@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/transform-type-merging@0.96.6(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-vbY3HDAdNjgbNVHC4fBqovZbWSZ7HWDyIvC3/ujbdzA5eGkWy15zCC87cbb6vblatgA6BkY+WnopTHyUTrTaWQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9449,12 +9510,12 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/stitching-directives': 3.0.0(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@graphql-mesh/types@0.89.2(graphql@16.6.0)(react-native@0.73.7): @@ -9474,7 +9535,7 @@ packages: - react-native-windows dev: true - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: '@graphql-mesh/store': ^0.93.1 @@ -9482,16 +9543,16 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.6.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-typed-document-node/core': 3.2.0(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: '@graphql-mesh/store': ^0.93.1 @@ -9499,16 +9560,16 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.6.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-typed-document-node/core': 3.2.0(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/types@0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/types@0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-Dir0ETwXhNK0Du5CHQ51xnBu/t5PhcTBbQVniPq/zgM02FJZRvbRHqlg2/Q1g3X3M9dIjs787XLhEarG4imL2g==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9517,13 +9578,13 @@ packages: graphql: 16.6.0 tslib: ^2.4.0 dependencies: - '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/store': 0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-mesh/utils@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/batch-delegate': 9.0.1(graphql@16.6.0) '@graphql-tools/delegate': 10.0.4(graphql@16.6.0) '@graphql-tools/utils': 10.1.3(graphql@16.6.0) '@graphql-typed-document-node/core': 3.2.0(graphql@16.6.0) graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /@graphql-mesh/utils@0.43.3(graphql@16.6.0)(react-native@0.73.7): @@ -9559,7 +9620,7 @@ packages: dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) dset: 3.1.2 @@ -9571,7 +9632,30 @@ packages: tslib: 2.6.2 dev: false - /@graphql-mesh/utils@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): + resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} + peerDependencies: + '@graphql-mesh/cross-helpers': ^0.3.4 + '@graphql-mesh/types': ^0.93.2 + '@graphql-tools/utils': ^9.2.1 + graphql: 16.6.0 + tslib: ^2.4.0 + dependencies: + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) + '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) + '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) + '@graphql-tools/utils': 9.2.1(graphql@16.6.0) + dset: 3.1.2 + graphql: 16.6.0 + js-yaml: 4.1.0 + lodash.get: 4.4.2 + lodash.topath: 4.5.2 + tiny-lru: 8.0.2 + tslib: 2.8.0 + dev: false + + /@graphql-mesh/utils@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-K5cGtD+zmYcikoprovANM0B1MDAHE3tadSM7fDoEbfy//vBCXYfLAVjzgAMVxeS0M7KEH1vVqtHHZJKCvSjAoQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9582,8 +9666,8 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@9.2.1)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) dset: 3.1.2 @@ -9592,10 +9676,10 @@ packages: lodash.get: 4.4.2 lodash.topath: 4.5.2 tiny-lru: 11.0.1 - tslib: 2.6.2 + tslib: 2.8.0 dev: false - /@graphql-mesh/utils@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2): + /@graphql-mesh/utils@0.94.1(@graphql-mesh/cross-helpers@0.4.0)(@graphql-mesh/types@0.94.6)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0): resolution: {integrity: sha512-K5cGtD+zmYcikoprovANM0B1MDAHE3tadSM7fDoEbfy//vBCXYfLAVjzgAMVxeS0M7KEH1vVqtHHZJKCvSjAoQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9606,8 +9690,8 @@ packages: tslib: ^2.4.0 dependencies: '@graphql-mesh/cross-helpers': 0.4.0(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(react-native@0.73.7) - '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.6.2) - '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.6.2) + '@graphql-mesh/string-interpolation': 0.5.1(graphql@16.6.0)(tslib@2.8.0) + '@graphql-mesh/types': 0.94.6(@graphql-mesh/store@0.94.1)(@graphql-tools/utils@10.1.3)(graphql@16.6.0)(tslib@2.8.0) '@graphql-tools/delegate': 10.0.2(graphql@16.6.0) '@graphql-tools/utils': 10.1.3(graphql@16.6.0) dset: 3.1.2 @@ -9616,7 +9700,7 @@ packages: lodash.get: 4.4.2 lodash.topath: 4.5.2 tiny-lru: 11.0.1 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /@graphql-tools/batch-delegate@8.4.13(graphql@16.6.0): @@ -10460,7 +10544,7 @@ packages: cross-inspect: 1.0.0 dset: 3.1.3 graphql: 16.6.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /@graphql-tools/utils@8.13.1(graphql@16.6.0): @@ -10688,6 +10772,7 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@8.1.1) @@ -10706,6 +10791,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: false /@ioredis/commands@1.2.0: @@ -11670,6 +11756,12 @@ packages: dependencies: '@noble/hashes': 1.3.2 + /@noble/curves@1.6.0: + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.5.0 + /@noble/hashes@1.2.0: resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -11681,6 +11773,10 @@ packages: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} + /@noble/hashes@1.5.0: + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -14982,15 +15078,14 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 - dev: false /@rushstack/eslint-patch@1.3.3: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} - /@safe-global/safe-apps-provider@0.18.1(typescript@5.2.2)(zod@3.21.4): + /@safe-global/safe-apps-provider@0.18.1(typescript@5.2.2)(zod@3.22.0): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -14999,11 +15094,11 @@ packages: - utf-8-validate - zod - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.2.2)(zod@3.21.4): + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.2.2)(zod@3.22.0): resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.9.0 - viem: 1.21.4(typescript@5.2.2)(zod@3.21.4) + viem: 1.21.4(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - bufferutil - encoding @@ -15021,6 +15116,9 @@ packages: /@scure/base@1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + /@scure/base@1.1.9: + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + /@scure/bip32@1.1.5: resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} dependencies: @@ -15042,6 +15140,13 @@ packages: '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 + /@scure/bip32@1.5.0: + resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + /@scure/bip39@1.1.1: resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} dependencies: @@ -15054,6 +15159,12 @@ packages: '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 + /@scure/bip39@1.4.0: + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + /@sentry-internal/feedback@7.101.1: resolution: {integrity: sha512-fOKDMVvLX+FuJHJszKBvRg1m7+fd4hchqRnZ9DDfitT6P5Ppl0gbEt/LStqu8Wq5M0tna+hpdwHlVEt7gZVKzw==} engines: {node: '>=12'} @@ -16892,7 +17003,7 @@ packages: vite: ^3.0.0 || ^4.0.0 dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.3.9) - '@rollup/pluginutils': 5.0.4(rollup@2.78.0) + '@rollup/pluginutils': 5.0.4(rollup@3.29.4) '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.3.9) '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@vitejs/plugin-react': 3.1.0(vite@4.3.9) @@ -19052,7 +19163,7 @@ packages: pretty-format: 29.7.0 dev: true - /@wagmi/connectors@4.1.19(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /@wagmi/connectors@4.1.19(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-7OmdvepGCmzjGlY+pT7SgItgDd+eo7J2q50PywtnZ8xIdIEJUiwDm37izwQH0S7ZH8EL/9XkmOuz9hV5ORwn8Q==} peerDependencies: '@wagmi/core': 2.6.10 @@ -19064,13 +19175,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(@upstash/redis@1.22.1)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19096,7 +19207,7 @@ packages: - zod dev: false - /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} peerDependencies: '@wagmi/core': 2.6.17 @@ -19108,13 +19219,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(@upstash/redis@1.22.1)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19140,7 +19251,7 @@ packages: - zod dev: false - /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14): + /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35): resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} peerDependencies: '@wagmi/core': 2.6.17 @@ -19152,13 +19263,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19184,7 +19295,7 @@ packages: - zod dev: true - /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /@wagmi/connectors@4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} peerDependencies: '@wagmi/core': 2.6.17 @@ -19196,13 +19307,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19228,7 +19339,7 @@ packages: - zod dev: true - /@wagmi/connectors@4.1.26(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14): + /@wagmi/connectors@4.1.26(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35): resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} peerDependencies: '@wagmi/core': 2.6.17 @@ -19240,13 +19351,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19272,7 +19383,7 @@ packages: - zod dev: false - /@wagmi/connectors@4.1.26(@wagmi/core@2.6.17)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /@wagmi/connectors@4.1.26(@wagmi/core@2.6.17)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} peerDependencies: '@wagmi/core': 2.6.17 @@ -19284,13 +19395,13 @@ packages: dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.14.3(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.21.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.2.2)(zod@3.22.0) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.14)(react@18.2.0) '@walletconnect/modal': 2.6.2(@types/react@18.2.14)(react@18.2.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19316,7 +19427,7 @@ packages: - zod dev: false - /@wagmi/core@2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14): + /@wagmi/core@2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35): resolution: {integrity: sha512-Ghr7PlD5HO1YJrsaC52j/csgaigBAiTR7cFiwrY7WdwvWLsR5na4Dv6KfHTU3d3al0CKDLanQdRS5nB4mX1M+g==} peerDependencies: '@tanstack/query-core': '>=5.0.0' @@ -19329,9 +19440,9 @@ packages: optional: true dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(typescript@5.2.2)(zod@3.21.4) + mipd: 0.0.5(typescript@5.2.2)(zod@3.22.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) transitivePeerDependencies: - '@types/react' @@ -19341,7 +19452,7 @@ packages: - utf-8-validate - zod - /@wagmi/core@2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /@wagmi/core@2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-Ghr7PlD5HO1YJrsaC52j/csgaigBAiTR7cFiwrY7WdwvWLsR5na4Dv6KfHTU3d3al0CKDLanQdRS5nB4mX1M+g==} peerDependencies: '@tanstack/query-core': '>=5.0.0' @@ -19354,9 +19465,9 @@ packages: optional: true dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(typescript@5.2.2)(zod@3.21.4) + mipd: 0.0.5(typescript@5.2.2)(zod@3.22.0) typescript: 5.2.2 - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) transitivePeerDependencies: - '@types/react' @@ -20044,7 +20155,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false - /abitype@0.9.8(typescript@5.2.2)(zod@3.21.4): + /abitype@0.9.8(typescript@5.2.2)(zod@3.22.0): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: 5.2.2 @@ -20056,10 +20167,10 @@ packages: optional: true dependencies: typescript: 5.2.2 - zod: 3.21.4 + zod: 3.22.0 - /abitype@1.0.0(typescript@5.2.2)(zod@3.21.4): - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + /abitype@1.0.6(typescript@5.2.2)(zod@3.22.0): + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: typescript: 5.2.2 zod: ^3 >=3.22.0 @@ -20070,7 +20181,7 @@ packages: optional: true dependencies: typescript: 5.2.2 - zod: 3.21.4 + zod: 3.22.0 /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -26341,6 +26452,7 @@ packages: /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -27354,8 +27466,8 @@ packages: json-schema-to-ts: 2.9.2 openapi-types: 12.1.3 tslib: 2.6.2 - zod: 3.21.4 - zod-to-json-schema: 3.21.4(zod@3.21.4) + zod: 3.22.0 + zod-to-json-schema: 3.21.4(zod@3.22.0) dev: false /figures@2.0.0: @@ -28241,6 +28353,7 @@ packages: /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -30105,6 +30218,13 @@ packages: dependencies: ws: 8.13.0 + /isows@1.0.6(ws@8.18.0): + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.0 + /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -31239,7 +31359,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.8.0 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -32965,7 +33085,7 @@ packages: minipass: 3.3.6 yallist: 4.0.0 - /mipd@0.0.5(typescript@5.2.2)(zod@3.21.4): + /mipd@0.0.5(typescript@5.2.2)(zod@3.22.0): resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} peerDependencies: typescript: 5.2.2 @@ -32974,7 +33094,7 @@ packages: optional: true dependencies: typescript: 5.2.2 - viem: 1.21.4(typescript@5.2.2)(zod@3.21.4) + viem: 1.21.4(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -39302,6 +39422,9 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + /tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -40446,7 +40569,7 @@ packages: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - /viem@1.21.4(typescript@5.2.2)(zod@3.21.4): + /viem@1.21.4(typescript@5.2.2)(zod@3.22.0): resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: typescript: 5.2.2 @@ -40459,7 +40582,7 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.2.2)(zod@3.21.4) + abitype: 0.9.8(typescript@5.2.2)(zod@3.22.0) isows: 1.0.3(ws@8.13.0) typescript: 5.2.2 ws: 8.13.0 @@ -40468,23 +40591,24 @@ packages: - utf-8-validate - zod - /viem@2.8.14(typescript@5.2.2)(zod@3.21.4): - resolution: {integrity: sha512-K5u9OoyPQ7W8VPa6xY2m7oazuhemp0xuK9Ur8AkaXHtcusism9keTXDDaCw6WWFK3YR9HSojHJOtuVQqvRz0ug==} + /viem@2.21.35(typescript@5.2.2)(zod@3.22.0): + resolution: {integrity: sha512-f3EFc5JILeA9veuNymUN8HG/nKP9ykC0NCgwFrZWuxcCc822GaP0IEnkRBsHGqmjwbz//FxJFmvtx7TBcdVs0A==} peerDependencies: typescript: 5.2.2 peerDependenciesMeta: typescript: optional: true dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.2.2)(zod@3.21.4) - isows: 1.0.3(ws@8.13.0) + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/bip32': 1.5.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.6(typescript@5.2.2)(zod@3.22.0) + isows: 1.0.6(ws@8.18.0) typescript: 5.2.2 - ws: 8.13.0 + webauthn-p256: 0.0.10 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -40627,7 +40751,7 @@ packages: xml-name-validator: 4.0.0 dev: false - /wagmi@2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(@upstash/redis@1.22.1)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /wagmi@2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(@upstash/redis@1.22.1)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -40639,12 +40763,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 4.28.0(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0) - '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@upstash/redis@1.22.1)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(rollup@3.29.4)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) react: 18.2.0 typescript: 5.2.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -40671,7 +40795,7 @@ packages: - zod dev: false - /wagmi@2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /wagmi@2.5.20(@tanstack/react-query@4.28.0)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -40683,12 +40807,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 4.28.0(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0) - '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) react: 18.2.0 typescript: 5.2.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -40715,7 +40839,7 @@ packages: - zod dev: true - /wagmi@2.5.20(@tanstack/react-query@5.29.2)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14): + /wagmi@2.5.20(@tanstack/react-query@5.29.2)(@types/react@18.2.14)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35): resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -40727,12 +40851,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 5.29.2(react@18.2.0) - '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + '@wagmi/connectors': 4.1.26(@types/react@18.2.14)(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) react: 18.2.0 typescript: 5.2.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -40759,7 +40883,7 @@ packages: - zod dev: true - /wagmi@2.5.20(@tanstack/react-query@5.29.2)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14): + /wagmi@2.5.20(@tanstack/react-query@5.29.2)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35): resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -40771,12 +40895,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 5.29.2(react@18.2.0) - '@wagmi/connectors': 4.1.26(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14) + '@wagmi/connectors': 4.1.26(@wagmi/core@2.6.17)(react-dom@18.2.0)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35) react: 18.2.0 typescript: 5.2.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -40803,7 +40927,7 @@ packages: - zod dev: false - /wagmi@2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4): + /wagmi@2.5.20(@tanstack/react-query@5.29.2)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0): resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -40815,12 +40939,12 @@ packages: optional: true dependencies: '@tanstack/react-query': 5.29.2(react@18.2.0) - '@wagmi/connectors': 4.1.26(@wagmi/core@2.6.17)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) - '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.8.14)(zod@3.21.4) + '@wagmi/connectors': 4.1.26(@wagmi/core@2.6.17)(react-native@0.73.7)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) + '@wagmi/core': 2.6.17(@types/react@18.2.14)(react@18.2.0)(typescript@5.2.2)(viem@2.21.35)(zod@3.22.0) react: 18.2.0 typescript: 5.2.2 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.14(typescript@5.2.2)(zod@3.21.4) + viem: 2.21.35(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -41505,6 +41629,12 @@ packages: - utf-8-validate optional: true + /webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + /webcrypto-core@1.7.7: resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} dependencies: @@ -41936,6 +42066,18 @@ packages: utf-8-validate: optional: true + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@8.5.0: resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} engines: {node: '>=10.0.0'} @@ -42290,16 +42432,20 @@ packages: requiresBuild: true optional: true - /zod-to-json-schema@3.21.4(zod@3.21.4): + /zod-to-json-schema@3.21.4(zod@3.22.0): resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} peerDependencies: zod: ^3.21.4 dependencies: - zod: 3.21.4 + zod: 3.22.0 dev: false /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + + /zod@3.22.0: + resolution: {integrity: sha512-y5KZY/ssf5n7hCGDGGtcJO/EBJEm5Pa+QQvFBeyMOtnFYOSflalxIFFvdaYevPhePcmcKC4aTbFkCcXN7D0O8Q==} /zrender@5.4.4: resolution: {integrity: sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==} @@ -42354,7 +42500,6 @@ packages: name: memoize-fs version: 3.0.0 engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} - prepare: true requiresBuild: true dependencies: meriyah: 4.4.2 diff --git a/protocols/route-processor/package.json b/protocols/route-processor/package.json index 285f896cec..8b6bdad8f3 100644 --- a/protocols/route-processor/package.json +++ b/protocols/route-processor/package.json @@ -68,6 +68,6 @@ "ts-generator": "0.1.1", "ts-node": "10.9.1", "typescript": "5.2.2", - "viem": "2.8.14" + "viem": "2.21.35" } } diff --git a/protocols/tines-sandbox/package.json b/protocols/tines-sandbox/package.json index 06b8dc0f01..24ace56f6a 100644 --- a/protocols/tines-sandbox/package.json +++ b/protocols/tines-sandbox/package.json @@ -76,6 +76,6 @@ "ts-node": "10.9.1", "tsup": "7.2.0", "typescript": "5.2.2", - "viem": "2.8.14" + "viem": "2.21.35" } } From 08199e9b3f1c0851030f18b6c533523ca58e4119 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 28 Oct 2024 12:04:22 +0000 Subject: [PATCH 090/140] Update AlgebraV1Base.ts --- .../sushi/src/router/liquidity-providers/AlgebraV1Base.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index f6fbd3c935..a574bf9ec9 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -179,7 +179,8 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { const existingPools: V3Pool[] = [] for (let i = 0; i < staticPools.length; i++) { - const pool = staticPools[i]! + if (globalState === undefined || !globalState[i]) continue + const pool = staticPools[i]! let thisTickSpacing = this.DEFAULT_TICK_SPACING if (tickSpacings !== undefined && Array.isArray(tickSpacings)) { if (tickSpacings[i] !== undefined) { @@ -193,7 +194,6 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { } } } - if (globalState === undefined || !globalState[i]) continue const sqrtPriceX96 = globalState[i]!.result?.[0] // price const tick = globalState[i]!.result?.[1] // tick if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') From 9a33cecd7878ae8cd66416143f28139fce20f5cc Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 28 Oct 2024 12:05:23 +0000 Subject: [PATCH 091/140] Update AlgebraV1Base.ts --- packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index a574bf9ec9..c386708f8e 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -272,5 +272,3 @@ export function getAlgebraPoolAddress( return getAddress(`0x${keccak256(sanitizedInputs as Hex).slice(-40)}`) } - -// [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"liquidityAmount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"communityFee0New","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"communityFee1New","type":"uint16"}],"name":"CommunityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"fee","type":"uint16"}],"name":"Fee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid1","type":"uint256"}],"name":"Flash","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"virtualPoolAddress","type":"address"}],"name":"Incentive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"price","type":"uint160"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"liquidityCooldown","type":"uint32"}],"name":"LiquidityCooldown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"bottomTick","type":"int24"},{"indexed":true,"internalType":"int24","name":"topTick","type":"int24"},{"indexed":false,"internalType":"uint128","name":"liquidityAmount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"int256","name":"amount0","type":"int256"},{"indexed":false,"internalType":"int256","name":"amount1","type":"int256"},{"indexed":false,"internalType":"uint160","name":"price","type":"uint160"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int24","name":"newTickSpacing","type":"int24"}],"name":"TickSpacing","type":"event"},{"inputs":[],"name":"activeIncentive","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"}],"name":"collect","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dataStorageOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"}],"name":"getInnerCumulatives","outputs":[{"internalType":"int56","name":"innerTickCumulative","type":"int56"},{"internalType":"uint160","name":"innerSecondsSpentPerLiquidity","type":"uint160"},{"internalType":"uint32","name":"innerSecondsSpent","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"secondsAgos","type":"uint32[]"}],"name":"getTimepoints","outputs":[{"internalType":"int56[]","name":"tickCumulatives","type":"int56[]"},{"internalType":"uint160[]","name":"secondsPerLiquidityCumulatives","type":"uint160[]"},{"internalType":"uint112[]","name":"volatilityCumulatives","type":"uint112[]"},{"internalType":"uint256[]","name":"volumePerAvgLiquiditys","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalState","outputs":[{"internalType":"uint160","name":"price","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"uint16","name":"timepointIndex","type":"uint16"},{"internalType":"uint16","name":"communityFeeToken0","type":"uint16"},{"internalType":"uint16","name":"communityFeeToken1","type":"uint16"},{"internalType":"bool","name":"unlocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"initialPrice","type":"uint160"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityCooldown","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLiquidityPerTick","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"bottomTick","type":"int24"},{"internalType":"int24","name":"topTick","type":"int24"},{"internalType":"uint128","name":"liquidityDesired","type":"uint128"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint128","name":"liquidityActual","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"positions","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint32","name":"lastLiquidityAddTimestamp","type":"uint32"},{"internalType":"uint256","name":"innerFeeGrowth0Token","type":"uint256"},{"internalType":"uint256","name":"innerFeeGrowth1Token","type":"uint256"},{"internalType":"uint128","name":"fees0","type":"uint128"},{"internalType":"uint128","name":"fees1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"communityFee0","type":"uint16"},{"internalType":"uint16","name":"communityFee1","type":"uint16"}],"name":"setCommunityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"virtualPoolAddress","type":"address"}],"name":"setIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newLiquidityCooldown","type":"uint32"}],"name":"setLiquidityCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"newTickSpacing","type":"int24"}],"name":"setTickSpacing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroToOne","type":"bool"},{"internalType":"int256","name":"amountRequired","type":"int256"},{"internalType":"uint160","name":"limitSqrtPrice","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroToOne","type":"bool"},{"internalType":"int256","name":"amountRequired","type":"int256"},{"internalType":"uint160","name":"limitSqrtPrice","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swapSupportingFeeOnInputTokens","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tickSpacing","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int16","name":"","type":"int16"}],"name":"tickTable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"","type":"int24"}],"name":"ticks","outputs":[{"internalType":"uint128","name":"liquidityTotal","type":"uint128"},{"internalType":"int128","name":"liquidityDelta","type":"int128"},{"internalType":"uint256","name":"outerFeeGrowth0Token","type":"uint256"},{"internalType":"uint256","name":"outerFeeGrowth1Token","type":"uint256"},{"internalType":"int56","name":"outerTickCumulative","type":"int56"},{"internalType":"uint160","name":"outerSecondsPerLiquidity","type":"uint160"},{"internalType":"uint32","name":"outerSecondsSpent","type":"uint32"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"timepoints","outputs":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"int56","name":"tickCumulative","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityCumulative","type":"uint160"},{"internalType":"uint88","name":"volatilityCumulative","type":"uint88"},{"internalType":"int24","name":"averageTick","type":"int24"},{"internalType":"uint144","name":"volumePerLiquidityCumulative","type":"uint144"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeGrowth0Token","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeGrowth1Token","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] From 72289f46a36ee3779a215e909518214897a99912 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 28 Oct 2024 12:12:54 +0000 Subject: [PATCH 092/140] Update AlgebraV1Base.ts --- packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index c386708f8e..89164244be 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -180,7 +180,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { for (let i = 0; i < staticPools.length; i++) { if (globalState === undefined || !globalState[i]) continue - const pool = staticPools[i]! + const pool = staticPools[i]! let thisTickSpacing = this.DEFAULT_TICK_SPACING if (tickSpacings !== undefined && Array.isArray(tickSpacings)) { if (tickSpacings[i] !== undefined) { From 2a11a38ac51350c428068b1a706380573ae745e2 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 29 Oct 2024 00:56:19 +0000 Subject: [PATCH 093/140] update tick map for algebra --- .../liquidity-providers/AlgebraV1Base.ts | 73 +++++++++++++--- .../liquidity-providers/UniswapV3Base.ts | 84 +++++++++++-------- 2 files changed, 113 insertions(+), 44 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index 89164244be..2d2b4573c3 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -12,14 +12,16 @@ import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' import { + NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, UniswapV3BaseProvider, V3Pool, + bitmapIndex, } from './UniswapV3Base.js' export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { - override TICK_SPACINGS: Record = {} + override TICK_SPACINGS: Record = {} readonly BASE_FEE = 100 DEFAULT_TICK_SPACING = 1 @@ -116,7 +118,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return undefined }) - let tickSpacings: + let poolsTickSpacing: | ( | number | { @@ -155,7 +157,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { }) as const, ), } - tickSpacings = options?.memoize + poolsTickSpacing = options?.memoize ? await (multicallMemoize(tickSpacingsData) as Promise).catch( (e) => { console.warn( @@ -181,15 +183,15 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { for (let i = 0; i < staticPools.length; i++) { if (globalState === undefined || !globalState[i]) continue const pool = staticPools[i]! - let thisTickSpacing = this.DEFAULT_TICK_SPACING - if (tickSpacings !== undefined && Array.isArray(tickSpacings)) { - if (tickSpacings[i] !== undefined) { - const ts = tickSpacings[i] + let thisPoolTickSpacing = this.DEFAULT_TICK_SPACING + if (poolsTickSpacing !== undefined && Array.isArray(poolsTickSpacing)) { + if (poolsTickSpacing[i] !== undefined) { + const ts = poolsTickSpacing[i] if (typeof ts === 'number') { - thisTickSpacing = ts + thisPoolTickSpacing = ts } else { if (ts?.status === 'success') { - thisTickSpacing = ts.result + thisPoolTickSpacing = ts.result } } } @@ -200,9 +202,9 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { continue const fee = globalState[i]!.result?.[2] // fee if (!fee) continue - const activeTick = Math.floor(tick / thisTickSpacing) * thisTickSpacing + const activeTick = Math.floor(tick / thisPoolTickSpacing) * thisPoolTickSpacing if (typeof activeTick !== 'number') continue - this.TICK_SPACINGS[fee] = this.DEFAULT_TICK_SPACING + this.TICK_SPACINGS[pool.address.toLowerCase()] = thisPoolTickSpacing existingPools.push({ ...pool, fee, @@ -214,6 +216,55 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return existingPools } + override getIndexes(existingPools: V3Pool[]): [number[], number[]] { + const minIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + const maxIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + return [minIndexes, maxIndexes] + } + + override handleTickBoundries( + i: number, + pool: V3Pool, + poolTicks: { + index: number + DLiquidity: bigint + }[], + minIndexes: number[], + maxIndexes: number[], + ) { + const lowerUnknownTick = + minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - + this.TICK_SPACINGS[pool.address.toLowerCase()]! + console.assert( + poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, + 'Error 236: unexpected min tick index', + ) + poolTicks.unshift({ + index: lowerUnknownTick, + DLiquidity: 0n, + }) + const upperUnknownTick = + (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 + console.assert( + poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, + 'Error 244: unexpected max tick index', + ) + poolTicks.push({ + index: upperUnknownTick, + DLiquidity: 0n, + }) + } + override getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) const currencyCombinations: [Token, Token][] = [] diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 905c222775..49fb2c80ba 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -193,6 +193,55 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { return existingPools } + getIndexes(existingPools: V3Pool[]): [number[], number[]] { + const minIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.fee]!, + ), + ) + const maxIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.fee]!, + ), + ) + return [minIndexes, maxIndexes] + } + + handleTickBoundries( + i: number, + pool: V3Pool, + poolTicks: { + index: number + DLiquidity: bigint + }[], + minIndexes: number[], + maxIndexes: number[], + ) { + const lowerUnknownTick = + minIndexes[i]! * this.TICK_SPACINGS[pool.fee]! * 256 - + this.TICK_SPACINGS[pool.fee]! + console.assert( + poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, + 'Error 236: unexpected min tick index', + ) + poolTicks.unshift({ + index: lowerUnknownTick, + DLiquidity: 0n, + }) + const upperUnknownTick = + (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.fee]! * 256 + console.assert( + poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, + 'Error 244: unexpected max tick index', + ) + poolTicks.push({ + index: upperUnknownTick, + DLiquidity: 0n, + }) + } + async fetchPoolsForToken( t0: Token, t1: Token, @@ -317,18 +366,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ? (multicallMemoize(token1ContractsData) as Promise) : this.client.multicall(token1ContractsData) - const minIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.fee]!, - ), - ) - const maxIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.fee]!, - ), - ) + const [minIndexes, maxIndexes] = this.getIndexes(existingPools) const wordList = existingPools.flatMap((pool, i) => { const minIndex = minIndexes[i]! @@ -415,27 +453,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { DLiquidity: tick.liquidityNet, })).sort((a, b) => a.index - b.index) - const lowerUnknownTick = - minIndexes[i]! * this.TICK_SPACINGS[pool.fee]! * 256 - - this.TICK_SPACINGS[pool.fee]! - console.assert( - poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, - 'Error 236: unexpected min tick index', - ) - poolTicks.unshift({ - index: lowerUnknownTick, - DLiquidity: 0n, - }) - const upperUnknownTick = - (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.fee]! * 256 - console.assert( - poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, - 'Error 244: unexpected max tick index', - ) - poolTicks.push({ - index: upperUnknownTick, - DLiquidity: 0n, - }) + this.handleTickBoundries(i, pool, poolTicks, minIndexes, maxIndexes) //console.log(pool.fee, TICK_SPACINGS[pool.fee], pool.activeTick, minIndexes[i], maxIndexes[i], poolTicks) const v3Pool = new UniV3Pool( From 0f62029cda417f2395dde30a26bfc192dca64c6b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 29 Oct 2024 00:59:21 +0000 Subject: [PATCH 094/140] Update AlgebraV1Base.ts --- .../sushi/src/router/liquidity-providers/AlgebraV1Base.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index 2d2b4573c3..7ed1efcb0a 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -202,7 +202,8 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { continue const fee = globalState[i]!.result?.[2] // fee if (!fee) continue - const activeTick = Math.floor(tick / thisPoolTickSpacing) * thisPoolTickSpacing + const activeTick = + Math.floor(tick / thisPoolTickSpacing) * thisPoolTickSpacing if (typeof activeTick !== 'number') continue this.TICK_SPACINGS[pool.address.toLowerCase()] = thisPoolTickSpacing existingPools.push({ @@ -254,7 +255,9 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { DLiquidity: 0n, }) const upperUnknownTick = - (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 + (maxIndexes[i]! + 1) * + this.TICK_SPACINGS[pool.address.toLowerCase()]! * + 256 console.assert( poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, 'Error 244: unexpected max tick index', From 68913aebb46a2d485a77391efcd0014fbdcf35da Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 1 Nov 2024 01:01:57 +0000 Subject: [PATCH 095/140] update --- .../liquidity-providers/AlgebraV1Base.ts | 13 +- .../src/router/liquidity-providers/Camelot.ts | 156 ++++++++++++++---- .../liquidity-providers/UniswapV2Base.ts | 14 +- packages/sushi/src/router/router.ts | 4 + packages/sushi/src/tines/MultiRouter.ts | 8 +- 5 files changed, 155 insertions(+), 40 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index 7ed1efcb0a..bd6958be91 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -180,9 +180,8 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { const existingPools: V3Pool[] = [] - for (let i = 0; i < staticPools.length; i++) { - if (globalState === undefined || !globalState[i]) continue - const pool = staticPools[i]! + staticPools.forEach((pool, i) => { + if (globalState === undefined || !globalState[i]) return let thisPoolTickSpacing = this.DEFAULT_TICK_SPACING if (poolsTickSpacing !== undefined && Array.isArray(poolsTickSpacing)) { if (poolsTickSpacing[i] !== undefined) { @@ -199,12 +198,12 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { const sqrtPriceX96 = globalState[i]!.result?.[0] // price const tick = globalState[i]!.result?.[1] // tick if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') - continue + return const fee = globalState[i]!.result?.[2] // fee - if (!fee) continue + if (!fee) return const activeTick = Math.floor(tick / thisPoolTickSpacing) * thisPoolTickSpacing - if (typeof activeTick !== 'number') continue + if (typeof activeTick !== 'number') return this.TICK_SPACINGS[pool.address.toLowerCase()] = thisPoolTickSpacing existingPools.push({ ...pool, @@ -212,7 +211,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { sqrtPriceX96, activeTick, }) - } + }) return existingPools } diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index 718127beb1..48d99dc102 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -6,6 +6,22 @@ import { type PoolCode } from '../pool-codes/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' +type IsStableSwap = + | ( + | boolean + | { + error?: undefined + result: boolean + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + | undefined + export class CamelotProvider extends UniswapV2BaseProvider { // Camelot has a slightly different getReserves() abi // so needs to be overriden @@ -13,6 +29,7 @@ export class CamelotProvider extends UniswapV2BaseProvider { 'function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint16 _token0FeePercent, uint16 _token1FeePercent)', ]) FEE_DENOMINATOR = 100_000n + FEE_INFO: [bigint, `0x${string}`] | undefined = undefined constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM]: '0x6EcCab422D763aC031210895C81787E87B43A652', @@ -36,7 +53,38 @@ export class CamelotProvider extends UniswapV2BaseProvider { ): Promise { const multicallMemoize = await memoizer.fn(this.client.multicall) - const multicallData = { + if (!this.FEE_INFO) { + try { + this.FEE_INFO = (await this.client.readContract({ + address: this.factory[ + this.chainId as keyof typeof this.factory + ]! as `0x${string}`, + abi: [ + { + constant: true, + inputs: [], + name: 'feeInfo', + outputs: [ + { + internalType: 'uint256', + name: '_ownerFeeShare', + type: 'uint256', + }, + { internalType: 'address', name: '_feeTo', type: 'address' }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'feeInfo', + })) as any + } catch (_error) { + /**/ + } + } + + const getReservesData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, @@ -52,7 +100,7 @@ export class CamelotProvider extends UniswapV2BaseProvider { ), } const reserves = options?.memoize - ? await (multicallMemoize(multicallData) as Promise).catch((e) => { + ? await (multicallMemoize(getReservesData) as Promise).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ e.message @@ -60,7 +108,7 @@ export class CamelotProvider extends UniswapV2BaseProvider { ) return undefined }) - : await this.client.multicall(multicallData).catch((e) => { + : await this.client.multicall(getReservesData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ e.message @@ -69,31 +117,83 @@ export class CamelotProvider extends UniswapV2BaseProvider { return undefined }) - if (reserves !== undefined && Array.isArray(reserves)) { - reserves.forEach( - (reserve: { - result?: [bigint, bigint, number, number] | undefined - status: 'failure' | 'success' - }) => { - if ( - reserve && - reserve.status === 'success' && - reserve.result !== undefined - ) { - if (reserve.result?.[0]) { - reserve.result[0] -= - (reserve.result[0] * BigInt(reserve.result[2])) / - this.FEE_DENOMINATOR - } - if (reserve.result?.[1]) { - reserve.result[1] -= - (reserve.result[1] * BigInt(reserve.result[3])) / - this.FEE_DENOMINATOR - } - } - }, - ) + const stableSwapData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: poolCodesToCreate.map( + (poolCode) => + ({ + address: poolCode.pool.address as Address, + chainId: this.chainId, + abi: [ + { + constant: true, + inputs: [], + name: 'stableSwap', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + payable: false, + }, + ] as const, + functionName: 'stableSwap', + }) as const, + ), } - return reserves + const stableSwap: IsStableSwap = options?.memoize + ? await (multicallMemoize(stableSwapData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(stableSwapData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + return [reserves, stableSwap] + } + + override handleCreatePoolCode( + poolCodesToCreate: PoolCode[], + contractData: [any[], IsStableSwap], + validUntilTimestamp: number, + ) { + const [reserves, stableSwaps] = contractData + poolCodesToCreate.forEach((poolCode, i) => { + const thisStableSwap = stableSwaps?.[i] + const isStableSwap = + typeof thisStableSwap === 'boolean' + ? thisStableSwap + : thisStableSwap?.status === 'success' + ? thisStableSwap?.result + : undefined + const pool = poolCode.pool + const res0 = reserves?.[i]?.result?.[0] + const res1 = reserves?.[i]?.result?.[1] + + if (res0 !== undefined && res1 !== undefined) { + if (isStableSwap && this.FEE_INFO && pool.fee) { + try { + ;(pool.fee as any) += + (Number(this.FEE_INFO[0]) / Number(this.FEE_DENOMINATOR)) * + pool.fee + } catch {} + } + pool.updateReserves(res0, res1) + this.onDemandPools.set(pool.address, { poolCode, validUntilTimestamp }) + } else { + // Pool doesn't exist? + } + }) } } diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index b47af3aa1f..a41c4db9f8 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -264,7 +264,17 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { }) const reserves = await this.getReserves(poolCodesToCreate, options) + this.handleCreatePoolCode(poolCodesToCreate, reserves, validUntilTimestamp) + // console.debug( + // `${this.getLogPrefix()} - ON DEMAND: Created and fetched reserves for ${created} pools, extended 'lifetime' for ${updated} pools` + // ) + } + handleCreatePoolCode( + poolCodesToCreate: PoolCode[], + reserves: any[], + validUntilTimestamp: number, + ) { poolCodesToCreate.forEach((poolCode, i) => { const pool = poolCode.pool const res0 = reserves?.[i]?.result?.[0] @@ -282,10 +292,6 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { // console.error(`${this.getLogPrefix()} - ERROR FETCHING RESERVES, initialize on demand pool: ${pool.address}`) } }) - - // console.debug( - // `${this.getLogPrefix()} - ON DEMAND: Created and fetched reserves for ${created} pools, extended 'lifetime' for ${updated} pools` - // ) } async updatePools() { diff --git a/packages/sushi/src/router/router.ts b/packages/sushi/src/router/router.ts index 4aca2ad35e..3ab93bac32 100644 --- a/packages/sushi/src/router/router.ts +++ b/packages/sushi/src/router/router.ts @@ -154,6 +154,8 @@ export class Router { gasPrice: number, providers?: LiquidityProviders[], // all providers if undefined poolFilter?: PoolFilter, + flows?: number | number[], + pickRoute?: 'single' | 'multi', ): MultiRoute { const networks: NetworkInfo[] = [ { @@ -195,6 +197,8 @@ export class Router { pools, networks, gasPrice, + flows, + pickRoute, ) return { diff --git a/packages/sushi/src/tines/MultiRouter.ts b/packages/sushi/src/tines/MultiRouter.ts index 7e7a756638..f059cd9cd9 100644 --- a/packages/sushi/src/tines/MultiRouter.ts +++ b/packages/sushi/src/tines/MultiRouter.ts @@ -88,6 +88,7 @@ export function findMultiRouteExactIn( baseTokenOrNetworks: RToken | NetworkInfo[], gasPrice?: number, flows?: number | number[], + pickRoute?: 'single' | 'multi', ): MultiRoute { try { pools = deduplicatePools(pools) @@ -112,7 +113,12 @@ export function findMultiRouteExactIn( if (bestFlowNumber === 1) return outSingle const outMulti = g.findBestRouteExactIn(from, to, amountIn, bestFlowNumber) - return getBetterRouteExactIn(outSingle, outMulti) + if (pickRoute) { + if (pickRoute === 'single') return outSingle + else return outMulti + } else { + return getBetterRouteExactIn(outSingle, outMulti) + } } catch (_e) { return NoWayMultiRoute(from, to) } From b572c7b3edad3a93c6bee10a4cf94a5d9518b6ec Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 22 Nov 2024 21:56:20 +0000 Subject: [PATCH 096/140] init --- packages/sushi/src/router/data-fetcher.ts | 2 ++ .../liquidity-providers/GravityFinance.ts | 24 +++++++++++++++++++ .../liquidity-providers/LiquidityProvider.ts | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 packages/sushi/src/router/liquidity-providers/GravityFinance.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 5edf79faf7..138895df2d 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -14,6 +14,7 @@ import { DovishV3Provider } from './liquidity-providers/DovishV3.js' import { DyorV2Provider } from './liquidity-providers/DyorV2.js' import { ElkProvider } from './liquidity-providers/Elk.js' import { EnosysProvider } from './liquidity-providers/Enosys.js' +import { GravityFinanceProvider } from './liquidity-providers/GravityFinance.js' import { HoneySwapProvider } from './liquidity-providers/HoneySwap.js' import { HyperBlastProvider } from './liquidity-providers/HyperBlast.js' import { JetSwapProvider } from './liquidity-providers/JetSwap.js' @@ -166,6 +167,7 @@ export class DataFetcher { DyorV2Provider, ElkProvider, EnosysProvider, + GravityFinanceProvider, HoneySwapProvider, HyperBlastProvider, JetSwapProvider, diff --git a/packages/sushi/src/router/liquidity-providers/GravityFinance.ts b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts new file mode 100644 index 0000000000..eeff769637 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class GravityFinanceProvider extends UniswapV2BaseProvider { + override fee = 0.0025 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.POLYGON]: '0x3ed75AfF4094d2Aaa38FaFCa64EF1C152ec1Cf20', + } as const + const initCodeHash = { + [ChainId.POLYGON]: + '0x59f0dd0ec2453a509915048cac1608e1a52938dbcdf6b4960b21592e7996743a', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.GravityFinance + } + getPoolProviderName(): string { + return 'GravityFinance' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 282b88352a..77c31da08f 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -55,6 +55,7 @@ export enum LiquidityProviders { SparkDexV2 = 'SparkDexV2', SparkDexV3 = 'SparkDexV3', SparkDexV3_1 = 'SparkDexV3_1', + GravityFinance = 'GravityFinance', } export abstract class LiquidityProvider { @@ -165,6 +166,7 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.LynexV1, LiquidityProviders.SparkDexV2, LiquidityProviders.MSwap, + LiquidityProviders.GravityFinance, ] export const UniV3LiquidityProviders: LiquidityProviders[] = [ From 99a5600d7faf240f0d569ef7524bca54cd023dc1 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 10 Jan 2025 21:27:22 +0000 Subject: [PATCH 097/140] init --- .../liquidity-providers/AlgebraV1Base.ts | 77 ++---------- .../liquidity-providers/UniswapV3Base.ts | 114 +++++++++++++----- 2 files changed, 94 insertions(+), 97 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index bd6958be91..4510ca1a64 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -12,12 +12,10 @@ import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' import { - NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, UniswapV3BaseProvider, V3Pool, - bitmapIndex, } from './UniswapV3Base.js' export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { @@ -182,16 +180,14 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { staticPools.forEach((pool, i) => { if (globalState === undefined || !globalState[i]) return - let thisPoolTickSpacing = this.DEFAULT_TICK_SPACING - if (poolsTickSpacing !== undefined && Array.isArray(poolsTickSpacing)) { - if (poolsTickSpacing[i] !== undefined) { - const ts = poolsTickSpacing[i] - if (typeof ts === 'number') { - thisPoolTickSpacing = ts - } else { - if (ts?.status === 'success') { - thisPoolTickSpacing = ts.result - } + let tickSpacing = this.DEFAULT_TICK_SPACING + if (poolsTickSpacing?.[i] !== undefined) { + const ts = poolsTickSpacing[i] + if (typeof ts === 'number') { + tickSpacing = ts + } else { + if (ts?.status === 'success') { + tickSpacing = ts.result } } } @@ -201,72 +197,21 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return const fee = globalState[i]!.result?.[2] // fee if (!fee) return - const activeTick = - Math.floor(tick / thisPoolTickSpacing) * thisPoolTickSpacing + const activeTick = this.getActiveTick(tick, tickSpacing) if (typeof activeTick !== 'number') return - this.TICK_SPACINGS[pool.address.toLowerCase()] = thisPoolTickSpacing existingPools.push({ ...pool, fee, sqrtPriceX96, activeTick, + tickSpacing, + ticks: new Map(), }) }) return existingPools } - override getIndexes(existingPools: V3Pool[]): [number[], number[]] { - const minIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - const maxIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - return [minIndexes, maxIndexes] - } - - override handleTickBoundries( - i: number, - pool: V3Pool, - poolTicks: { - index: number - DLiquidity: bigint - }[], - minIndexes: number[], - maxIndexes: number[], - ) { - const lowerUnknownTick = - minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - - this.TICK_SPACINGS[pool.address.toLowerCase()]! - console.assert( - poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, - 'Error 236: unexpected min tick index', - ) - poolTicks.unshift({ - index: lowerUnknownTick, - DLiquidity: 0n, - }) - const upperUnknownTick = - (maxIndexes[i]! + 1) * - this.TICK_SPACINGS[pool.address.toLowerCase()]! * - 256 - console.assert( - poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, - 'Error 244: unexpected max tick index', - ) - poolTicks.push({ - index: upperUnknownTick, - DLiquidity: 0n, - }) - } - override getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) const currencyCombinations: [Token, Token][] = [] diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 49fb2c80ba..46342c8718 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -4,7 +4,7 @@ import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount, TICK_SPACINGS } from '../../config/index.js' import { Currency, Token, Type } from '../../currency/index.js' import { computeSushiSwapV3PoolAddress } from '../../pool/index.js' -import { RToken, UniV3Pool } from '../../tines/index.js' +import { CLTick, RToken, UniV3Pool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' @@ -36,8 +36,20 @@ export interface V3Pool { fee: UniV3FeeType[keyof UniV3FeeType] sqrtPriceX96: bigint activeTick: number + tickSpacing: number + ticks: Map } +export const tickSpacingAbi = [ + { + inputs: [], + name: 'tickSpacing', + outputs: [{ internalType: 'int24', name: '', type: 'int24' }], + stateMutability: 'view', + type: 'function', + }, +] as const + export const NUMBER_OF_SURROUNDING_TICKS = 1000 // 10% price impact export const bitmapIndex = (tick: number, tickSpacing: number) => { @@ -83,13 +95,9 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } } - getActiveTick = ( - tickCurrent: number, - feeAmount: UniV3FeeType[keyof UniV3FeeType], - ) => - typeof tickCurrent === 'number' && feeAmount - ? Math.floor(tickCurrent / this.TICK_SPACINGS[feeAmount]!) * - this.TICK_SPACINGS[feeAmount]! + getActiveTick = (tickCurrent: number, tickSpacing?: number) => + typeof tickCurrent === 'number' && typeof tickSpacing === 'number' + ? Math.floor(tickCurrent / tickSpacing) * tickSpacing : undefined async fetchPoolData( @@ -173,6 +181,39 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { return undefined }) + const tickSpacingData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: tickSpacingAbi, + functionName: 'tickSpacing', + }) as const, + ), + } + const tickSpacings = options?.memoize + ? await (multicallMemoize(tickSpacingData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(tickSpacingData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + const existingPools: V3Pool[] = [] staticPools.forEach((pool, i) => { @@ -181,12 +222,25 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const tick = slot0[i]!.result?.[1] if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') return - const activeTick = this.getActiveTick(tick, pool.fee) + let tickSpacing = this.TICK_SPACINGS[pool.fee]! + if (typeof tickSpacings?.[i] !== 'undefined') { + const ts = tickSpacings[i] + if (typeof ts === 'number') { + tickSpacing = ts + } else { + if (ts?.status === 'success') { + tickSpacing = ts.result + } + } + } + const activeTick = this.getActiveTick(tick, tickSpacing) if (typeof activeTick !== 'number') return existingPools.push({ ...pool, sqrtPriceX96, activeTick, + tickSpacing, + ticks: new Map(), }) }) @@ -197,31 +251,33 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const minIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.fee]!, + pool.tickSpacing, ), ) const maxIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.fee]!, + pool.tickSpacing, ), ) return [minIndexes, maxIndexes] } - handleTickBoundries( - i: number, - pool: V3Pool, - poolTicks: { - index: number - DLiquidity: bigint - }[], - minIndexes: number[], - maxIndexes: number[], - ) { + handleTickBoundries(tick: number, pool: V3Pool): CLTick[] { + const currentTickIndex = bitmapIndex(tick, pool.tickSpacing) + if (!pool.ticks.has(currentTickIndex)) return [] + let minIndex + let maxIndex + for (minIndex = currentTickIndex; pool.ticks.has(minIndex); --minIndex); + for (maxIndex = currentTickIndex + 1; pool.ticks.has(maxIndex); ++maxIndex); + if (maxIndex - minIndex <= 1) return [] + + let poolTicks: CLTick[] = [] + for (let i = minIndex + 1; i < maxIndex; ++i) + poolTicks = poolTicks.concat(pool.ticks.get(i)!) + const lowerUnknownTick = - minIndexes[i]! * this.TICK_SPACINGS[pool.fee]! * 256 - - this.TICK_SPACINGS[pool.fee]! + (minIndex + 1) * pool.tickSpacing * 256 - pool.tickSpacing console.assert( poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, 'Error 236: unexpected min tick index', @@ -230,8 +286,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { index: lowerUnknownTick, DLiquidity: 0n, }) - const upperUnknownTick = - (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.fee]! * 256 + const upperUnknownTick = maxIndex * pool.tickSpacing * 256 console.assert( poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, 'Error 244: unexpected max tick index', @@ -240,6 +295,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { index: upperUnknownTick, DLiquidity: 0n, }) + + return poolTicks } async fetchPoolsForToken( @@ -448,12 +505,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ) return - const poolTicks = ticks[i]!.map((tick) => ({ - index: tick.tick, - DLiquidity: tick.liquidityNet, - })).sort((a, b) => a.index - b.index) - - this.handleTickBoundries(i, pool, poolTicks, minIndexes, maxIndexes) + const poolTicks = this.handleTickBoundries(pool.activeTick, pool) //console.log(pool.fee, TICK_SPACINGS[pool.fee], pool.activeTick, minIndexes[i], maxIndexes[i], poolTicks) const v3Pool = new UniV3Pool( From 9e24f39fb239e07c43f3b2033b8fcd3c37a46a98 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 10 Jan 2025 23:01:14 +0000 Subject: [PATCH 098/140] update --- .../liquidity-providers/AlgebraV1Base.ts | 64 +---------- .../liquidity-providers/UniswapV3Base.ts | 101 ++++++++++++------ 2 files changed, 72 insertions(+), 93 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index 4510ca1a64..100c37c6e0 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -116,73 +116,15 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return undefined }) - let poolsTickSpacing: - | ( - | number - | { - error?: undefined - result: number - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] - | undefined - - try { - const tickSpacingsData = { - multicallAddress: this.client.chain?.contracts?.multicall3?.address!, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: staticPools.map( - (pool) => - ({ - address: pool.address, - chainId: this.chainId, - abi: [ - { - inputs: [], - name: 'tickSpacing', - outputs: [{ internalType: 'int24', name: '', type: 'int24' }], - stateMutability: 'view', - type: 'function', - }, - ] as const, - functionName: 'tickSpacing', - }) as const, - ), - } - poolsTickSpacing = options?.memoize - ? await (multicallMemoize(tickSpacingsData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, - ) - : await this.client.multicall(tickSpacingsData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - } catch (_error) {} + const tickSpacings = await this.getTickSpacing(staticPools, options) const existingPools: V3Pool[] = [] staticPools.forEach((pool, i) => { if (globalState === undefined || !globalState[i]) return let tickSpacing = this.DEFAULT_TICK_SPACING - if (poolsTickSpacing?.[i] !== undefined) { - const ts = poolsTickSpacing[i] + if (tickSpacings?.[i] !== undefined) { + const ts = tickSpacings[i] if (typeof ts === 'number') { tickSpacing = ts } else { diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 46342c8718..cdc3032990 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -181,38 +181,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { return undefined }) - const tickSpacingData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: staticPools.map( - (pool) => - ({ - address: pool.address as Address, - chainId: this.chainId, - abi: tickSpacingAbi, - functionName: 'tickSpacing', - }) as const, - ), - } - const tickSpacings = options?.memoize - ? await (multicallMemoize(tickSpacingData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(tickSpacingData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const tickSpacings = await this.getTickSpacing(staticPools, options) const existingPools: V3Pool[] = [] @@ -264,6 +233,9 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } handleTickBoundries(tick: number, pool: V3Pool): CLTick[] { + // calculate ticks min/max range + // reason for this is to be able to calculate the ticks range + // independently instead of passing around the min/max range as args const currentTickIndex = bitmapIndex(tick, pool.tickSpacing) if (!pool.ticks.has(currentTickIndex)) return [] let minIndex @@ -486,6 +458,15 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const index = wordList[i]!.index ticks[index] = (ticks[index] || []).concat(t.result || []) }) + existingPools.forEach((pool, i) => { + pool.ticks.set( + i, + ticks[i]!.map((tick) => ({ + index: tick.tick, + DLiquidity: tick.liquidityNet, + })).sort((a, b) => a.index - b.index), + ) + }) const transformedV3Pools: PoolCode[] = [] existingPools.forEach((pool, i) => { @@ -654,4 +635,60 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v || v === 0, ) } + + // fetches pool tickSpacing, this will be used + // instead of hardcoded TICK_SPACINGS values + async getTickSpacing( + staticPools: StaticPoolUniV3[], + options?: DataFetcherOptions, + ): Promise< + | ( + | number + | { + error?: undefined + result: number + status: 'success' + } + | { + error: Error + result?: undefined + status: 'failure' + } + )[] + | undefined + > { + const multicallMemoize = await memoizer.fn(this.client.multicall) + const tickSpacingData = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: tickSpacingAbi, + functionName: 'tickSpacing', + }) as const, + ), + } + return options?.memoize + ? await (multicallMemoize(tickSpacingData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(tickSpacingData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + } } From 845d90282286bca878483823c56a07022fe25a73 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 10 Jan 2025 23:29:28 +0000 Subject: [PATCH 099/140] Update UniswapV3Base.ts --- .../router/liquidity-providers/UniswapV3Base.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index cdc3032990..85d8b80735 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -458,15 +458,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const index = wordList[i]!.index ticks[index] = (ticks[index] || []).concat(t.result || []) }) - existingPools.forEach((pool, i) => { - pool.ticks.set( - i, - ticks[i]!.map((tick) => ({ - index: tick.tick, - DLiquidity: tick.liquidityNet, - })).sort((a, b) => a.index - b.index), - ) - }) const transformedV3Pools: PoolCode[] = [] existingPools.forEach((pool, i) => { @@ -486,6 +477,14 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ) return + pool.ticks.set( + i, + ticks[i]!.map((tick) => ({ + index: tick.tick, + DLiquidity: tick.liquidityNet, + })).sort((a, b) => a.index - b.index), + ) + const poolTicks = this.handleTickBoundries(pool.activeTick, pool) //console.log(pool.fee, TICK_SPACINGS[pool.fee], pool.activeTick, minIndexes[i], maxIndexes[i], poolTicks) From a3860bc51b205bb6ac989a805a42e598480f56c6 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 11 Jan 2025 00:38:47 +0000 Subject: [PATCH 100/140] Update UniswapV3Base.ts --- .../liquidity-providers/UniswapV3Base.ts | 50 ++++--------------- 1 file changed, 11 insertions(+), 39 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 85d8b80735..62976e6626 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -637,32 +637,13 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { // fetches pool tickSpacing, this will be used // instead of hardcoded TICK_SPACINGS values - async getTickSpacing( - staticPools: StaticPoolUniV3[], - options?: DataFetcherOptions, - ): Promise< - | ( - | number - | { - error?: undefined - result: number - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] - | undefined - > { - const multicallMemoize = await memoizer.fn(this.client.multicall) - const tickSpacingData = { + async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { + const calldata = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, allowFailure: true, blockNumber: options?.blockNumber, - contracts: staticPools.map( + contracts: pools.map( (pool) => ({ address: pool.address as Address, @@ -672,22 +653,13 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) as const, ), } - return options?.memoize - ? await (multicallMemoize(tickSpacingData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(tickSpacingData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return await this.client.multicall(calldata).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) } } From fd9ec10e4a8cf1a326fc37f1bfccc6171dc43e99 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 11 Jan 2025 05:13:16 +0000 Subject: [PATCH 101/140] update [skip ci] --- packages/sushi/src/config/viem.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 9fa0d0816b..983e8d8956 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -4,6 +4,7 @@ import { Chain, type PublicClientConfig, Transport, + fallback, } from 'viem' import { arbitrum, @@ -673,7 +674,10 @@ export const publicClientConfig = { }, [ChainId.FANTOM]: { chain: fantom as Chain, - transport: publicTransports[ChainId.FANTOM], + transport: fallback([ + http('https://fantom.drpc.org'), + publicTransports[ChainId.FANTOM], // default that uses ankr rpc is now only available as paid account + ]), }, [ChainId.FUSE]: { chain: fuse as Chain, From a8bc840ad9478202718b7c18e99262d5313832f9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 14 Jan 2025 23:16:12 +0000 Subject: [PATCH 102/140] init --- packages/sushi/src/router/index.ts | 1 + .../liquidity-providers/AlgebraV1Base.ts | 214 ----- .../src/router/liquidity-providers/ApeSwap.ts | 4 +- .../router/liquidity-providers/BaseSwap.ts | 4 +- .../src/router/liquidity-providers/Biswap.ts | 4 +- .../router/liquidity-providers/BlastDEX.ts | 4 +- .../router/liquidity-providers/BlazeSwap.ts | 4 +- .../src/router/liquidity-providers/Camelot.ts | 14 +- .../src/router/liquidity-providers/Dfyn.ts | 4 +- .../router/liquidity-providers/DovishV3.ts | 4 +- .../src/router/liquidity-providers/DyorV2.ts | 4 +- .../src/router/liquidity-providers/Elk.ts | 4 +- .../src/router/liquidity-providers/Enosys.ts | 10 +- .../liquidity-providers/GravityFinance.ts | 4 +- .../router/liquidity-providers/HoneySwap.ts | 4 +- .../router/liquidity-providers/HyperBlast.ts | 4 +- .../src/router/liquidity-providers/JetSwap.ts | 4 +- .../router/liquidity-providers/KinetixV2.ts | 4 +- .../router/liquidity-providers/KinetixV3.ts | 4 +- .../router/liquidity-providers/LaserSwap.ts | 4 +- .../liquidity-providers/LiquidityProvider.ts | 6 +- .../src/router/liquidity-providers/LynexV1.ts | 7 +- .../src/router/liquidity-providers/LynexV2.ts | 2 +- .../src/router/liquidity-providers/MSwap.ts | 4 +- .../router/liquidity-providers/MonoSwapV2.ts | 4 +- .../router/liquidity-providers/MonoSwapV3.ts | 4 +- .../src/router/liquidity-providers/NetSwap.ts | 4 +- .../liquidity-providers/PancakeSwapV2.ts | 4 +- .../liquidity-providers/PancakeSwapV3.ts | 34 +- .../router/liquidity-providers/QuickSwapV2.ts | 4 +- .../router/liquidity-providers/QuickswapV3.ts | 2 +- .../router/liquidity-providers/Solarbeam.ts | 4 +- .../router/liquidity-providers/SparkDexV2.ts | 4 +- .../router/liquidity-providers/SparkDexV3.ts | 4 +- .../liquidity-providers/SparkDexV3_1.ts | 4 +- .../liquidity-providers/SpookySwapV2.ts | 4 +- .../liquidity-providers/SpookySwapV3.ts | 4 +- .../router/liquidity-providers/SushiSwapV2.ts | 4 +- .../router/liquidity-providers/SushiSwapV3.ts | 4 +- .../router/liquidity-providers/SwapBlast.ts | 4 +- .../router/liquidity-providers/ThrusterV2.ts | 6 +- .../router/liquidity-providers/ThrusterV3.ts | 4 +- .../router/liquidity-providers/TraderJoe.ts | 4 +- .../src/router/liquidity-providers/UbeSwap.ts | 4 +- .../router/liquidity-providers/UniswapV2.ts | 4 +- .../liquidity-providers/UniswapV2Base.ts | 11 +- .../router/liquidity-providers/UniswapV3.ts | 4 +- .../liquidity-providers/UniswapV3Base.ts | 128 +-- .../router/liquidity-providers/VVSStandard.ts | 4 +- .../src/router/liquidity-providers/Wagmi.ts | 4 +- .../sushi/src/router/rain/AlgebraV1Base.ts | 414 ++++++++++ .../src/router/rain/RainUniswapV2Base.ts | 171 ++++ .../src/router/rain/RainUniswapV3Base.ts | 755 ++++++++++++++++++ .../src/router/rain/rain-data-fetcher.test.ts | 124 +++ .../src/router/rain/rain-data-fetcher.ts | 221 +++++ 55 files changed, 1860 insertions(+), 412 deletions(-) delete mode 100644 packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts create mode 100644 packages/sushi/src/router/rain/AlgebraV1Base.ts create mode 100644 packages/sushi/src/router/rain/RainUniswapV2Base.ts create mode 100644 packages/sushi/src/router/rain/RainUniswapV3Base.ts create mode 100644 packages/sushi/src/router/rain/rain-data-fetcher.test.ts create mode 100644 packages/sushi/src/router/rain/rain-data-fetcher.ts diff --git a/packages/sushi/src/router/index.ts b/packages/sushi/src/router/index.ts index b932bd8576..17a5063f26 100644 --- a/packages/sushi/src/router/index.ts +++ b/packages/sushi/src/router/index.ts @@ -9,3 +9,4 @@ export * from './tines-to-route-processor-2.js' export * from './tines-to-route-processor-4.js' export * from './PoolBinarySerialization.js' export * from './Sankey.AnyChart.js' +export * from './rain/rain-data-fetcher.js' diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts deleted file mode 100644 index 100c37c6e0..0000000000 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - Address, - Hex, - PublicClient, - encodeAbiParameters, - getAddress, - keccak256, -} from 'viem' -import { ChainId } from '../../chain/index.js' -import { Token } from '../../currency/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' -import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' -import { - PoolFilter, - StaticPoolUniV3, - UniswapV3BaseProvider, - V3Pool, -} from './UniswapV3Base.js' - -export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { - override TICK_SPACINGS: Record = {} - - readonly BASE_FEE = 100 - DEFAULT_TICK_SPACING = 1 - - poolDeployer: Record = {} - - constructor( - chainId: ChainId, - web3Client: PublicClient, - factory: Record, - initCodeHash: Record, - tickLens: Record, - poolDeployer: Record, - isTest = false, - ) { - super(chainId, web3Client, factory, initCodeHash, tickLens, isTest) - this.poolDeployer = poolDeployer - if (!(chainId in this.poolDeployer)) { - throw new Error( - `${this.getType()} cannot be instantiated for chainid ${chainId}, no poolDeployer address`, - ) - } - } - - override async fetchPoolData( - t0: Token, - t1: Token, - excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, - ): Promise { - let staticPools = this.getStaticPools(t0, t1) - if (excludePools) - staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - - const multicallMemoize = await memoizer.fn(this.client.multicall) - - const globalStateData = { - multicallAddress: this.client.chain?.contracts?.multicall3?.address!, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: staticPools.map( - (pool) => - ({ - address: pool.address, - chainId: this.chainId, - abi: [ - { - inputs: [], - name: 'globalState', - outputs: [ - { internalType: 'uint160', name: 'price', type: 'uint160' }, - { internalType: 'int24', name: 'tick', type: 'int24' }, - { internalType: 'uint16', name: 'fee', type: 'uint16' }, - { - internalType: 'uint16', - name: 'timepointIndex', - type: 'uint16', - }, - { - internalType: 'uint8', - name: 'communityFeeToken0', - type: 'uint8', - }, - { - internalType: 'uint8', - name: 'communityFeeToken1', - type: 'uint8', - }, - { internalType: 'bool', name: 'unlocked', type: 'bool' }, - ], - stateMutability: 'view', - type: 'function', - }, - ] as const, - functionName: 'globalState', - }) as const, - ), - } - const globalState = options?.memoize - ? await (multicallMemoize(globalStateData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(globalStateData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - - const tickSpacings = await this.getTickSpacing(staticPools, options) - - const existingPools: V3Pool[] = [] - - staticPools.forEach((pool, i) => { - if (globalState === undefined || !globalState[i]) return - let tickSpacing = this.DEFAULT_TICK_SPACING - if (tickSpacings?.[i] !== undefined) { - const ts = tickSpacings[i] - if (typeof ts === 'number') { - tickSpacing = ts - } else { - if (ts?.status === 'success') { - tickSpacing = ts.result - } - } - } - const sqrtPriceX96 = globalState[i]!.result?.[0] // price - const tick = globalState[i]!.result?.[1] // tick - if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') - return - const fee = globalState[i]!.result?.[2] // fee - if (!fee) return - const activeTick = this.getActiveTick(tick, tickSpacing) - if (typeof activeTick !== 'number') return - existingPools.push({ - ...pool, - fee, - sqrtPriceX96, - activeTick, - tickSpacing, - ticks: new Map(), - }) - }) - - return existingPools - } - - override getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { - const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) - const currencyCombinations: [Token, Token][] = [] - allCombinations.forEach(([currencyA, currencyB]) => { - if (currencyA && currencyB) { - const tokenA = currencyA.wrapped - const tokenB = currencyB.wrapped - if (tokenA.equals(tokenB)) return - currencyCombinations.push( - tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA], - ) - } - }) - return currencyCombinations.map(([currencyA, currencyB]) => ({ - address: getAlgebraPoolAddress( - this.poolDeployer[this.chainId as keyof typeof this.poolDeployer]!, - currencyA.wrapped.address, - currencyB.wrapped.address, - this.initCodeHash[ - this.chainId as keyof typeof this.initCodeHash - ] as `0x${string}`, - ), - token0: currencyA, - token1: currencyB, - fee: this.BASE_FEE, - })) - } - - // algebra doesnt have the fee/ticks setup the same way univ3 has - override async ensureFeeAndTicks(): Promise { - return true - } -} - -// from packages/extractor/src/AlgebraExtractor.ts -export function getAlgebraPoolAddress( - poolDeployer: Address, - tokenA: Address, - tokenB: Address, - initCodeHash: Hex, -): Address { - const constructorArgumentsEncoded = encodeAbiParameters( - [ - { name: 'TokenA', type: 'address' }, - { name: 'TokenB', type: 'address' }, - ], - [tokenA, tokenB], - ) - const create2Inputs = [ - '0xff', - poolDeployer, - keccak256(constructorArgumentsEncoded as Hex), - initCodeHash, - ] - const sanitizedInputs = `0x${create2Inputs.map((i) => i.slice(2)).join('')}` - - return getAddress(`0x${keccak256(sanitizedInputs as Hex).slice(-40)}`) -} diff --git a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts index 71d8d5674f..0f0d4f82ed 100644 --- a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class ApeSwapProvider extends UniswapV2BaseProvider { +export class ApeSwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0xBAe5dc9B19004883d0377419FeF3c2C8832d7d7B', diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts index 3f3ce6591c..46deecc1a5 100644 --- a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class BaseSwapProvider extends UniswapV2BaseProvider { +export class BaseSwapProvider extends RainUniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/Biswap.ts b/packages/sushi/src/router/liquidity-providers/Biswap.ts index 55f89fd348..ab1693c5aa 100644 --- a/packages/sushi/src/router/liquidity-providers/Biswap.ts +++ b/packages/sushi/src/router/liquidity-providers/Biswap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class BiswapProvider extends UniswapV2BaseProvider { +export class BiswapProvider extends RainUniswapV2BaseProvider { override fee = 0.002 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/BlastDEX.ts b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts index b8742e1324..31267e85d3 100644 --- a/packages/sushi/src/router/liquidity-providers/BlastDEX.ts +++ b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class BlastDEXProvider extends UniswapV2BaseProvider { +export class BlastDEXProvider extends RainUniswapV2BaseProvider { override fee = 0.002 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts index 1b2237bcab..ba69dc348f 100644 --- a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class BlazeSwapProvider extends UniswapV2BaseProvider { +export class BlazeSwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x440602f459D7Dd500a74528003e6A20A46d6e2A6', diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index 48d99dc102..3d5d055e89 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -3,8 +3,8 @@ import { ChainId } from '../../chain/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { memoizer } from '../memoizer.js' import { type PoolCode } from '../pool-codes/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' type IsStableSwap = | ( @@ -22,7 +22,7 @@ type IsStableSwap = )[] | undefined -export class CamelotProvider extends UniswapV2BaseProvider { +export class CamelotProvider extends RainUniswapV2BaseProvider { // Camelot has a slightly different getReserves() abi // so needs to be overriden override getReservesAbi = parseAbi([ @@ -48,7 +48,7 @@ export class CamelotProvider extends UniswapV2BaseProvider { } override async getReserves( - poolCodesToCreate: PoolCode[], + poolCodesToCreate: Address[], options?: DataFetcherOptions, ): Promise { const multicallMemoize = await memoizer.fn(this.client.multicall) @@ -90,9 +90,9 @@ export class CamelotProvider extends UniswapV2BaseProvider { allowFailure: true, blockNumber: options?.blockNumber, contracts: poolCodesToCreate.map( - (poolCode) => + (address) => ({ - address: poolCode.pool.address as Address, + address, chainId: this.chainId, abi: this.getReservesAbi, functionName: 'getReserves', @@ -123,9 +123,9 @@ export class CamelotProvider extends UniswapV2BaseProvider { allowFailure: true, blockNumber: options?.blockNumber, contracts: poolCodesToCreate.map( - (poolCode) => + (address) => ({ - address: poolCode.pool.address as Address, + address, chainId: this.chainId, abi: [ { diff --git a/packages/sushi/src/router/liquidity-providers/Dfyn.ts b/packages/sushi/src/router/liquidity-providers/Dfyn.ts index 64cba9ea96..15017f38ba 100644 --- a/packages/sushi/src/router/liquidity-providers/Dfyn.ts +++ b/packages/sushi/src/router/liquidity-providers/Dfyn.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class DfynProvider extends UniswapV2BaseProvider { +export class DfynProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0xE7Fb3e833eFE5F9c441105EB65Ef8b261266423B', diff --git a/packages/sushi/src/router/liquidity-providers/DovishV3.ts b/packages/sushi/src/router/liquidity-providers/DovishV3.ts index 8484d61aeb..e886e3ea2e 100644 --- a/packages/sushi/src/router/liquidity-providers/DovishV3.ts +++ b/packages/sushi/src/router/liquidity-providers/DovishV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class DovishV3Provider extends UniswapV3BaseProvider { +export class DovishV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON_ZKEVM]: '0xdE474Db1Fa59898BC91314328D29507AcD0D593c', diff --git a/packages/sushi/src/router/liquidity-providers/DyorV2.ts b/packages/sushi/src/router/liquidity-providers/DyorV2.ts index e5ef032432..a83e5db88a 100644 --- a/packages/sushi/src/router/liquidity-providers/DyorV2.ts +++ b/packages/sushi/src/router/liquidity-providers/DyorV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class DyorV2Provider extends UniswapV2BaseProvider { +export class DyorV2Provider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/Elk.ts b/packages/sushi/src/router/liquidity-providers/Elk.ts index 9af43c7cbb..a191985d1b 100644 --- a/packages/sushi/src/router/liquidity-providers/Elk.ts +++ b/packages/sushi/src/router/liquidity-providers/Elk.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class ElkProvider extends UniswapV2BaseProvider { +export class ElkProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.AVALANCHE]: '0x091d35d7F63487909C863001ddCA481c6De47091', diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts index b35e10e000..ceea900f62 100644 --- a/packages/sushi/src/router/liquidity-providers/Enosys.ts +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -1,17 +1,17 @@ import { getCreate2Address } from '@ethersproject/address' import { Address, PublicClient, encodePacked, keccak256 } from 'viem' import { ChainId } from '../../chain/index.js' - import { Token } from '../../currency/Token.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' +import { StaticPool } from './UniswapV2Base.js' // Enosys has multiple initCodeHashes, so it is required to override the pool address // calculations methods to use all the available initCodeHashes to generate multiple // pool addresses for a pair and then the wrong ones will be filtered out automatically // on multicall, just the same as any other non existant calculated pool addresses -export class EnosysProvider extends UniswapV2BaseProvider { +export class EnosysProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x28b70f6Ed97429E40FE9a9CD3EB8E86BCBA11dd4', @@ -31,7 +31,7 @@ export class EnosysProvider extends UniswapV2BaseProvider { return 'Enosys' } - // same as _getPoolAddress() in UniswapV2BaseProvider, but instead of + // same as _getPoolAddress() in RainUniswapV2BaseProvider, but instead of // returning only 1 pool address, it returns array of calculated pool // addressses by using all available initCodeHashes _getPoolAddresses(t1: Token, t2: Token): Address[] { @@ -51,7 +51,7 @@ export class EnosysProvider extends UniswapV2BaseProvider { ) } - // same as original getStaticPools() in UniswapV2BaseProvider, but + // same as original getStaticPools() in RainUniswapV2BaseProvider, but // just overriden to do flatMap() to flatten array of pool addresses // per token pair, since there will be multiple calculated pool addresses // per token pair as a result of having multiple initCodeHashes diff --git a/packages/sushi/src/router/liquidity-providers/GravityFinance.ts b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts index eeff769637..6458fb9f21 100644 --- a/packages/sushi/src/router/liquidity-providers/GravityFinance.ts +++ b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class GravityFinanceProvider extends UniswapV2BaseProvider { +export class GravityFinanceProvider extends RainUniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/HoneySwap.ts b/packages/sushi/src/router/liquidity-providers/HoneySwap.ts index 7db919a9b8..a475653bd8 100644 --- a/packages/sushi/src/router/liquidity-providers/HoneySwap.ts +++ b/packages/sushi/src/router/liquidity-providers/HoneySwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class HoneySwapProvider extends UniswapV2BaseProvider { +export class HoneySwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.GNOSIS]: '0xA818b4F111Ccac7AA31D0BCc0806d64F2E0737D7', diff --git a/packages/sushi/src/router/liquidity-providers/HyperBlast.ts b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts index e4460650a0..77dcd86b96 100644 --- a/packages/sushi/src/router/liquidity-providers/HyperBlast.ts +++ b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class HyperBlastProvider extends UniswapV2BaseProvider { +export class HyperBlastProvider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/JetSwap.ts b/packages/sushi/src/router/liquidity-providers/JetSwap.ts index 2ed2fbd0c7..c375bc003e 100644 --- a/packages/sushi/src/router/liquidity-providers/JetSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/JetSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class JetSwapProvider extends UniswapV2BaseProvider { +export class JetSwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0x668ad0ed2622C62E24f0d5ab6B6Ac1b9D2cD4AC7', diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV2.ts b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts index 1cf407d8b2..01abce8f32 100644 --- a/packages/sushi/src/router/liquidity-providers/KinetixV2.ts +++ b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class KinetixV2Provider extends UniswapV2BaseProvider { +export class KinetixV2Provider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV3.ts b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts index b7591e9e68..850d3a968c 100644 --- a/packages/sushi/src/router/liquidity-providers/KinetixV3.ts +++ b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class KinetixV3Provider extends UniswapV3BaseProvider { +export class KinetixV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.KAVA]: '0x2dBB6254231C5569B6A4313c6C1F5Fe1340b35C2', diff --git a/packages/sushi/src/router/liquidity-providers/LaserSwap.ts b/packages/sushi/src/router/liquidity-providers/LaserSwap.ts index a4e52dbc4a..957920587f 100644 --- a/packages/sushi/src/router/liquidity-providers/LaserSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/LaserSwap.ts @@ -1,9 +1,9 @@ import { Address, PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class LaserSwapV2Provider extends UniswapV2BaseProvider { +export class LaserSwapV2Provider extends RainUniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 77c31da08f..23419a36e9 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -1,4 +1,4 @@ -import { PublicClient } from 'viem' +import { Log, PublicClient } from 'viem' import { ChainId, chainShortName } from '../../chain/index.js' import type { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' @@ -130,6 +130,10 @@ export abstract class LiquidityProvider { [t0.address.toLowerCase(), t1.address.toLowerCase()] .sort((first, second) => (first > second ? -1 : 1)) .join(':') + + // methods interface for event log handling + processLog(_log: Log) {} + async afterProcessLog(_untilBlock: bigint) {} } export const UniV2LiquidityProviders: LiquidityProviders[] = [ diff --git a/packages/sushi/src/router/liquidity-providers/LynexV1.ts b/packages/sushi/src/router/liquidity-providers/LynexV1.ts index b9d14e40a3..67bcf43e24 100644 --- a/packages/sushi/src/router/liquidity-providers/LynexV1.ts +++ b/packages/sushi/src/router/liquidity-providers/LynexV1.ts @@ -5,14 +5,15 @@ import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' +import { StaticPool } from './UniswapV2Base.js' const GetFeesAbi = parseAbi([ 'function getFee(bool _stable) public view returns(uint256)', ]) -export class LynexV1Provider extends UniswapV2BaseProvider { +export class LynexV1Provider extends RainUniswapV2BaseProvider { STABLE_FEE = 0.0001 VOLATILE_FEE = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { @@ -115,7 +116,7 @@ export class LynexV1Provider extends UniswapV2BaseProvider { ] } - // same as original getStaticPools() in UniswapV2BaseProvider, but + // same as original getStaticPools() in RainUniswapV2BaseProvider, but // just overriden to do flatMap() to flatten array of pool addresses // per token pair, since LynexV1 also has bool variable in the pool address salt // also has 2 fees if the pair is `stable` or not diff --git a/packages/sushi/src/router/liquidity-providers/LynexV2.ts b/packages/sushi/src/router/liquidity-providers/LynexV2.ts index 50f815cf58..30125f3de5 100644 --- a/packages/sushi/src/router/liquidity-providers/LynexV2.ts +++ b/packages/sushi/src/router/liquidity-providers/LynexV2.ts @@ -1,6 +1,6 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV1BaseProvider } from '../rain/AlgebraV1Base.js' import { LiquidityProviders } from './LiquidityProvider.js' export class LynexV2Provider extends AlgebraV1BaseProvider { diff --git a/packages/sushi/src/router/liquidity-providers/MSwap.ts b/packages/sushi/src/router/liquidity-providers/MSwap.ts index 03b97498d6..aa8d6b01c4 100644 --- a/packages/sushi/src/router/liquidity-providers/MSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/MSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class MSwapProvider extends UniswapV2BaseProvider { +export class MSwapProvider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts index c59c7f9731..8ad0fa4da1 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class MonoswapV2Provider extends UniswapV2BaseProvider { +export class MonoswapV2Provider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts index 6ebf4d9855..a4bc46b2a5 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class MonoswapV3Provider extends UniswapV3BaseProvider { +export class MonoswapV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0x48d0F09710794313f33619c95147F34458BF7C3b', diff --git a/packages/sushi/src/router/liquidity-providers/NetSwap.ts b/packages/sushi/src/router/liquidity-providers/NetSwap.ts index 68132ad64a..51d85408a2 100644 --- a/packages/sushi/src/router/liquidity-providers/NetSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/NetSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class NetSwapProvider extends UniswapV2BaseProvider { +export class NetSwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.METIS]: '0x70f51d68D16e8f9e418441280342BD43AC9Dff9f', diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts index 932153c887..950f2f51f5 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class PancakeSwapV2Provider extends UniswapV2BaseProvider { +export class PancakeSwapV2Provider extends RainUniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index 8fc5620b6e..29f2e7d633 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -1,16 +1,44 @@ -import { Address, PublicClient } from 'viem' +import { Address, PublicClient, parseAbiItem } from 'viem' import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' import { PANCAKESWAP_V3_FEE_SPACING_MAP, PancakeSwapV3FeeAmount, } from '../../config/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class PancakeSwapV3Provider extends UniswapV3BaseProvider { +export const PancakeV3EventsAbi = [ + parseAbiItem( + 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + 'event Collect(address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1)', + ), + parseAbiItem( + 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + // For PancakeV3 + 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint128 protocolFeesToken0, uint128 protocolFeesToken1)', + ), + parseAbiItem( + 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', + ), + parseAbiItem( + 'event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1)', + ), + parseAbiItem( + 'event PoolCreated(address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool)', + ), +] + +export class PancakeSwapV3Provider extends RainUniswapV3BaseProvider { override FEE = PancakeSwapV3FeeAmount override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP + override eventsAbi = + PancakeV3EventsAbi as any as RainUniswapV3BaseProvider['eventsAbi'] + constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM]: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9', diff --git a/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts index 01b23f7ce3..5f180c2c61 100644 --- a/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class QuickSwapV2Provider extends UniswapV2BaseProvider { +export class QuickSwapV2Provider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32', diff --git a/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts b/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts index 76b0a6e225..37515c5b49 100644 --- a/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/QuickswapV3.ts @@ -1,6 +1,6 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV1BaseProvider } from '../rain/AlgebraV1Base.js' import { LiquidityProviders } from './LiquidityProvider.js' export class QuickSwapV3Provider extends AlgebraV1BaseProvider { diff --git a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts index e8c179bf04..2e48b48ec9 100644 --- a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts +++ b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SolarbeamProvider extends UniswapV2BaseProvider { +export class SolarbeamProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.MOONRIVER]: '0x049581aEB6Fe262727f290165C29BDAB065a1B68', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts index 7823c5b031..5822a417bc 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SparkDexV2Provider extends UniswapV2BaseProvider { +export class SparkDexV2Provider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x16b619B04c961E8f4F06C10B42FDAbb328980A89', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts index 3a20fce34e..5412e47794 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class SparkDexV3Provider extends UniswapV3BaseProvider { +export class SparkDexV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0xb3fB4f96175f6f9D716c17744e5A6d4BA9da8176', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts index ff10214707..0382e0f84f 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class SparkDexV3_1Provider extends UniswapV3BaseProvider { +export class SparkDexV3_1Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x8A2578d23d4C532cC9A98FaD91C0523f5efDE652', diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts index 0c94b57638..7ac270e0e3 100644 --- a/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SpookySwapV2Provider extends UniswapV2BaseProvider { +export class SpookySwapV2Provider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FANTOM]: '0x152eE697f2E276fA89E96742e9bB9aB1F2E61bE3', diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts index 69d1f34c0e..6f498334cd 100644 --- a/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class SpookySwapV3Provider extends UniswapV3BaseProvider { +export class SpookySwapV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FANTOM]: '0x7928a2c48754501f3a8064765ECaE541daE5c3E6', diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts index deb99dc463..73affe3eec 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts @@ -4,10 +4,10 @@ import { SUSHISWAP_V2_FACTORY_ADDRESS, SUSHISWAP_V2_INIT_CODE_HASH, } from '../../config/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SushiSwapV2Provider extends UniswapV2BaseProvider { +export class SushiSwapV2Provider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = SUSHISWAP_V2_FACTORY_ADDRESS super(chainId, web3Client, factory, SUSHISWAP_V2_INIT_CODE_HASH) diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts index 7139b54a70..816d45eb0a 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class SushiSwapV3Provider extends UniswapV3BaseProvider { +export class SushiSwapV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM_NOVA]: '0xaa26771d497814E81D305c511Efbb3ceD90BF5bd', diff --git a/packages/sushi/src/router/liquidity-providers/SwapBlast.ts b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts index 4f04bd000b..8500485199 100644 --- a/packages/sushi/src/router/liquidity-providers/SwapBlast.ts +++ b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class SwapBlastProvider extends UniswapV2BaseProvider { +export class SwapBlastProvider extends RainUniswapV2BaseProvider { override fee = 0.001 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts index b1cfad438b..994aeddb3d 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class ThrusterV2_3Provider extends UniswapV2BaseProvider { +export class ThrusterV2_3Provider extends RainUniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { @@ -23,7 +23,7 @@ export class ThrusterV2_3Provider extends UniswapV2BaseProvider { } } -export class ThrusterV2_1Provider extends UniswapV2BaseProvider { +export class ThrusterV2_1Provider extends RainUniswapV2BaseProvider { override fee = 0.01 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts index d8c7447385..6b321ebc0e 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -2,10 +2,10 @@ import { Address, PublicClient } from 'viem' import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class ThrusterV3Provider extends UniswapV3BaseProvider { +export class ThrusterV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0xa08ae3d3f4dA51C22d3c041E468bdF4C61405AaB', diff --git a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts index 968e5c9b0a..a8c67c5e5f 100644 --- a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts +++ b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class TraderJoeProvider extends UniswapV2BaseProvider { +export class TraderJoeProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.AVALANCHE]: '0x9Ad6C38BE94206cA50bb0d90783181662f0Cfa10', diff --git a/packages/sushi/src/router/liquidity-providers/UbeSwap.ts b/packages/sushi/src/router/liquidity-providers/UbeSwap.ts index 288b1882a1..0d471a7a4f 100644 --- a/packages/sushi/src/router/liquidity-providers/UbeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/UbeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class UbeSwapProvider extends UniswapV2BaseProvider { +export class UbeSwapProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.CELO]: '0x62d5b84bE28a183aBB507E125B384122D2C25fAE', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts index 782cef3a46..e0380979da 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class UniswapV2Provider extends UniswapV2BaseProvider { +export class UniswapV2Provider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index a41c4db9f8..5345febcd2 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -160,7 +160,7 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } async getReserves( - poolCodesToCreate: PoolCode[], + poolCodesToCreate: Address[], options?: DataFetcherOptions, ): Promise { const multicallMemoize = await memoizer.fn(this.client.multicall) @@ -171,9 +171,9 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { allowFailure: true, blockNumber: options?.blockNumber, contracts: poolCodesToCreate.map( - (poolCode) => + (address) => ({ - address: poolCode.pool.address as Address, + address, chainId: this.chainId, abi: this.getReservesAbi, functionName: 'getReserves', @@ -263,7 +263,10 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } }) - const reserves = await this.getReserves(poolCodesToCreate, options) + const reserves = await this.getReserves( + poolCodesToCreate.map((v) => v.pool.address), + options, + ) this.handleCreatePoolCode(poolCodesToCreate, reserves, validUntilTimestamp) // console.debug( // `${this.getLogPrefix()} - ON DEMAND: Created and fetched reserves for ${created} pools, extended 'lifetime' for ${updated} pools` diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3.ts index 1fb4f36665..56b21f3de6 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' -export class UniswapV3Provider extends UniswapV3BaseProvider { +export class UniswapV3Provider extends RainUniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0x1F98431c8aD98523631AE4a59f267346ea31F984', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 62976e6626..d072c3fa10 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -4,7 +4,7 @@ import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount, TICK_SPACINGS } from '../../config/index.js' import { Currency, Token, Type } from '../../currency/index.js' import { computeSushiSwapV3PoolAddress } from '../../pool/index.js' -import { CLTick, RToken, UniV3Pool } from '../../tines/index.js' +import { RToken, UniV3Pool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { memoizer } from '../memoizer.js' @@ -36,20 +36,8 @@ export interface V3Pool { fee: UniV3FeeType[keyof UniV3FeeType] sqrtPriceX96: bigint activeTick: number - tickSpacing: number - ticks: Map } -export const tickSpacingAbi = [ - { - inputs: [], - name: 'tickSpacing', - outputs: [{ internalType: 'int24', name: '', type: 'int24' }], - stateMutability: 'view', - type: 'function', - }, -] as const - export const NUMBER_OF_SURROUNDING_TICKS = 1000 // 10% price impact export const bitmapIndex = (tick: number, tickSpacing: number) => { @@ -62,7 +50,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { TICK_SPACINGS: UniV3TickSpacingType = TICK_SPACINGS FEE: UniV3FeeType = SushiSwapV3FeeAmount poolsByTrade: Map = new Map() - pools: Map = new Map() + poolsCodes: Map = new Map() blockListener?: (() => void) | undefined unwatchBlockNumber?: () => void @@ -95,9 +83,13 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } } - getActiveTick = (tickCurrent: number, tickSpacing?: number) => - typeof tickCurrent === 'number' && typeof tickSpacing === 'number' - ? Math.floor(tickCurrent / tickSpacing) * tickSpacing + getActiveTick = ( + tickCurrent: number, + feeAmount: UniV3FeeType[keyof UniV3FeeType], + ) => + typeof tickCurrent === 'number' && feeAmount + ? Math.floor(tickCurrent / this.TICK_SPACINGS[feeAmount]!) * + this.TICK_SPACINGS[feeAmount]! : undefined async fetchPoolData( @@ -181,8 +173,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { return undefined }) - const tickSpacings = await this.getTickSpacing(staticPools, options) - const existingPools: V3Pool[] = [] staticPools.forEach((pool, i) => { @@ -191,25 +181,12 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const tick = slot0[i]!.result?.[1] if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') return - let tickSpacing = this.TICK_SPACINGS[pool.fee]! - if (typeof tickSpacings?.[i] !== 'undefined') { - const ts = tickSpacings[i] - if (typeof ts === 'number') { - tickSpacing = ts - } else { - if (ts?.status === 'success') { - tickSpacing = ts.result - } - } - } - const activeTick = this.getActiveTick(tick, tickSpacing) + const activeTick = this.getActiveTick(tick, pool.fee) if (typeof activeTick !== 'number') return existingPools.push({ ...pool, sqrtPriceX96, activeTick, - tickSpacing, - ticks: new Map(), }) }) @@ -220,36 +197,31 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { const minIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - pool.tickSpacing, + this.TICK_SPACINGS[pool.fee]!, ), ) const maxIndexes = existingPools.map((pool) => bitmapIndex( pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - pool.tickSpacing, + this.TICK_SPACINGS[pool.fee]!, ), ) return [minIndexes, maxIndexes] } - handleTickBoundries(tick: number, pool: V3Pool): CLTick[] { - // calculate ticks min/max range - // reason for this is to be able to calculate the ticks range - // independently instead of passing around the min/max range as args - const currentTickIndex = bitmapIndex(tick, pool.tickSpacing) - if (!pool.ticks.has(currentTickIndex)) return [] - let minIndex - let maxIndex - for (minIndex = currentTickIndex; pool.ticks.has(minIndex); --minIndex); - for (maxIndex = currentTickIndex + 1; pool.ticks.has(maxIndex); ++maxIndex); - if (maxIndex - minIndex <= 1) return [] - - let poolTicks: CLTick[] = [] - for (let i = minIndex + 1; i < maxIndex; ++i) - poolTicks = poolTicks.concat(pool.ticks.get(i)!) - + handleTickBoundries( + i: number, + pool: V3Pool, + poolTicks: { + index: number + DLiquidity: bigint + }[], + minIndexes: number[], + maxIndexes: number[], + ) { const lowerUnknownTick = - (minIndex + 1) * pool.tickSpacing * 256 - pool.tickSpacing + minIndexes[i]! * this.TICK_SPACINGS[pool.fee]! * 256 - + this.TICK_SPACINGS[pool.fee]! console.assert( poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, 'Error 236: unexpected min tick index', @@ -258,7 +230,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { index: lowerUnknownTick, DLiquidity: 0n, }) - const upperUnknownTick = maxIndex * pool.tickSpacing * 256 + const upperUnknownTick = + (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.fee]! * 256 console.assert( poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, 'Error 244: unexpected max tick index', @@ -267,8 +240,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { index: upperUnknownTick, DLiquidity: 0n, }) - - return poolTicks } async fetchPoolsForToken( @@ -477,15 +448,12 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ) return - pool.ticks.set( - i, - ticks[i]!.map((tick) => ({ - index: tick.tick, - DLiquidity: tick.liquidityNet, - })).sort((a, b) => a.index - b.index), - ) + const poolTicks = ticks[i]!.map((tick) => ({ + index: tick.tick, + DLiquidity: tick.liquidityNet, + })).sort((a, b) => a.index - b.index) - const poolTicks = this.handleTickBoundries(pool.activeTick, pool) + this.handleTickBoundries(i, pool, poolTicks, minIndexes, maxIndexes) //console.log(pool.fee, TICK_SPACINGS[pool.fee], pool.activeTick, minIndexes[i], maxIndexes[i], poolTicks) const v3Pool = new UniV3Pool( @@ -507,7 +475,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { this.getPoolProviderName(), ) transformedV3Pools.push(pc) - this.pools.set(pool.address.toLowerCase(), pc) + this.poolsCodes.set(pool.address.toLowerCase(), pc) }) this.poolsByTrade.set( @@ -588,7 +556,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { // }) } - getCurrentPoolList(): PoolCode[] { + getCurrentPoolList(_t0: Token, _t1: Token): PoolCode[] { // const tradeId = this.getTradeId(t0, t1) // const poolsByTrade = this.poolsByTrade.get(tradeId) ?? [] // return poolsByTrade @@ -596,7 +564,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { // .filter(([poolAddress]) => poolsByTrade.includes(poolAddress)) // .map(([, p]) => p) // : [] - return Array.from(this.pools.values()) + return Array.from(this.poolsCodes.values()) } stopFetchPoolsData() { @@ -634,32 +602,4 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v || v === 0, ) } - - // fetches pool tickSpacing, this will be used - // instead of hardcoded TICK_SPACINGS values - async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { - const calldata = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: pools.map( - (pool) => - ({ - address: pool.address as Address, - chainId: this.chainId, - abi: tickSpacingAbi, - functionName: 'tickSpacing', - }) as const, - ), - } - return await this.client.multicall(calldata).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - } } diff --git a/packages/sushi/src/router/liquidity-providers/VVSStandard.ts b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts index a25d5eb3f3..02baf0b65e 100644 --- a/packages/sushi/src/router/liquidity-providers/VVSStandard.ts +++ b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' -export class VVSStandardProvider extends UniswapV2BaseProvider { +export class VVSStandardProvider extends RainUniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.CRONOS]: '0x3B44B2a187a7b3824131F8db5a74194D0a42Fc15', diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts index 4c6b5f846c..80bbbb30b4 100644 --- a/packages/sushi/src/router/liquidity-providers/Wagmi.ts +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' enum WagmiFeeAmount { /** 0.01% */ @@ -21,7 +21,7 @@ const WagmiTickSpacing: Record = { [WagmiFeeAmount.HIGH]: 200, } -export class WagmiProvider extends UniswapV3BaseProvider { +export class WagmiProvider extends RainUniswapV3BaseProvider { override FEE = WagmiFeeAmount override TICK_SPACINGS = WagmiTickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { diff --git a/packages/sushi/src/router/rain/AlgebraV1Base.ts b/packages/sushi/src/router/rain/AlgebraV1Base.ts new file mode 100644 index 0000000000..bcd694ab65 --- /dev/null +++ b/packages/sushi/src/router/rain/AlgebraV1Base.ts @@ -0,0 +1,414 @@ +import { + Address, + Hex, + Log, + PublicClient, + encodeAbiParameters, + getAddress, + keccak256, + parseAbiItem, + parseEventLogs, +} from 'viem' +import { ChainId } from '../../chain/index.js' +import { Token } from '../../currency/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { + PoolFilter, + StaticPoolUniV3, +} from '../liquidity-providers/UniswapV3Base.js' +import { memoizer } from '../memoizer.js' +import { RainUniswapV3BaseProvider, RainV3Pool } from './RainUniswapV3Base.js' + +export const AlgebraEventsAbi = [ + parseAbiItem( + 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + 'event Collect(address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1)', + ), + parseAbiItem( + 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)', + ), + parseAbiItem( + 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', + ), + parseAbiItem('event Fee(uint16 fee)'), + parseAbiItem('event TickSpacing(int24 newTickSpacing)'), + // for algebra factory, new pool created + parseAbiItem( + 'event Pool(address indexed token0, address indexed token1, address pool)', + ), +] + +export abstract class AlgebraV1BaseProvider extends RainUniswapV3BaseProvider { + override TICK_SPACINGS: Record = {} + override eventsAbi = AlgebraEventsAbi as any + + readonly BASE_FEE = 100 + DEFAULT_TICK_SPACING = 1 + + poolDeployer: Record = {} + + constructor( + chainId: ChainId, + web3Client: PublicClient, + factory: Record, + initCodeHash: Record, + tickLens: Record, + poolDeployer: Record, + isTest = false, + ) { + super(chainId, web3Client, factory, initCodeHash, tickLens, isTest) + this.poolDeployer = poolDeployer + if (!(chainId in this.poolDeployer)) { + throw new Error( + `${this.getType()} cannot be instantiated for chainid ${chainId}, no poolDeployer address`, + ) + } + } + + override async fetchPoolData( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + let staticPools = this.getStaticPools(t0, t1) + if (excludePools) + staticPools = staticPools.filter((p) => !excludePools.has(p.address)) + + const tradeId = this.getTradeId(t0, t1) + if (!this.poolsByTrade.has(tradeId)) + this.poolsByTrade.set( + tradeId, + staticPools.map((pool) => pool.address.toLowerCase()), + ) + + const multicallMemoize = await memoizer.fn(this.client.multicall) + + const globalStateData = { + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: [ + { + inputs: [], + name: 'globalState', + outputs: [ + { internalType: 'uint160', name: 'price', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'fee', type: 'uint16' }, + { + internalType: 'uint16', + name: 'timepointIndex', + type: 'uint16', + }, + { + internalType: 'uint8', + name: 'communityFeeToken0', + type: 'uint8', + }, + { + internalType: 'uint8', + name: 'communityFeeToken1', + type: 'uint8', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'globalState', + }) as const, + ), + } + const globalState = options?.memoize + ? await (multicallMemoize(globalStateData) as Promise).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + : await this.client.multicall(globalStateData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const tickSpacings = await this.getTickSpacing(staticPools, options) + + const existingPools: RainV3Pool[] = [] + + staticPools.forEach((pool, i) => { + const poolAddress = pool.address.toLowerCase() + if (this.pools.has(poolAddress)) return + if (this.nonExistentPools.get(poolAddress) ?? 0 > 1) return + if (globalState === undefined || !globalState[i]) { + this.handleNonExistentPool(poolAddress) + return + } + let tickSpacing = this.DEFAULT_TICK_SPACING + if (tickSpacings?.[i] !== undefined) { + const ts = tickSpacings[i] + if (typeof ts === 'number') { + tickSpacing = ts + } else { + if (ts?.status === 'success') { + tickSpacing = ts.result + } + } + } + const sqrtPriceX96 = globalState[i]!.result?.[0] // price + const tick = globalState[i]!.result?.[1] // tick + if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') { + this.handleNonExistentPool(poolAddress) + return + } + const fee = globalState[i]!.result?.[2] // fee + if (!fee) { + this.handleNonExistentPool(poolAddress) + return + } + const activeTick = this.getActiveTick(tick, tickSpacing) + if (typeof activeTick !== 'number') { + this.handleNonExistentPool(poolAddress) + return + } + existingPools.push({ + ...pool, + fee, + sqrtPriceX96, + activeTick, + tickSpacing, + ticks: new Map(), + reserve0: 0n, + reserve1: 0n, + liquidity: 0n, + blockNumber: options?.blockNumber ?? 0n, + }) + }) + + return existingPools + } + + override getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { + const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) + const currencyCombinations: [Token, Token][] = [] + allCombinations.forEach(([currencyA, currencyB]) => { + if (currencyA && currencyB) { + const tokenA = currencyA.wrapped + const tokenB = currencyB.wrapped + if (tokenA.equals(tokenB)) return + currencyCombinations.push( + tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA], + ) + } + }) + return currencyCombinations.map(([currencyA, currencyB]) => ({ + address: getAlgebraPoolAddress( + this.poolDeployer[this.chainId as keyof typeof this.poolDeployer]!, + currencyA.wrapped.address, + currencyB.wrapped.address, + this.initCodeHash[ + this.chainId as keyof typeof this.initCodeHash + ] as `0x${string}`, + ), + token0: currencyA, + token1: currencyB, + fee: this.BASE_FEE, + })) + } + + // algebra doesnt have the fee/ticks setup the same way univ3 has + override async ensureFeeAndTicks(): Promise { + return true + } + + override processLog(log: Log) { + const factory = + this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() + const logAddress = log.address.toLowerCase() + if (logAddress === factory) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi as typeof AlgebraEventsAbi, + eventName: 'Pool', + })[0]! + this.nonExistentPools.delete(event.args.pool.toLowerCase()) + } catch {} + } else { + const pool = this.pools.get(logAddress) as RainV3Pool | undefined + if (pool) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi as typeof AlgebraEventsAbi, + })[0]! + switch (event.eventName) { + case 'Mint': { + const { amount, amount0, amount1 } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity += amount + } + if (amount1 !== undefined && amount0 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount + ) { + this.addTick(tickLower, amount, pool) + this.addTick(tickUpper, -amount, pool) + } + } + break + } + case 'Burn': { + const { amount } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity -= amount + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount + ) { + this.addTick(tickLower, -amount, pool) + this.addTick(tickUpper, amount, pool) + } + } + break + } + case 'Collect': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1 } = event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 -= amount0 + pool.reserve1 -= amount1 + } + } + break + } + case 'Flash': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { paid0, paid1 } = event.args + if (paid0 !== undefined && paid1 !== undefined) { + pool.reserve0 += paid0 + pool.reserve1 += paid1 + } + } + break + } + case 'Swap': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1, sqrtPriceX96, liquidity, tick } = + event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if (sqrtPriceX96 !== undefined) pool.sqrtPriceX96 = sqrtPriceX96 + if (liquidity !== undefined) pool.liquidity = liquidity + if (tick !== undefined) { + pool.activeTick = + Math.floor(tick / pool.tickSpacing) * pool.tickSpacing + const newTicks = this.onPoolTickChange(pool.activeTick, pool) + const queue = this.newTicksQueue.find( + (v) => v[0].address === pool.address, + ) + if (queue) { + for (const tick of newTicks) { + if (!queue[1].includes(tick)) queue[1].push(tick) + } + } else { + this.newTicksQueue.push([pool, newTicks]) + } + } + } + break + } + case 'Fee': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + pool.fee = event.args.fee + } + break + } + case 'TickSpacing': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + pool.tickSpacing = event.args.newTickSpacing + } + break + } + default: + } + } catch {} + } + } + } +} + +// from packages/extractor/src/AlgebraExtractor.ts +export function getAlgebraPoolAddress( + poolDeployer: Address, + tokenA: Address, + tokenB: Address, + initCodeHash: Hex, +): Address { + const constructorArgumentsEncoded = encodeAbiParameters( + [ + { name: 'TokenA', type: 'address' }, + { name: 'TokenB', type: 'address' }, + ], + [tokenA, tokenB], + ) + const create2Inputs = [ + '0xff', + poolDeployer, + keccak256(constructorArgumentsEncoded as Hex), + initCodeHash, + ] + const sanitizedInputs = `0x${create2Inputs.map((i) => i.slice(2)).join('')}` + + return getAddress(`0x${keccak256(sanitizedInputs as Hex).slice(-40)}`) +} diff --git a/packages/sushi/src/router/rain/RainUniswapV2Base.ts b/packages/sushi/src/router/rain/RainUniswapV2Base.ts new file mode 100644 index 0000000000..029195737f --- /dev/null +++ b/packages/sushi/src/router/rain/RainUniswapV2Base.ts @@ -0,0 +1,171 @@ +import { Log, parseAbiItem, parseEventLogs } from 'viem' +import { Token } from '../../currency/index.js' +import { ConstantProductRPool, RToken } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { filterOnDemandPools } from '../lib/api.js' +import { + StaticPool, + UniswapV2BaseProvider, +} from '../liquidity-providers/UniswapV2Base.js' +import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' + +// extends v2 static pool +export interface RainV2Pool extends StaticPool { + reserve0: bigint + reserve1: bigint + blockNumber: bigint +} + +export const UniV2EventsAbi = [ + parseAbiItem('event Sync(uint112 reserve0, uint112 reserve1)'), + parseAbiItem( + 'event PairCreated(address indexed token0, address indexed token1, address pair, uint)', + ), +] + +export abstract class RainUniswapV2BaseProvider extends UniswapV2BaseProvider { + nonExistentPools: Map = new Map() + pools: Map = new Map() + eventsAbi = UniV2EventsAbi + + override async getOnDemandPools( + t0: Token, + t1: Token, + excludePools?: Set, + options?: DataFetcherOptions, + ): Promise { + const topPoolAddresses = Array.from(this.topPools.keys()) + let pools = + topPoolAddresses.length > 0 + ? filterOnDemandPools( + Array.from(this.availablePools.values()), + t0.address, + t1.address, + topPoolAddresses, + this.ON_DEMAND_POOL_SIZE, + ) + : this.getStaticPools(t0, t1) + if (excludePools) + pools = (pools as RainV2Pool[]).filter( + (p) => !excludePools.has(p.address), + ) + + if (pools.length === 0) { + return + } + + this.poolsByTrade.set( + this.getTradeId(t0, t1), + pools.map((pool) => pool.address.toLowerCase() as `0x${string}`), + ) + const poolCodesToCreate: RainV2Pool[] = [] + pools.forEach((pool) => { + const existingPool = this.pools.get(pool.address.toLowerCase()) + const nonExistentPool = this.nonExistentPools.get( + pool.address.toLowerCase(), + ) + if ( + existingPool === undefined && + (!nonExistentPool || nonExistentPool < 2) + ) { + poolCodesToCreate.push({ + ...pool, + blockNumber: options?.blockNumber ?? 0n, + } as RainV2Pool) + } + }) + + const reserves = await this.getReserves( + poolCodesToCreate.map((v) => v.address), + options, + ) + this.setPool(poolCodesToCreate, reserves) + } + + override getCurrentPoolList(t0: Token, t1: Token): PoolCode[] { + const tradeId = this.getTradeId(t0, t1) + const poolsByTrade = this.poolsByTrade.get(tradeId) ?? [] + const onDemandPoolCodes = poolsByTrade + ? Array.from(this.pools) + .filter(([poolAddress]) => + poolsByTrade.includes(poolAddress as `0x${string}`), + ) + .map(([, pool]) => { + const rPool = new ConstantProductRPool( + pool.address, + pool.token0 as RToken, + pool.token1 as RToken, + 'fee' in pool ? pool.fee : this.fee, + pool.reserve0, + pool.reserve1, + ) + return new ConstantProductPoolCode( + rPool, + this.getType(), + this.getPoolProviderName(), + ) + }) + : [] + + return [...this.topPools.values(), onDemandPoolCodes].flat() + } + + override processLog(log: Log) { + const factory = + this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() + const logAddress = log.address.toLowerCase() + if (logAddress === factory) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi, + eventName: 'PairCreated', + })[0]! + this.nonExistentPools.delete(event.args[2].toLowerCase()) + } catch {} + } else { + const pool = this.pools.get(logAddress as `0x${string}`) + if (pool) { + if (log.blockNumber! >= pool.blockNumber) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi, + eventName: 'Sync', + })[0]! + pool.blockNumber = log.blockNumber! + pool.reserve0 = event.args.reserve0 + pool.reserve1 = event.args.reserve1 + } catch {} + } + } + } + } + + setPool(poolCodesToCreate: RainV2Pool[], reserves: any[]) { + poolCodesToCreate.forEach((pool, i) => { + const res0 = reserves?.[i]?.result?.[0] + const res1 = reserves?.[i]?.result?.[1] + + if (res0 !== undefined && res1 !== undefined) { + this.pools.set(pool.address.toLowerCase(), { + ...pool, + reserve0: res0, + reserve1: res1, + }) + } else { + const nonExistentPool = this.nonExistentPools.get( + pool.address.toLowerCase(), + ) + if (nonExistentPool) { + this.nonExistentPools.set( + pool.address.toLowerCase(), + nonExistentPool + 1, + ) + } else { + this.nonExistentPools.set(pool.address.toLowerCase(), 1) + } + } + }) + } +} diff --git a/packages/sushi/src/router/rain/RainUniswapV3Base.ts b/packages/sushi/src/router/rain/RainUniswapV3Base.ts new file mode 100644 index 0000000000..0df3f57948 --- /dev/null +++ b/packages/sushi/src/router/rain/RainUniswapV3Base.ts @@ -0,0 +1,755 @@ +import { Address, Log, parseAbiItem, parseEventLogs } from 'viem' +import { erc20Abi, tickLensAbi } from '../../abi/index.js' +import { Token } from '../../currency/index.js' +import { CLTick, RToken, UniV3Pool } from '../../tines/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { + NUMBER_OF_SURROUNDING_TICKS, + PoolFilter, + StaticPoolUniV3, + UniswapV3BaseProvider, + V3Pool, + bitmapIndex, +} from '../liquidity-providers/UniswapV3Base.js' +import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' + +// extends V3Pool from UniswapV3Base +export interface RainV3Pool extends V3Pool { + tickSpacing: number + ticks: Map + reserve0: bigint + reserve1: bigint + liquidity: bigint + blockNumber: bigint +} + +export const tickSpacingAbi = [ + { + inputs: [], + name: 'tickSpacing', + outputs: [{ internalType: 'int24', name: '', type: 'int24' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +export const UniV3EventsAbi = [ + parseAbiItem( + 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + 'event Collect(address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1)', + ), + parseAbiItem( + 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', + ), + parseAbiItem( + 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)', + ), + parseAbiItem( + 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', + ), + parseAbiItem( + 'event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1)', + ), + parseAbiItem( + 'event PoolCreated(address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool)', + ), +] + +export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { + pools: Map = new Map() + nonExistentPools: Map = new Map() + eventsAbi = UniV3EventsAbi + newTicksQueue: [RainV3Pool, number[]][] = [] + + override getActiveTick = (tickCurrent: number, tickSpacing?: number) => + typeof tickCurrent === 'number' && typeof tickSpacing === 'number' + ? Math.floor(tickCurrent / tickSpacing) * tickSpacing + : undefined + + override async fetchPoolData( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + let staticPools = this.getStaticPools(t0, t1) + if (excludePools) + staticPools = staticPools.filter((p) => !excludePools.has(p.address)) + + const tradeId = this.getTradeId(t0, t1) + if (!this.poolsByTrade.has(tradeId)) + this.poolsByTrade.set( + tradeId, + staticPools.map((pool) => pool.address.toLowerCase()), + ) + + const slot0 = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: [ + { + inputs: [], + name: 'slot0', + outputs: [ + { + internalType: 'uint160', + name: 'sqrtPriceX96', + type: 'uint160', + }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { + internalType: 'uint16', + name: 'observationIndex', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinality', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinalityNext', + type: 'uint16', + }, + { + internalType: 'uint8', + name: 'feeProtocol', + type: 'uint8', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'slot0', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const tickSpacings = await this.getTickSpacing(staticPools, options) + + const existingPools: RainV3Pool[] = [] + + staticPools.forEach((pool, i) => { + const poolAddress = pool.address.toLowerCase() + if (this.pools.has(poolAddress)) return + if (this.nonExistentPools.get(poolAddress) ?? 0 > 1) return + if (slot0 === undefined || !slot0[i]) { + this.handleNonExistentPool(poolAddress) + return + } + const sqrtPriceX96 = slot0[i]!.result?.[0] + const tick = slot0[i]!.result?.[1] + if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') { + this.handleNonExistentPool(poolAddress) + return + } + let tickSpacing = this.TICK_SPACINGS[pool.fee]! + if (typeof tickSpacings?.[i] !== 'undefined') { + const ts = tickSpacings[i] + if (typeof ts === 'number') { + tickSpacing = ts + } else { + if (ts?.status === 'success') { + tickSpacing = ts.result + } + } + } + const activeTick = this.getActiveTick(tick, tickSpacing) + if (typeof activeTick !== 'number') { + this.handleNonExistentPool(poolAddress) + return + } + existingPools.push({ + ...pool, + sqrtPriceX96, + activeTick, + tickSpacing, + ticks: new Map(), + reserve0: 0n, + reserve1: 0n, + liquidity: 0n, + blockNumber: options?.blockNumber ?? 0n, + }) + }) + + return existingPools + } + + override getIndexes(existingPools: RainV3Pool[]): [number[], number[]] { + const minIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, + pool.tickSpacing, + ), + ) + const maxIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, + pool.tickSpacing, + ), + ) + return [minIndexes, maxIndexes] + } + + override async fetchPoolsForToken( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + const existingPools = await this.fetchPoolData( + t0, + t1, + excludePools, + options, + ) + if (existingPools.length === 0) return + + const [liquidity, reserves, ticks] = await Promise.all([ + this.getLiquidity(existingPools, options), + this.getReserves(existingPools, options), + this.getTicks(existingPools, options), + ]) + existingPools.forEach((pool, i) => { + if ( + liquidity === undefined || + reserves === undefined || + ticks === undefined + ) + return + if ( + liquidity[i] === undefined || + reserves[i] === undefined || + ticks[i] === undefined + ) + return + this.pools.set(pool.address.toLowerCase(), { + ...pool, + reserve0: reserves[i]![0], + reserve1: reserves[i]![1], + liquidity: liquidity[i]!, + ticks: ticks[i]!, + }) + }) + } + + override getCurrentPoolList(t0: Token, t1: Token): PoolCode[] { + const tradeId = this.getTradeId(t0, t1) + const poolsByTrade = this.poolsByTrade.get(tradeId) ?? [] + return Array.from(this.pools.values()) + .filter((pool) => poolsByTrade.includes(pool.address.toLowerCase())) + .map((pool) => { + const v3Pool = new UniV3Pool( + pool.address, + pool.token0 as RToken, + pool.token1 as RToken, + pool.fee / 1_000_000, + pool.reserve0, + pool.reserve1, + pool.activeTick, + pool.liquidity, + pool.sqrtPriceX96, + this.getMaxTickDiapason(pool.activeTick, pool), + ) + + return new UniV3PoolCode( + v3Pool, + this.getType(), + this.getPoolProviderName(), + ) + }) + } + + async getReserves( + existingPools: RainV3Pool[], + options?: DataFetcherOptions, + ): Promise<([bigint, bigint] | undefined)[]> { + const results = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: existingPools.flatMap( + (pool) => + [ + { + chainId: this.chainId, + address: pool.token0.wrapped.address as Address, + args: [pool.address as Address], + abi: erc20Abi, + functionName: 'balanceOf', + }, + { + chainId: this.chainId, + address: pool.token1.wrapped.address as Address, + args: [pool.address as Address], + abi: erc20Abi, + functionName: 'balanceOf', + }, + ] as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return Array.from({ length: existingPools.length }, () => undefined) + }) + + const reserves = [] + for (let i = 0; i < results.length; i += 2) { + const res0 = results?.[i]?.result + const res1 = results?.[i + 1]?.result + if (typeof res0 === 'bigint' && typeof res1 === 'bigint') { + reserves.push([res0, res1] as [bigint, bigint]) + } else { + reserves.push(undefined) + } + } + return reserves + } + + async getLiquidity( + existingPools: RainV3Pool[], + options?: DataFetcherOptions, + ): Promise<(bigint | undefined)[]> { + const results = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: existingPools.map( + (pool) => + ({ + chainId: this.chainId, + address: pool.address as Address, + abi: [ + { + inputs: [], + name: 'liquidity', + outputs: [ + { internalType: 'uint128', name: '', type: 'uint128' }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'liquidity', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return Array.from({ length: existingPools.length }, () => undefined) + }) + + const liquidities = [] + for (let i = 0; i < results.length; i++) { + const liquidity = results?.[i]?.result + if (typeof liquidity === 'bigint') { + liquidities.push(liquidity) + } else { + liquidities.push(undefined) + } + } + return liquidities + } + + async getTicks( + existingPools: RainV3Pool[], + options?: DataFetcherOptions, + ): Promise[] | undefined> { + const [minIndexes, maxIndexes] = this.getIndexes(existingPools) + const wordList = existingPools.map((pool, i) => { + const minIndex = minIndexes[i]! + const maxIndex = maxIndexes[i]! + + return [ + pool, + Array.from({ length: maxIndex - minIndex + 1 }, (_, i) => minIndex + i), + ] as [RainV3Pool, number[]] + }) + return await this.getTicksInner(wordList, options) + } + + async getTicksInner( + existingPools: [RainV3Pool, number[]][], + options?: DataFetcherOptions, + ): Promise[] | undefined> { + const wordList = existingPools.flatMap(([pool, words], i) => { + return words.flatMap((j) => ({ + chainId: this.chainId, + address: this.tickLens[ + this.chainId as keyof typeof this.tickLens + ] as Address, + args: [pool.address, j] as const, + abi: tickLensAbi, + functionName: 'getPopulatedTicksInWord' as const, + index: [i, j], + })) + }) + + const tickResults = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + contracts: wordList, + blockNumber: options?.blockNumber, + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + if (!tickResults) return undefined + + const poolTicks: Map[] = [] + tickResults.forEach((t, i) => { + const index = wordList[i]!.index[0]! + const wordIndex = wordList[i]!.index[1]! + if (poolTicks[index] === undefined) poolTicks[index] = new Map() + poolTicks[index]!.set( + wordIndex, + (t?.result || []) + .map((tick) => ({ + index: tick.tick, + DLiquidity: tick.liquidityNet, + })) + .sort((a, b) => a.index - b.index), + ) + }) + return poolTicks + } + + // fetches pool tickSpacing, this will be used + // instead of hardcoded TICK_SPACINGS values + async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { + const calldata = { + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: pools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: tickSpacingAbi, + functionName: 'tickSpacing', + }) as const, + ), + } + return await this.client.multicall(calldata).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + } + + getMaxTickDiapason(tick: number, pool: RainV3Pool): CLTick[] { + const currentTickIndex = bitmapIndex(tick, pool.tickSpacing) + if (!pool.ticks.has(currentTickIndex)) return [] + let minIndex + let maxIndex + for (minIndex = currentTickIndex; pool.ticks.has(minIndex); --minIndex); + for (maxIndex = currentTickIndex + 1; pool.ticks.has(maxIndex); ++maxIndex); + if (maxIndex - minIndex <= 1) return [] + + let poolTicks: CLTick[] = [] + for (let i = minIndex + 1; i < maxIndex; ++i) + poolTicks = poolTicks.concat(pool.ticks.get(i)!) + + const lowerUnknownTick = + (minIndex + 1) * pool.tickSpacing * 256 - pool.tickSpacing + console.assert( + poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, + 'Error 236: unexpected min tick index', + ) + poolTicks.unshift({ + index: lowerUnknownTick, + DLiquidity: 0n, + }) + const upperUnknownTick = maxIndex * pool.tickSpacing * 256 + console.assert( + poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, + 'Error 244: unexpected max tick index', + ) + poolTicks.push({ + index: upperUnknownTick, + DLiquidity: 0n, + }) + + return poolTicks + } + + override processLog(log: Log) { + const factory = + this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() + const logAddress = log.address.toLowerCase() + if (logAddress === factory) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi, + eventName: 'PoolCreated', + })[0]! + this.nonExistentPools.delete(event.args.pool.toLowerCase()) + } catch {} + } else { + const pool = this.pools.get(logAddress) as RainV3Pool | undefined + if (pool) { + try { + const event = parseEventLogs({ logs: [log], abi: this.eventsAbi })[0]! + switch (event.eventName) { + case 'Mint': { + const { amount, amount0, amount1 } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity += amount + } + if (amount1 !== undefined && amount0 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + this.addTick(tickLower, amount, pool) + this.addTick(tickUpper, -amount, pool) + } + } + break + } + case 'Burn': { + const { amount } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity -= amount + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + this.addTick(tickLower, -amount, pool) + this.addTick(tickUpper, amount, pool) + } + } + break + } + case 'Collect': + case 'CollectProtocol': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1 } = event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 -= amount0 + pool.reserve1 -= amount1 + } + } + break + } + case 'Flash': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { paid0, paid1 } = event.args + if (paid0 !== undefined && paid1 !== undefined) { + pool.reserve0 += paid0 + pool.reserve1 += paid1 + } + } + break + } + case 'Swap': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1, sqrtPriceX96, liquidity, tick } = + event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if (sqrtPriceX96 !== undefined) pool.sqrtPriceX96 = sqrtPriceX96 + if (liquidity !== undefined) pool.liquidity = liquidity + if (tick !== undefined) { + pool.activeTick = + Math.floor(tick / pool.tickSpacing) * pool.tickSpacing + const newTicks = this.onPoolTickChange(pool.activeTick, pool) + const queue = this.newTicksQueue.find( + (v) => v[0].address === pool.address, + ) + if (queue) { + for (const tick of newTicks) { + if (!queue[1].includes(tick)) queue[1].push(tick) + } + } else { + this.newTicksQueue.push([pool, newTicks]) + } + } + } + break + } + default: + } + } catch {} + } + } + } + + override async afterProcessLog(untilBlock: bigint) { + const newTicksQueue = [...this.newTicksQueue.splice(0)] + try { + if (newTicksQueue.length) { + const newTicks = await this.getTicksInner(newTicksQueue, { + blockNumber: untilBlock, + }) + newTicksQueue.forEach(([pool], i) => { + newTicks?.[i]?.forEach((newTick, index) => { + pool.ticks.set(index, newTick) + }) + }) + } + } catch { + // if unsuccessfull to get new ticks, put them back on queue for next try + newTicksQueue.forEach(([pool, newTicks]) => { + const queue = this.newTicksQueue.find( + (v) => v[0].address === pool.address, + ) + if (queue) { + for (const tick of newTicks) { + if (!queue[1].includes(tick)) queue[1].push(tick) + } + } else { + this.newTicksQueue.push([pool, newTicks]) + } + }) + throw '' + } + } + + addTick(tick: number, amount: bigint, pool: RainV3Pool) { + const tickWord = bitmapIndex(tick, pool.tickSpacing) + const ticks = pool.ticks.get(tickWord) + if (ticks !== undefined) { + if (ticks.length === 0 || tick < ticks[0]!.index) { + ticks.unshift({ index: tick, DLiquidity: amount }) + return + } + if (tick === ticks[0]!.index) { + ticks[0]!.DLiquidity = ticks[0]!.DLiquidity + amount + if (ticks[0]!.DLiquidity === 0n) ticks.splice(0, 1) + return + } + + let start = 0 + let end = ticks.length + while (end - start > 1) { + const middle = Math.floor((start + end) / 2) + const index = ticks[middle]!.index + if (index < tick) start = middle + else if (index > tick) end = middle + else { + ticks[middle]!.DLiquidity = ticks[middle]!.DLiquidity + amount + if (ticks[middle]!.DLiquidity === 0n) ticks.splice(middle, 1) + return + } + } + ticks.splice(start + 1, 0, { index: tick, DLiquidity: amount }) + } + } + + onPoolTickChange(tick: number, pool: RainV3Pool): number[] { + const currentTickWord = bitmapIndex(tick, pool.tickSpacing) + const minWord = bitmapIndex( + tick - NUMBER_OF_SURROUNDING_TICKS, + pool.tickSpacing, + ) + const maxWord = bitmapIndex( + tick + NUMBER_OF_SURROUNDING_TICKS, + pool.tickSpacing, + ) + + const direction = currentTickWord - minWord <= maxWord - currentTickWord + const wordNumber = maxWord - minWord + const newTicks: number[] = [] + for (let i = wordNumber; i >= 0; --i) { + const wordIndex = currentTickWord + this.getJump(i, direction) + const wordState = pool.ticks.get(wordIndex) + if (wordState === undefined) newTicks.push(wordIndex) + } + return newTicks + } + + // if positiveFirst == true returns 0, 1, -1, 2, -2, 3, -3, ... + // if positiveFirst == false returns 0, -1, 1, -2, 2, -3, 3, ... + getJump(index: number, positiveFirst: boolean): number { + let res + if (index % 2 === 0) res = -index / 2 + else res = (index + 1) / 2 + return positiveFirst ? res : -res + } + + handleNonExistentPool(poolAddress: string) { + const v = this.nonExistentPools.get(poolAddress) + if (v) { + this.nonExistentPools.set(poolAddress, v + 1) + } else { + this.nonExistentPools.set(poolAddress, 1) + } + } +} diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.test.ts b/packages/sushi/src/router/rain/rain-data-fetcher.test.ts new file mode 100644 index 0000000000..6db70ea459 --- /dev/null +++ b/packages/sushi/src/router/rain/rain-data-fetcher.test.ts @@ -0,0 +1,124 @@ +import { describe, expect, it } from 'vitest' +import { ChainId } from '../../chain/constants.js' +import { ROUTE_PROCESSOR_4_ADDRESS } from '../../config/route-processor.js' +import { USDC, USDT } from '../../currency/tokens.js' +import { RainDataFetcher } from './rain-data-fetcher.js' +import { LiquidityProviders } from '../liquidity-providers/index.js' +import { Router } from '../router.js' + +describe('RainDataFetcher Indexer', async () => { + it('should correctly update pools data by logs', async () => { + // 2000 blocks apart + const currentBlockNumber = 64818756n + const oldBlockNumber = 64816756n + const fromToken = USDT[ChainId.POLYGON] + const toToken = USDC[ChainId.POLYGON] + const amountIn = 10_000_000n // 10e6, ie 10 USDT + const gasPrice = 30_000_000 + // one of each type + const lps = [ + LiquidityProviders.UniswapV3, // univ3 + LiquidityProviders.QuickSwapV3, // algebra + LiquidityProviders.QuickSwapV2, // univ2 + ] + + // data fetcher without indexer (normal way ie raw pool data fecthed directly by contract calls) + const dataFectherFresh = new RainDataFetcher(ChainId.POLYGON) + dataFectherFresh.startDataFetching(lps) + dataFectherFresh.stopDataFetching() + + // data fetcher with indexer (pool data will be updated from older block to current block by contract logs) + const dataFectherIndexer = new RainDataFetcher(ChainId.POLYGON) + dataFectherIndexer.startDataFetching(lps) + dataFectherIndexer.stopDataFetching() + + // get token pools data for current block on fresh dataFetcher + await dataFectherFresh.fetchPoolsForToken(fromToken, toToken, undefined, { + blockNumber: currentBlockNumber, + }) + const freshPcMap = dataFectherFresh.getCurrentPoolCodeMap( + fromToken, + toToken, + ) + const freshRoute = Router.findBestRoute( + freshPcMap, + ChainId.POLYGON, + fromToken, + amountIn, + toToken, + gasPrice, + lps, + undefined, + undefined, + 'single', + ) + + // get token pools data for older block on indexer dataFetcher, then ensure the + // amount out it gives is different to fresh datafetcher amount out + // and then update the pools data with contract logs from between the blocks + await dataFectherIndexer.fetchPoolsForToken(fromToken, toToken, undefined, { + blockNumber: oldBlockNumber, + }) + const indexerPcMapOld = dataFectherIndexer.getCurrentPoolCodeMap( + fromToken, + toToken, + ) + const indexerRouteOld = Router.findBestRoute( + indexerPcMapOld, + ChainId.POLYGON, + fromToken, + amountIn, + toToken, + gasPrice, + lps, + undefined, + undefined, + 'single', + ) + // should not be equal (just to make sure) + expect(freshRoute.amountOutBI).not.equal(indexerRouteOld.amountOutBI) + + // now update the indexer pools data with logs + await dataFectherIndexer.updatePools(currentBlockNumber) + const indexerPcMap = dataFectherIndexer.getCurrentPoolCodeMap( + fromToken, + toToken, + ) + const indexerRoute = Router.findBestRoute( + indexerPcMap, + ChainId.POLYGON, + fromToken, + amountIn, + toToken, + gasPrice, + lps, + undefined, + undefined, + 'single', + ) + + // assert amount outs and status + expect(freshRoute.amountOutBI).toEqual(indexerRoute.amountOutBI) + expect(freshRoute.totalAmountOutBI).toEqual(indexerRoute.totalAmountOutBI) + expect(freshRoute.status).toEqual(indexerRoute.status) + + // assert produced route code + const freshRpParams = Router.routeProcessor4Params( + freshPcMap, + freshRoute, + fromToken, + toToken, + ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], + ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], + ) + const indexerRpParams = Router.routeProcessor4Params( + indexerPcMap, + indexerRoute, + fromToken, + toToken, + ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], + ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], + ) + expect(freshRpParams.routeCode).toEqual(indexerRpParams.routeCode) + }) +}) diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.ts b/packages/sushi/src/router/rain/rain-data-fetcher.ts new file mode 100644 index 0000000000..9f76a68e15 --- /dev/null +++ b/packages/sushi/src/router/rain/rain-data-fetcher.ts @@ -0,0 +1,221 @@ +import { isDeepStrictEqual } from 'util' +import { ParseAbiItem } from 'viem' +import { Type } from '../../currency/index.js' +import { DataFetcher, DataFetcherOptions } from '../data-fetcher.js' +import { ApeSwapProvider } from '../liquidity-providers/ApeSwap.js' +import { BaseSwapProvider } from '../liquidity-providers/BaseSwap.js' +import { BiswapProvider } from '../liquidity-providers/Biswap.js' +import { BlastDEXProvider } from '../liquidity-providers/BlastDEX.js' +import { BlazeSwapProvider } from '../liquidity-providers/BlazeSwap.js' +import { DfynProvider } from '../liquidity-providers/Dfyn.js' +import { DovishV3Provider } from '../liquidity-providers/DovishV3.js' +import { DyorV2Provider } from '../liquidity-providers/DyorV2.js' +import { ElkProvider } from '../liquidity-providers/Elk.js' +import { EnosysProvider } from '../liquidity-providers/Enosys.js' +import { GravityFinanceProvider } from '../liquidity-providers/GravityFinance.js' +import { HoneySwapProvider } from '../liquidity-providers/HoneySwap.js' +import { HyperBlastProvider } from '../liquidity-providers/HyperBlast.js' +import { JetSwapProvider } from '../liquidity-providers/JetSwap.js' +import { KinetixV2Provider } from '../liquidity-providers/KinetixV2.js' +import { KinetixV3Provider } from '../liquidity-providers/KinetixV3.js' +import { LaserSwapV2Provider } from '../liquidity-providers/LaserSwap.js' +import { LiquidityProviders } from '../liquidity-providers/LiquidityProvider.js' +import { LynexV1Provider } from '../liquidity-providers/LynexV1.js' +import { LynexV2Provider } from '../liquidity-providers/LynexV2.js' +import { MSwapProvider } from '../liquidity-providers/MSwap.js' +import { MonoswapV2Provider } from '../liquidity-providers/MonoSwapV2.js' +import { MonoswapV3Provider } from '../liquidity-providers/MonoSwapV3.js' +import { NativeWrapProvider } from '../liquidity-providers/NativeWrapProvider.js' +import { NetSwapProvider } from '../liquidity-providers/NetSwap.js' +import { PancakeSwapV2Provider } from '../liquidity-providers/PancakeSwapV2.js' +import { PancakeSwapV3Provider } from '../liquidity-providers/PancakeSwapV3.js' +import { QuickSwapV2Provider } from '../liquidity-providers/QuickSwapV2.js' +import { QuickSwapV3Provider } from '../liquidity-providers/QuickswapV3.js' +import { SolarbeamProvider } from '../liquidity-providers/Solarbeam.js' +import { SparkDexV2Provider } from '../liquidity-providers/SparkDexV2.js' +import { SparkDexV3Provider } from '../liquidity-providers/SparkDexV3.js' +import { SparkDexV3_1Provider } from '../liquidity-providers/SparkDexV3_1.js' +import { SpookySwapV2Provider } from '../liquidity-providers/SpookySwapV2.js' +import { SpookySwapV3Provider } from '../liquidity-providers/SpookySwapV3.js' +import { SushiSwapV2Provider } from '../liquidity-providers/SushiSwapV2.js' +import { SushiSwapV3Provider } from '../liquidity-providers/SushiSwapV3.js' +import { SwapBlastProvider } from '../liquidity-providers/SwapBlast.js' +import { + ThrusterV2_1Provider, + ThrusterV2_3Provider, +} from '../liquidity-providers/ThrusterV2.js' +import { ThrusterV3Provider } from '../liquidity-providers/ThrusterV3.js' +import { TraderJoeProvider } from '../liquidity-providers/TraderJoe.js' +import { UbeSwapProvider } from '../liquidity-providers/UbeSwap.js' +import { UniswapV2Provider } from '../liquidity-providers/UniswapV2.js' +import { UniswapV3Provider } from '../liquidity-providers/UniswapV3.js' +import { VVSStandardProvider } from '../liquidity-providers/VVSStandard.js' +import { WagmiProvider } from '../liquidity-providers/Wagmi.js' + +export class RainDataFetcher extends DataFetcher { + eventsAbi: ParseAbiItem[] = [] + + override _setProviders(providers?: LiquidityProviders[]) { + this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] + ;[ + ApeSwapProvider, + BaseSwapProvider, + BiswapProvider, + BlastDEXProvider, + BlazeSwapProvider, + DfynProvider, + DovishV3Provider, + DyorV2Provider, + ElkProvider, + EnosysProvider, + GravityFinanceProvider, + HoneySwapProvider, + HyperBlastProvider, + JetSwapProvider, + KinetixV2Provider, + KinetixV3Provider, + LaserSwapV2Provider, + LynexV1Provider, + LynexV2Provider, + MonoswapV2Provider, + MonoswapV3Provider, + MSwapProvider, + NetSwapProvider, + PancakeSwapV2Provider, + PancakeSwapV3Provider, + QuickSwapV2Provider, + QuickSwapV3Provider, + SolarbeamProvider, + SparkDexV2Provider, + SparkDexV3Provider, + SparkDexV3_1Provider, + SpookySwapV2Provider, + SpookySwapV3Provider, + SushiSwapV2Provider, + SushiSwapV3Provider, + SwapBlastProvider, + ThrusterV2_1Provider, + ThrusterV2_3Provider, + ThrusterV3Provider, + TraderJoeProvider, + UbeSwapProvider, + UniswapV2Provider, + UniswapV3Provider, + VVSStandardProvider, + WagmiProvider, + ].forEach((p) => { + try { + const provider = new p(this.chainId, this.web3Client) + if ( + // If none passed, include all + !providers || + this._providerIsIncluded(provider.getType(), providers) + ) { + this.providers.push(provider) + // gather eventsAbi unique instances + if (provider?.eventsAbi?.length) { + ;(provider.eventsAbi as any[]).forEach((v) => { + if (this.eventsAbi.every((e) => !isDeepStrictEqual(e, v))) { + this.eventsAbi.push(v) + } + }) + } + } + } catch (_e: unknown) {} + }) + } + + override async fetchPoolsForToken( + currency0: Type, + currency1: Type, + excludePools?: Set, + options?: DataFetcherOptions, + ): Promise { + if (!options) { + options = { + blockNumber: await this.web3Client.getBlockNumber(), + } + } + if (typeof options.blockNumber !== 'bigint') { + options.blockNumber = await this.web3Client.getBlockNumber() + } + super.fetchPoolsForToken(currency0, currency1, excludePools, options) + } + + // updates the pool data of all dexes by enevts until the given block + async updatePools(untilBlock?: bigint) { + let fromBlock = -1n + const addresses: string[] = [] + if (typeof untilBlock !== 'bigint') { + untilBlock = await this.web3Client.getBlockNumber() + } + + // gather all provider factory and pools addresses + this.providers.forEach((provider: any) => { + if (provider.factory) { + const factory = + provider.factory[ + this.chainId as keyof typeof provider.factory + ]!.toLowerCase() + if (!addresses.includes(factory)) { + addresses.push(factory) + } + } + if (provider.pools) { + const pools = provider.pools as Map + pools.forEach((pool, address) => { + if (!addresses.includes(address)) { + addresses.push(address) + } + if (fromBlock === -1n) { + fromBlock = pool.blockNumber + } + if (pool.blockNumber < fromBlock) { + fromBlock = pool.blockNumber + } + }) + } + }) + if (!addresses.length) return + if (fromBlock === untilBlock) return + + // get logs and sort them from earliest block to latest + const logs = await this.web3Client.getLogs({ + events: this.eventsAbi, + address: addresses as `0x${string}`[], + fromBlock, + toBlock: untilBlock, + }) + logs.sort((a, b) => { + const diff = a.blockNumber - b.blockNumber + if (diff === 0n) { + return a.logIndex - b.logIndex + } else { + return Number(diff) + } + }) + + // process each log by each provider + logs.forEach((log) => { + this.providers.forEach((p) => { + p.processLog(log) + }) + }) + const results = await Promise.allSettled( + this.providers.map((p) => p.afterProcessLog(untilBlock!)), + ) + results.forEach((res, i) => { + if (res.status === 'fulfilled') { + if ((this.providers[i] as any)?.pools) { + const pools = (this.providers[i] as any).pools as Map< + string, + { blockNumber: bigint } + > + pools.forEach((pool) => { + pool.blockNumber = untilBlock as bigint + }) + } + } + }) + } +} From ff98e6e11deda38c5ac806951b91dee09e8a4592 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 15 Jan 2025 00:01:42 +0000 Subject: [PATCH 103/140] lint --- .../router/rain/{rain-data-fetcher.test.ts => rain.test.ts} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename packages/sushi/src/router/rain/{rain-data-fetcher.test.ts => rain.test.ts} (98%) diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.test.ts b/packages/sushi/src/router/rain/rain.test.ts similarity index 98% rename from packages/sushi/src/router/rain/rain-data-fetcher.test.ts rename to packages/sushi/src/router/rain/rain.test.ts index 6db70ea459..4024d0fef1 100644 --- a/packages/sushi/src/router/rain/rain-data-fetcher.test.ts +++ b/packages/sushi/src/router/rain/rain.test.ts @@ -2,11 +2,11 @@ import { describe, expect, it } from 'vitest' import { ChainId } from '../../chain/constants.js' import { ROUTE_PROCESSOR_4_ADDRESS } from '../../config/route-processor.js' import { USDC, USDT } from '../../currency/tokens.js' -import { RainDataFetcher } from './rain-data-fetcher.js' import { LiquidityProviders } from '../liquidity-providers/index.js' import { Router } from '../router.js' +import { RainDataFetcher } from './rain-data-fetcher.js' -describe('RainDataFetcher Indexer', async () => { +describe('Rain fork tests', async () => { it('should correctly update pools data by logs', async () => { // 2000 blocks apart const currentBlockNumber = 64818756n From 6307b583f390501b0651e6e3b05157a5f182b00f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 15 Jan 2025 00:43:58 +0000 Subject: [PATCH 104/140] fix --- packages/sushi/package.json | 2 +- packages/sushi/src/router/rain/rain-data-fetcher.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sushi/package.json b/packages/sushi/package.json index f56eda3c8b..8c860761f0 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -187,7 +187,7 @@ "dev": "tsc -w", "generate": "tsx ./scripts/generate.ts", "prepublishOnly": "pnpm build", - "test": "vitest run -c ./test/vitest.config.ts", + "test": "vitest run -c ./test/vitest.config.ts --test-timeout 600000", "test:debug": "vitest --inspect-brk --no-threads run -c ./test/vitest.config.ts", "test:watch": "vitest dev -c ./test/vitest.config.ts" }, diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.ts b/packages/sushi/src/router/rain/rain-data-fetcher.ts index 9f76a68e15..ef7903ddc0 100644 --- a/packages/sushi/src/router/rain/rain-data-fetcher.ts +++ b/packages/sushi/src/router/rain/rain-data-fetcher.ts @@ -139,7 +139,7 @@ export class RainDataFetcher extends DataFetcher { if (typeof options.blockNumber !== 'bigint') { options.blockNumber = await this.web3Client.getBlockNumber() } - super.fetchPoolsForToken(currency0, currency1, excludePools, options) + await super.fetchPoolsForToken(currency0, currency1, excludePools, options) } // updates the pool data of all dexes by enevts until the given block From 439659ba110c4c0731e18a3e9100114a114d00ae Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 15 Jan 2025 02:21:48 +0000 Subject: [PATCH 105/140] Update data-fetcher.ts --- packages/sushi/src/router/data-fetcher.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 138895df2d..aab335a60f 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -7,7 +7,6 @@ import { BaseSwapProvider } from './liquidity-providers/BaseSwap.js' import { BiswapProvider } from './liquidity-providers/Biswap.js' import { BlastDEXProvider } from './liquidity-providers/BlastDEX.js' import { BlazeSwapProvider } from './liquidity-providers/BlazeSwap.js' -import { CamelotProvider } from './liquidity-providers/Camelot.js' import { CurveProvider } from './liquidity-providers/CurveProvider.js' import { DfynProvider } from './liquidity-providers/Dfyn.js' import { DovishV3Provider } from './liquidity-providers/DovishV3.js' @@ -160,7 +159,6 @@ export class DataFetcher { BiswapProvider, BlastDEXProvider, BlazeSwapProvider, - CamelotProvider, CurveProvider, DfynProvider, DovishV3Provider, From 86b27a2e59a7a47cf924b896ee660f0bd94c528e Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 15 Jan 2025 03:05:17 +0000 Subject: [PATCH 106/140] Update rain-data-fetcher.ts --- .../src/router/rain/rain-data-fetcher.ts | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.ts b/packages/sushi/src/router/rain/rain-data-fetcher.ts index ef7903ddc0..a54e8d669d 100644 --- a/packages/sushi/src/router/rain/rain-data-fetcher.ts +++ b/packages/sushi/src/router/rain/rain-data-fetcher.ts @@ -51,6 +51,8 @@ import { UniswapV2Provider } from '../liquidity-providers/UniswapV2.js' import { UniswapV3Provider } from '../liquidity-providers/UniswapV3.js' import { VVSStandardProvider } from '../liquidity-providers/VVSStandard.js' import { WagmiProvider } from '../liquidity-providers/Wagmi.js' +import { RainUniswapV2BaseProvider } from './RainUniswapV2Base.js' +import { RainUniswapV3BaseProvider } from './RainUniswapV3Base.js' export class RainDataFetcher extends DataFetcher { eventsAbi: ParseAbiItem[] = [] @@ -131,15 +133,16 @@ export class RainDataFetcher extends DataFetcher { excludePools?: Set, options?: DataFetcherOptions, ): Promise { - if (!options) { - options = { + let opts = options + if (!opts) { + opts = { blockNumber: await this.web3Client.getBlockNumber(), } } - if (typeof options.blockNumber !== 'bigint') { - options.blockNumber = await this.web3Client.getBlockNumber() + if (typeof opts.blockNumber !== 'bigint') { + opts.blockNumber = await this.web3Client.getBlockNumber() } - await super.fetchPoolsForToken(currency0, currency1, excludePools, options) + await super.fetchPoolsForToken(currency0, currency1, excludePools, opts) } // updates the pool data of all dexes by enevts until the given block @@ -152,7 +155,10 @@ export class RainDataFetcher extends DataFetcher { // gather all provider factory and pools addresses this.providers.forEach((provider: any) => { - if (provider.factory) { + if ( + provider instanceof RainUniswapV2BaseProvider || + provider instanceof RainUniswapV3BaseProvider + ) { const factory = provider.factory[ this.chainId as keyof typeof provider.factory @@ -160,9 +166,7 @@ export class RainDataFetcher extends DataFetcher { if (!addresses.includes(factory)) { addresses.push(factory) } - } - if (provider.pools) { - const pools = provider.pools as Map + const pools = provider.pools pools.forEach((pool, address) => { if (!addresses.includes(address)) { addresses.push(address) @@ -195,7 +199,7 @@ export class RainDataFetcher extends DataFetcher { } }) - // process each log by each provider + // process each log for each provider logs.forEach((log) => { this.providers.forEach((p) => { p.processLog(log) @@ -206,13 +210,13 @@ export class RainDataFetcher extends DataFetcher { ) results.forEach((res, i) => { if (res.status === 'fulfilled') { - if ((this.providers[i] as any)?.pools) { - const pools = (this.providers[i] as any).pools as Map< - string, - { blockNumber: bigint } - > - pools.forEach((pool) => { - pool.blockNumber = untilBlock as bigint + const provider = this.providers[i] + if ( + provider instanceof RainUniswapV2BaseProvider || + provider instanceof RainUniswapV3BaseProvider + ) { + provider.pools.forEach((pool) => { + pool.blockNumber = untilBlock! }) } } From 69d1c6ae9e415fcb143eb2ad539bd64c3181915b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 15 Jan 2025 03:51:20 +0000 Subject: [PATCH 107/140] update --- .../sushi/src/router/rain/AlgebraV1Base.ts | 174 +++--------------- .../src/router/rain/RainUniswapV3Base.ts | 7 +- 2 files changed, 35 insertions(+), 146 deletions(-) diff --git a/packages/sushi/src/router/rain/AlgebraV1Base.ts b/packages/sushi/src/router/rain/AlgebraV1Base.ts index bcd694ab65..2b0f1e82c6 100644 --- a/packages/sushi/src/router/rain/AlgebraV1Base.ts +++ b/packages/sushi/src/router/rain/AlgebraV1Base.ts @@ -7,7 +7,6 @@ import { getAddress, keccak256, parseAbiItem, - parseEventLogs, } from 'viem' import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' @@ -239,151 +238,36 @@ export abstract class AlgebraV1BaseProvider extends RainUniswapV3BaseProvider { return true } - override processLog(log: Log) { - const factory = - this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() - const logAddress = log.address.toLowerCase() - if (logAddress === factory) { - try { - const event = parseEventLogs({ - logs: [log], - abi: this.eventsAbi as typeof AlgebraEventsAbi, - eventName: 'Pool', - })[0]! - this.nonExistentPools.delete(event.args.pool.toLowerCase()) - } catch {} - } else { - const pool = this.pools.get(logAddress) as RainV3Pool | undefined - if (pool) { - try { - const event = parseEventLogs({ - logs: [log], - abi: this.eventsAbi as typeof AlgebraEventsAbi, - })[0]! - switch (event.eventName) { - case 'Mint': { - const { amount, amount0, amount1 } = event.args - const { tickLower, tickUpper } = event.args - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount - ) { - const tick = pool.activeTick - if (tickLower <= tick && tick < tickUpper) - pool.liquidity += amount - } - if (amount1 !== undefined && amount0 !== undefined) { - pool.reserve0 += amount0 - pool.reserve1 += amount1 - } - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount - ) { - this.addTick(tickLower, amount, pool) - this.addTick(tickUpper, -amount, pool) - } - } - break - } - case 'Burn': { - const { amount } = event.args - const { tickLower, tickUpper } = event.args - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount - ) { - const tick = pool.activeTick - if (tickLower <= tick && tick < tickUpper) - pool.liquidity -= amount - } - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount - ) { - this.addTick(tickLower, -amount, pool) - this.addTick(tickUpper, amount, pool) - } - } - break - } - case 'Collect': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { amount0, amount1 } = event.args - if (amount0 !== undefined && amount1 !== undefined) { - pool.reserve0 -= amount0 - pool.reserve1 -= amount1 - } - } - break - } - case 'Flash': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { paid0, paid1 } = event.args - if (paid0 !== undefined && paid1 !== undefined) { - pool.reserve0 += paid0 - pool.reserve1 += paid1 - } - } - break - } - case 'Swap': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { amount0, amount1, sqrtPriceX96, liquidity, tick } = - event.args - if (amount0 !== undefined && amount1 !== undefined) { - pool.reserve0 += amount0 - pool.reserve1 += amount1 - } - if (sqrtPriceX96 !== undefined) pool.sqrtPriceX96 = sqrtPriceX96 - if (liquidity !== undefined) pool.liquidity = liquidity - if (tick !== undefined) { - pool.activeTick = - Math.floor(tick / pool.tickSpacing) * pool.tickSpacing - const newTicks = this.onPoolTickChange(pool.activeTick, pool) - const queue = this.newTicksQueue.find( - (v) => v[0].address === pool.address, - ) - if (queue) { - for (const tick of newTicks) { - if (!queue[1].includes(tick)) queue[1].push(tick) - } - } else { - this.newTicksQueue.push([pool, newTicks]) - } - } - } - break - } - case 'Fee': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - pool.fee = event.args.fee - } - break - } - case 'TickSpacing': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - pool.tickSpacing = event.args.newTickSpacing - } - break - } - default: - } - } catch {} + // handle extra events that Algebra has + override otherEventCases( + log: Log, + event: Log< + bigint, + number, + boolean, + (typeof AlgebraEventsAbi)[number], + true, + typeof AlgebraEventsAbi, + (typeof AlgebraEventsAbi)[number]['name'] + >, + pool: RainV3Pool, + ): void { + switch (event.eventName) { + case 'Fee': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + pool.fee = event.args.fee + } + break + } + case 'TickSpacing': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + pool.tickSpacing = event.args.newTickSpacing + } + break } + default: } } } diff --git a/packages/sushi/src/router/rain/RainUniswapV3Base.ts b/packages/sushi/src/router/rain/RainUniswapV3Base.ts index 0df3f57948..862409329b 100644 --- a/packages/sushi/src/router/rain/RainUniswapV3Base.ts +++ b/packages/sushi/src/router/rain/RainUniswapV3Base.ts @@ -644,13 +644,18 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { } break } - default: + default: { + this.otherEventCases(log, event, pool) + } } } catch {} } } } + // for child classes if they have other events to handle such as AlgebraV1Base + otherEventCases(_log: Log, _event: Log, _pool: RainV3Pool) {} + override async afterProcessLog(untilBlock: bigint) { const newTicksQueue = [...this.newTicksQueue.splice(0)] try { From eb4e23ff4db25b4cd864241d08a99a7852af99d0 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Thu, 30 Jan 2025 15:50:18 +0000 Subject: [PATCH 108/140] update flare token base --- .../src/config/bases-to-check-trades-against.ts | 13 ++----------- packages/sushi/src/currency/tokens.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index 293f216c12..af607a1fbb 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -1,12 +1,5 @@ import { ChainId } from '../chain/index.js' -import { - ENOSYS_EETH, - ENOSYS_USDT, - ENOSYS_WETH, - MUSD, - Token, - USDB, -} from '../currency/index.js' +import { MUSD, Token, USDB, cUSDX } from '../currency/index.js' import { AAVE, BUSD, @@ -491,9 +484,7 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { WETH9[ChainId.FLARE], USDT[ChainId.FLARE], USDC[ChainId.FLARE], - ENOSYS_USDT, - ENOSYS_EETH, - ENOSYS_WETH, + cUSDX, ], [ChainId.MATCHAIN]: [ WNATIVE[ChainId.MATCHAIN], diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index 8826af525b..03d7f3b2b7 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -1222,3 +1222,11 @@ export const ENOSYS_EETH = new Token({ symbol: 'eETH', name: 'Enosys ETH', }) + +export const cUSDX = new Token({ + chainId: 14, + address: '0xFE2907DFa8DB6e320cDbF45f0aa888F6135ec4f8', + decimals: 6, + symbol: 'cUSDX', + name: 'USDX', +}) From 9792524a444f30c437f7854a44c79db1a47116ad Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Thu, 30 Jan 2025 16:06:35 +0000 Subject: [PATCH 109/140] update flare token base --- .../sushi/src/config/bases-to-check-trades-against.ts | 3 ++- packages/sushi/src/currency/tokens.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sushi/src/config/bases-to-check-trades-against.ts b/packages/sushi/src/config/bases-to-check-trades-against.ts index af607a1fbb..51216a4d44 100644 --- a/packages/sushi/src/config/bases-to-check-trades-against.ts +++ b/packages/sushi/src/config/bases-to-check-trades-against.ts @@ -1,5 +1,5 @@ import { ChainId } from '../chain/index.js' -import { MUSD, Token, USDB, cUSDX } from '../currency/index.js' +import { MUSD, Token, USDB, cUSDX, sFLR } from '../currency/index.js' import { AAVE, BUSD, @@ -484,6 +484,7 @@ export const BASES_TO_CHECK_TRADES_AGAINST: { WETH9[ChainId.FLARE], USDT[ChainId.FLARE], USDC[ChainId.FLARE], + sFLR, cUSDX, ], [ChainId.MATCHAIN]: [ diff --git a/packages/sushi/src/currency/tokens.ts b/packages/sushi/src/currency/tokens.ts index 03d7f3b2b7..1403e13578 100644 --- a/packages/sushi/src/currency/tokens.ts +++ b/packages/sushi/src/currency/tokens.ts @@ -1230,3 +1230,11 @@ export const cUSDX = new Token({ symbol: 'cUSDX', name: 'USDX', }) + +export const sFLR = new Token({ + chainId: 14, + address: '0x12e605bc104e93B45e1aD99F9e555f659051c2BB', + decimals: 18, + symbol: 'sFLR', + name: 'Staked FLR', +}) From 0bb3e145238bfd7d4dae43a6f131cfc4c0e378b5 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 1 Feb 2025 00:50:45 +0000 Subject: [PATCH 110/140] init --- packages/sushi/src/router/data-fetcher.ts | 56 +++++++++ .../router/liquidity-providers/AlienBaseV2.ts | 24 ++++ .../router/liquidity-providers/AlienBaseV3.ts | 52 ++++++++ .../src/router/liquidity-providers/ApeSwap.ts | 3 + .../src/router/liquidity-providers/BSCSwap.ts | 24 ++++ .../router/liquidity-providers/BakerySwap.ts | 24 ++++ .../router/liquidity-providers/BaseSwapV3.ts | 53 ++++++++ .../router/liquidity-providers/BladeSwap.ts | 29 +++++ .../src/router/liquidity-providers/COREx.ts | 26 ++++ .../router/liquidity-providers/CroDefiSwap.ts | 24 ++++ .../liquidity-providers/DackieSwapV2.ts | 36 ++++++ .../liquidity-providers/DackieSwapV3.ts | 108 +++++++++++++++++ .../router/liquidity-providers/EddyFinance.ts | 24 ++++ .../src/router/liquidity-providers/Fenix.ts | 29 +++++ .../src/router/liquidity-providers/GlyphV4.ts | 29 +++++ .../src/router/liquidity-providers/Horizon.ts | 29 +++++ .../src/router/liquidity-providers/KimV4.ts | 29 +++++ .../router/liquidity-providers/Kwikswap.ts | 24 ++++ .../liquidity-providers/LiquidityProvider.ts | 53 ++++++++ .../router/liquidity-providers/MMFinance.ts | 24 ++++ .../router/liquidity-providers/NineInch.ts | 24 ++++ .../router/liquidity-providers/Pangolin.ts | 24 ++++ .../liquidity-providers/RingExchangeV2.ts | 24 ++++ .../liquidity-providers/RingExchangeV3.ts | 26 ++++ .../src/router/liquidity-providers/Scribe.ts | 29 +++++ .../router/liquidity-providers/ShibaSwap.ts | 24 ++++ .../router/liquidity-providers/Solarbeam.ts | 6 +- .../router/liquidity-providers/SquadSwapV2.ts | 24 ++++ .../router/liquidity-providers/Swapsicle.ts | 29 +++++ .../liquidity-providers/UniswapV3Base.ts | 17 +-- .../router/liquidity-providers/VVSFlawless.ts | 113 ++++++++++++++++++ .../src/router/liquidity-providers/Wagmi.ts | 23 ++++ .../router/liquidity-providers/Wigoswap.ts | 24 ++++ .../src/router/liquidity-providers/ZebraV2.ts | 46 +++++++ 34 files changed, 1118 insertions(+), 15 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/BSCSwap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/BakerySwap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/BladeSwap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/COREx.ts create mode 100644 packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/EddyFinance.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Fenix.ts create mode 100644 packages/sushi/src/router/liquidity-providers/GlyphV4.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Horizon.ts create mode 100644 packages/sushi/src/router/liquidity-providers/KimV4.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Kwikswap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/MMFinance.ts create mode 100644 packages/sushi/src/router/liquidity-providers/NineInch.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Pangolin.ts create mode 100644 packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Scribe.ts create mode 100644 packages/sushi/src/router/liquidity-providers/ShibaSwap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Swapsicle.ts create mode 100644 packages/sushi/src/router/liquidity-providers/VVSFlawless.ts create mode 100644 packages/sushi/src/router/liquidity-providers/Wigoswap.ts create mode 100644 packages/sushi/src/router/liquidity-providers/ZebraV2.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 138895df2d..764273d996 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -2,24 +2,40 @@ import { http, PublicClient, createPublicClient } from 'viem' import { ChainId, TestnetChainId } from '../chain/index.js' import { publicClientConfig } from '../config/index.js' import { Type } from '../currency/index.js' +import { AlienBaseV2Provider } from './liquidity-providers/AlienBaseV2.js' +import { AlienBaseV3Provider } from './liquidity-providers/AlienBaseV3.js' import { ApeSwapProvider } from './liquidity-providers/ApeSwap.js' +import { BSCSwapProvider } from './liquidity-providers/BSCSwap.js' +import { BakerySwapProvider } from './liquidity-providers/BakerySwap.js' import { BaseSwapProvider } from './liquidity-providers/BaseSwap.js' +import { BaseSwapV3Provider } from './liquidity-providers/BaseSwapV3.js' import { BiswapProvider } from './liquidity-providers/Biswap.js' +import { BladeSwapProvider } from './liquidity-providers/BladeSwap.js' import { BlastDEXProvider } from './liquidity-providers/BlastDEX.js' import { BlazeSwapProvider } from './liquidity-providers/BlazeSwap.js' +import { CORExProvider } from './liquidity-providers/COREx.js' import { CamelotProvider } from './liquidity-providers/Camelot.js' +import { CroDefiSwapProvider } from './liquidity-providers/CroDefiSwap.js' import { CurveProvider } from './liquidity-providers/CurveProvider.js' +import { DackieSwapV2Provider } from './liquidity-providers/DackieSwapV2.js' +import { DackieSwapV3Provider } from './liquidity-providers/DackieSwapV3.js' import { DfynProvider } from './liquidity-providers/Dfyn.js' import { DovishV3Provider } from './liquidity-providers/DovishV3.js' import { DyorV2Provider } from './liquidity-providers/DyorV2.js' +import { EddyFinanceProvider } from './liquidity-providers/EddyFinance.js' import { ElkProvider } from './liquidity-providers/Elk.js' import { EnosysProvider } from './liquidity-providers/Enosys.js' +import { FenixProvider } from './liquidity-providers/Fenix.js' +import { GlyphV4Provider } from './liquidity-providers/GlyphV4.js' import { GravityFinanceProvider } from './liquidity-providers/GravityFinance.js' import { HoneySwapProvider } from './liquidity-providers/HoneySwap.js' +import { HorizonProvider } from './liquidity-providers/Horizon.js' import { HyperBlastProvider } from './liquidity-providers/HyperBlast.js' import { JetSwapProvider } from './liquidity-providers/JetSwap.js' +import { KimV4Provider } from './liquidity-providers/KimV4.js' import { KinetixV2Provider } from './liquidity-providers/KinetixV2.js' import { KinetixV3Provider } from './liquidity-providers/KinetixV3.js' +import { KwikswapProvider } from './liquidity-providers/Kwikswap.js' import { LaserSwapV2Provider } from './liquidity-providers/LaserSwap.js' import { LiquidityProvider, @@ -27,24 +43,33 @@ import { } from './liquidity-providers/LiquidityProvider.js' import { LynexV1Provider } from './liquidity-providers/LynexV1.js' import { LynexV2Provider } from './liquidity-providers/LynexV2.js' +import { MMFinanceProvider } from './liquidity-providers/MMFinance.js' import { MSwapProvider } from './liquidity-providers/MSwap.js' import { MonoswapV2Provider } from './liquidity-providers/MonoSwapV2.js' import { MonoswapV3Provider } from './liquidity-providers/MonoSwapV3.js' import { NativeWrapProvider } from './liquidity-providers/NativeWrapProvider.js' import { NetSwapProvider } from './liquidity-providers/NetSwap.js' +import { NineInchProvider } from './liquidity-providers/NineInch.js' import { PancakeSwapV2Provider } from './liquidity-providers/PancakeSwapV2.js' import { PancakeSwapV3Provider } from './liquidity-providers/PancakeSwapV3.js' +import { PangolinProvider } from './liquidity-providers/Pangolin.js' import { QuickSwapV2Provider } from './liquidity-providers/QuickSwapV2.js' import { QuickSwapV3Provider } from './liquidity-providers/QuickswapV3.js' +import { RingExchangeV2Provider } from './liquidity-providers/RingExchangeV2.js' +import { RingExchangeV3Provider } from './liquidity-providers/RingExchangeV3.js' +import { ScribeProvider } from './liquidity-providers/Scribe.js' +import { ShibaSwapProvider } from './liquidity-providers/ShibaSwap.js' import { SolarbeamProvider } from './liquidity-providers/Solarbeam.js' import { SparkDexV2Provider } from './liquidity-providers/SparkDexV2.js' import { SparkDexV3Provider } from './liquidity-providers/SparkDexV3.js' import { SparkDexV3_1Provider } from './liquidity-providers/SparkDexV3_1.js' import { SpookySwapV2Provider } from './liquidity-providers/SpookySwapV2.js' import { SpookySwapV3Provider } from './liquidity-providers/SpookySwapV3.js' +import { SquadSwapV2Provider } from './liquidity-providers/SquadSwapV2.js' import { SushiSwapV2Provider } from './liquidity-providers/SushiSwapV2.js' import { SushiSwapV3Provider } from './liquidity-providers/SushiSwapV3.js' import { SwapBlastProvider } from './liquidity-providers/SwapBlast.js' +import { SwapsicleProvider } from './liquidity-providers/Swapsicle.js' import { ThrusterV2_1Provider, ThrusterV2_3Provider, @@ -55,8 +80,11 @@ import { TridentProvider } from './liquidity-providers/Trident.js' import { UbeSwapProvider } from './liquidity-providers/UbeSwap.js' import { UniswapV2Provider } from './liquidity-providers/UniswapV2.js' import { UniswapV3Provider } from './liquidity-providers/UniswapV3.js' +import { VVSFlawlessProvider } from './liquidity-providers/VVSFlawless.js' import { VVSStandardProvider } from './liquidity-providers/VVSStandard.js' import { WagmiProvider } from './liquidity-providers/Wagmi.js' +import { WigoswapProvider } from './liquidity-providers/Wigoswap.js' +import { ZebraV2Provider } from './liquidity-providers/ZebraV2.js' import type { PoolCode } from './pool-codes/index.js' import { promiseTimeout } from './timeout.js' @@ -155,44 +183,69 @@ export class DataFetcher { // concrete providers this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] ;[ + AlienBaseV2Provider, + AlienBaseV3Provider, ApeSwapProvider, + BakerySwapProvider, BaseSwapProvider, + BaseSwapV3Provider, BiswapProvider, + BladeSwapProvider, BlastDEXProvider, BlazeSwapProvider, + BSCSwapProvider, CamelotProvider, + CORExProvider, + CroDefiSwapProvider, CurveProvider, + DackieSwapV2Provider, + DackieSwapV3Provider, DfynProvider, DovishV3Provider, DyorV2Provider, + EddyFinanceProvider, ElkProvider, EnosysProvider, + FenixProvider, + GlyphV4Provider, GravityFinanceProvider, HoneySwapProvider, + HorizonProvider, HyperBlastProvider, JetSwapProvider, + KimV4Provider, KinetixV2Provider, KinetixV3Provider, + KwikswapProvider, LaserSwapV2Provider, LynexV1Provider, LynexV2Provider, + MMFinanceProvider, MonoswapV2Provider, MonoswapV3Provider, MSwapProvider, NetSwapProvider, + NineInchProvider, PancakeSwapV2Provider, PancakeSwapV3Provider, + PangolinProvider, QuickSwapV2Provider, QuickSwapV3Provider, + RingExchangeV2Provider, + RingExchangeV3Provider, + ScribeProvider, + ShibaSwapProvider, SolarbeamProvider, SparkDexV2Provider, SparkDexV3Provider, SparkDexV3_1Provider, SpookySwapV2Provider, SpookySwapV3Provider, + SquadSwapV2Provider, SushiSwapV2Provider, SushiSwapV3Provider, SwapBlastProvider, + SwapsicleProvider, ThrusterV2_1Provider, ThrusterV2_3Provider, ThrusterV3Provider, @@ -202,7 +255,10 @@ export class DataFetcher { UniswapV2Provider, UniswapV3Provider, VVSStandardProvider, + VVSFlawlessProvider, WagmiProvider, + WigoswapProvider, + ZebraV2Provider, ].forEach((p) => { try { const provider = new p(this.chainId, this.web3Client) diff --git a/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts b/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts new file mode 100644 index 0000000000..6103f63f54 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class AlienBaseV2Provider extends UniswapV2BaseProvider { + override fee = 0.0016 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x3E84D913803b02A4a7f027165E8cA42C14C0FdE7', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0x7ede5bbb7d245103c4a6d59bfd62246fbc488e93f95f23a19d9d76f0d91bd0d0', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.AlienBaseV2 + } + getPoolProviderName(): string { + return 'AlienBaseV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts b/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts new file mode 100644 index 0000000000..4c3634d238 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts @@ -0,0 +1,52 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +/** + * The default factory enabled fee amounts, denominated in hundredths of bips. + */ +export enum AlienBaseV3FeeAmount { + /** 0.02% */ + LOWEST = 200, + /** 0.075% */ + LOW = 750, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +export const ALIENBASE_V3_FEE_SPACING_MAP: Record< + AlienBaseV3FeeAmount, + number +> = { + [AlienBaseV3FeeAmount.LOWEST]: 4, + [AlienBaseV3FeeAmount.LOW]: 15, + [AlienBaseV3FeeAmount.MEDIUM]: 60, + [AlienBaseV3FeeAmount.HIGH]: 200, +} + +export class AlienBaseV3Provider extends UniswapV3BaseProvider { + override FEE = AlienBaseV3FeeAmount + override TICK_SPACINGS = ALIENBASE_V3_FEE_SPACING_MAP + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x0Fd83557b2be93617c9C1C1B6fd549401C74558C', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.BASE]: '0xe3B6A547495c84A039D70A81178496220B5Fbd8e', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.AlienBaseV3 + } + getPoolProviderName(): string { + return 'AlienBaseV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts index 71d8d5674f..281fa84425 100644 --- a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts @@ -10,6 +10,7 @@ export class ApeSwapProvider extends UniswapV2BaseProvider { [ChainId.POLYGON]: '0xCf083Be4164828f00cAE704EC15a36D711491284', [ChainId.BSC]: '0x0841BD0B734E4F5853f0dD8d7Ea041c241fb0Da6', [ChainId.TELOS]: '0x411172Dfcd5f68307656A1ff35520841C2F7fAec', + [ChainId.ARBITRUM]: '0xCf083Be4164828f00cAE704EC15a36D711491284', } as const const initCodeHash = { [ChainId.ETHEREUM]: @@ -20,6 +21,8 @@ export class ApeSwapProvider extends UniswapV2BaseProvider { '0xf4ccce374816856d11f00e4069e7cada164065686fbef53c6167a63ec2fd8c5b', [ChainId.TELOS]: '0x7d4b9bb0d5808344c0184aada7d10aae8f6b0cc8ceb5eba8dd084f63b8c32099', + [ChainId.ARBITRUM]: + '0xae7373e804a043c4c08107a81def627eeb3792e211fb4711fcfe32f0e4c45fd5', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/BSCSwap.ts b/packages/sushi/src/router/liquidity-providers/BSCSwap.ts new file mode 100644 index 0000000000..c16f48895b --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BSCSwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class BSCSwapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BSC]: '0xCe8fd65646F2a2a897755A1188C04aCe94D2B8D0', + } as const + const initCodeHash = { + [ChainId.BSC]: + '0xacc1c81cc3e9fb496da555f6bd67c3a095e579b26c1b580070cc6afa8f0a94fa', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.BSCSwap + } + getPoolProviderName(): string { + return 'BSCSwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/BakerySwap.ts b/packages/sushi/src/router/liquidity-providers/BakerySwap.ts new file mode 100644 index 0000000000..b5c68518ed --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BakerySwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class BakerySwapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BSC]: '0x01bF7C66c6BD861915CdaaE475042d3c4BaE16A7', + } as const + const initCodeHash = { + [ChainId.BSC]: + '0xe2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.BakerySwap + } + getPoolProviderName(): string { + return 'BakerySwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts b/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts new file mode 100644 index 0000000000..1eac59572c --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts @@ -0,0 +1,53 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +/** + * The default factory enabled fee amounts, denominated in hundredths of bips. + */ +export enum BaseSwapV3FeeAmount { + /** 0.008% */ + LOWEST = 80, + /** 0.035% */ + LOW = 350, + /** 0.045% */ + MEDIUM = 450, + /** 0.25% */ + HIGH = 2500, + /** 1% */ + HIGHEST = 10000, +} + +export const BASESWAP_V3_FEE_SPACING_MAP: Record = + { + [BaseSwapV3FeeAmount.LOWEST]: 1, + [BaseSwapV3FeeAmount.LOW]: 10, + [BaseSwapV3FeeAmount.MEDIUM]: 10, + [BaseSwapV3FeeAmount.HIGH]: 60, + [BaseSwapV3FeeAmount.HIGHEST]: 200, + } + +export class BaseSwapV3Provider extends UniswapV3BaseProvider { + override FEE = BaseSwapV3FeeAmount + override TICK_SPACINGS = BASESWAP_V3_FEE_SPACING_MAP + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x38015D05f4fEC8AFe15D7cc0386a126574e8077B', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.BASE]: '0xe3B6A547495c84A039D70A81178496220B5Fbd8e', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.BaseSwapV3 + } + getPoolProviderName(): string { + return 'BaseSwapV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/BladeSwap.ts b/packages/sushi/src/router/liquidity-providers/BladeSwap.ts new file mode 100644 index 0000000000..a6e3a71191 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/BladeSwap.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class BladeSwapProvider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0xA87DbF5082Af26c9A6Ab2B854E378f704638CCa5', + } as const + const poolDeployer = { + [ChainId.BLAST]: '0xfFeEcb1fe0EAaEFeE69d122F6B7a0368637cb593', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xa9df2657ce5872e94bdc9525588fd983b0aa5db2f3c7a83d7e6b6a99cd2003a1', + } as const + const tickLens = { + [ChainId.BLAST]: '0x969195B66f95D8B70fA414671b438134889Ba348', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.BladeSwap + } + getPoolProviderName(): string { + return 'BladeSwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/COREx.ts b/packages/sushi/src/router/liquidity-providers/COREx.ts new file mode 100644 index 0000000000..093eeb0820 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/COREx.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class CORExProvider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.CORE]: '0x526190295AFB6b8736B14E4b42744FBd95203A3a', + } as const + const initCodeHash = { + [ChainId.CORE]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.CORE]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.COREx + } + getPoolProviderName(): string { + return 'COREx' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts b/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts new file mode 100644 index 0000000000..c9c550867b --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class CroDefiSwapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0x9DEB29c9a4c7A88a3C0257393b7f3335338D9A9D', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0x69d637e77615df9f235f642acebbdad8963ef35c5523142078c9b8f9d0ceba7e', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.CroDefiSwap + } + getPoolProviderName(): string { + return 'CroDefiSwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts b/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts new file mode 100644 index 0000000000..a8a06a94a2 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts @@ -0,0 +1,36 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class DackieSwapV2Provider extends UniswapV2BaseProvider { + override fee = 0.0025 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x591f122D1df761E616c13d265006fcbf4c6d6551', + [ChainId.OPTIMISM]: '0xaEdc38bD52b0380b2Af4980948925734fD54FbF4', + [ChainId.ARBITRUM]: '0x507940c2469e6E3B33032F1d4FF8d123BDDe2f5C', + [ChainId.BLAST]: '0xF5190E64dB4cbf7ee5E72B55cC5b2297e20264c2', + [ChainId.LINEA]: '0x9790713770039CeFcf4FAaf076E2846c9B7a4630', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0xaaaacde43ad77b69fcbcdc68ccb757c3c634ad20e330a951b4a267f1180c6520', + [ChainId.OPTIMISM]: + '0x6583f40d4a27d36b2f66ec686363a3fc9a3b0f4d748e788cd6e8e2773e4ee898', + [ChainId.ARBITRUM]: + '0x6583f40d4a27d36b2f66ec686363a3fc9a3b0f4d748e788cd6e8e2773e4ee898', + [ChainId.BLAST]: + '0x08b78b4ee8893b0d52edf9be019ea4e261e38b8eb1e0d7be8940645e8f95aa28', + [ChainId.LINEA]: + '0x6583f40d4a27d36b2f66ec686363a3fc9a3b0f4d748e788cd6e8e2773e4ee898', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.DackieSwapV2 + } + getPoolProviderName(): string { + return 'DackieSwapV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts b/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts new file mode 100644 index 0000000000..fc32ff3755 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts @@ -0,0 +1,108 @@ +import { Address, PublicClient } from 'viem' +import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' +import { ChainId } from '../../chain/index.js' +import { + PANCAKESWAP_V3_FEE_SPACING_MAP, + PancakeSwapV3FeeAmount, +} from '../../config/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class DackieSwapV3Provider extends UniswapV3BaseProvider { + override FEE = PancakeSwapV3FeeAmount + override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x4f205D69834f9B101b9289F7AFFAc9B77B3fF9b7', + [ChainId.OPTIMISM]: '0xa466ebCfa58848Feb6D8022081f1C21a884889bB', + [ChainId.ARBITRUM]: '0xf79A36F6f440392C63AD61252a64d5d3C43F860D', + [ChainId.BLAST]: '0x6510E68561F04C1d111e616750DaC2a063FF5055', + [ChainId.LINEA]: '0x46B22CD275967DDf055A567E7f36EC89eE3F1139', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.OPTIMISM]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.ARBITRUM]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + [ChainId.BLAST]: + '0x9173e4373ab542649f2f059b10eaab2181ad82cc2e70cf51cf9d9fa8a144a2af', + [ChainId.LINEA]: + '0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2', + } as const + const tickLens = { + [ChainId.BASE]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.OPTIMISM]: '0x0367a647A68f304f2A6e453c25033a4249d7F2C6', + [ChainId.ARBITRUM]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + [ChainId.BLAST]: '0x039e87AB90205F9d87c5b40d4B28e2Be45dA4a20', + [ChainId.LINEA]: '0x9a489505a00cE272eAa5e07Dba6491314CaE3796', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.DackieSwapV3 + } + getPoolProviderName(): string { + return 'DackieSwapV3' + } + override async ensureFeeAndTicks(): Promise { + const feeList = [ + this.FEE.LOWEST, + this.FEE.LOW, + this.FEE.MEDIUM, + this.FEE.HIGH, + ] as number[] + const factoryAddress = ( + await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: [ + { + address: this.factory[this.chainId as keyof typeof this.factory]!, + abi: [ + { + inputs: [], + name: 'factoryAddress', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'factoryAddress', + } as const, + ], + }) + )[0] + + const results = (await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: feeList.map( + (fee) => + ({ + chainId: this.chainId, + address: factoryAddress as Address, + abi: uniswapV3FactoryAbi, + functionName: 'feeAmountTickSpacing', + args: [fee], + }) as const, + ), + })) as number[] + + // fetched fee map to ticks should match correctly with hardcoded literals in the dex + return results.every( + (v, i) => + this.TICK_SPACINGS[feeList[i] as PancakeSwapV3FeeAmount] === v || + v === 0, + ) + } +} diff --git a/packages/sushi/src/router/liquidity-providers/EddyFinance.ts b/packages/sushi/src/router/liquidity-providers/EddyFinance.ts new file mode 100644 index 0000000000..6980a45f19 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/EddyFinance.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class EddyFinanceProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ZETACHAIN]: '0x9fd96203f7b22bCF72d9DCb40ff98302376cE09c', + } as const + const initCodeHash = { + [ChainId.ZETACHAIN]: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.EddyFinance + } + getPoolProviderName(): string { + return 'EddyFinance' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Fenix.ts b/packages/sushi/src/router/liquidity-providers/Fenix.ts new file mode 100644 index 0000000000..6d48a67a70 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Fenix.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class FenixProvider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x7a44CD060afC1B6F4c80A2B9b37f4473E74E25Df', + } as const + const poolDeployer = { + [ChainId.BLAST]: '0x5aCCAc55f692Ae2F065CEdDF5924C8f6B53cDaa8', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xf45e886a0794c1d80aeae5ab5befecd4f0f2b77c0cf627f7c46ec92dc1fa00e4', + } as const + const tickLens = { + [ChainId.BLAST]: '0x098cB852107a0b4508664C09917c00dcb0745aa9', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.Fenix + } + getPoolProviderName(): string { + return 'Fenix' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/GlyphV4.ts b/packages/sushi/src/router/liquidity-providers/GlyphV4.ts new file mode 100644 index 0000000000..a829fda974 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/GlyphV4.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class GlyphV4Provider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x74EfE55beA4988e7D92D03EFd8ddB8BF8b7bD597', + } as const + const poolDeployer = { + [ChainId.BLAST]: '0x24196b3f35E1B8313016b9f6641D605dCf48A76a', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xf96d2474815c32e070cd63233f06af5413efc5dcb430aee4ff18cc29007c562d', + } as const + const tickLens = { + [ChainId.BLAST]: '0x433cef5888C701831360686e54668376330cED6D', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.GlyphV4 + } + getPoolProviderName(): string { + return 'GlyphV4' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Horizon.ts b/packages/sushi/src/router/liquidity-providers/Horizon.ts new file mode 100644 index 0000000000..98558d02e2 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Horizon.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class HorizonProvider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.LINEA]: '0xec4f2937e57a6F39087187816eCc83191E6dB1aB', + } as const + const poolDeployer = { + [ChainId.LINEA]: '0xA76990a229961280200165c4e08c96Ea67304C3e', + } as const + const initCodeHash = { + [ChainId.LINEA]: + '0xf96d2474815c32e070cd63233f06af5413efc5dcb430aee4ff18cc29007c562d', + } as const + const tickLens = { + [ChainId.LINEA]: '0x8A3E7cc11E7B9A530b167cE4E0B921bD2610A888', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.Horizon + } + getPoolProviderName(): string { + return 'Horizon' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/KimV4.ts b/packages/sushi/src/router/liquidity-providers/KimV4.ts new file mode 100644 index 0000000000..829fa56af6 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/KimV4.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class KimV4Provider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x2F0d41f94d5D1550b79A83D2fe85C82d68c5a3ca', + } as const + const poolDeployer = { + [ChainId.BASE]: '0x872f5746B3D8CC46A876cBa2269813733A56eB1D', + } as const + const initCodeHash = { + [ChainId.BASE]: + '0xf96d2474815c32e070cd63233f06af5413efc5dcb430aee4ff18cc29007c562d', + } as const + const tickLens = { + [ChainId.BASE]: '0x44a6d9741cDF9C955eE89C14C739FB1aeaD82d6B', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.KimV4 + } + getPoolProviderName(): string { + return 'KimV4' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Kwikswap.ts b/packages/sushi/src/router/liquidity-providers/Kwikswap.ts new file mode 100644 index 0000000000..47b7372fe8 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Kwikswap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class KwikswapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0xdD9EFCbDf9f422e2fc159eFe77aDD3730d48056d', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0xbc919ae6f6f95dca1e223fc957286afa1da81529418e9f187db8a0b2d2e963bc', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.Kwikswap + } + getPoolProviderName(): string { + return 'Kwikswap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 77c31da08f..b8806439d0 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -31,6 +31,7 @@ export enum LiquidityProviders { Wagmi = 'Wagmi', LaserSwap = 'LaserSwap', BaseSwap = 'BaseSwap', + BaseSwapV3 = 'BaseSwapV3', AlgebraIntegral = 'AlgebraIntegral', Solarbeam = 'Solarbeam', Swapsicle = 'Swapsicle', @@ -56,6 +57,32 @@ export enum LiquidityProviders { SparkDexV3 = 'SparkDexV3', SparkDexV3_1 = 'SparkDexV3_1', GravityFinance = 'GravityFinance', + DackieSwapV2 = 'DackieSwapV2', + DackieSwapV3 = 'DackieSwapV3', + Pangolin = 'Pangolin', + AlienBaseV2 = 'AlienBaseV2', + AlienBaseV3 = 'AlienBaseV3', + KimV4 = 'KimV4', + RingExchangeV2 = 'RingExchangeV2', + RingExchangeV3 = 'RingExchangeV3', + BladeSwap = 'BladeSwap', + Fenix = 'Fenix', + BakerySwap = 'BakerySwap', + SquadSwapV2 = 'SquadSwapV2', + BSCSwap = 'BSCSwap', + COREx = 'COREx', + GlyphV4 = 'GlyphV4', + Kwikswap = 'Kwikswap', + ShibaSwap = 'ShibaSwap', + CroDefiSwap = 'CroDefiSwap', + NineInch = 'NineInch', + Wigoswap = 'Wigoswap', + ZebraV2 = 'ZebraV2', + Scribe = 'Scribe', + Horizon = 'Horizon', + EddyFinance = 'EddyFinance', + MMFinance = 'MMFinance', + VVSFlawless = 'VVSFlawless', } export abstract class LiquidityProvider { @@ -167,6 +194,20 @@ export const UniV2LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.SparkDexV2, LiquidityProviders.MSwap, LiquidityProviders.GravityFinance, + LiquidityProviders.DackieSwapV2, + LiquidityProviders.Pangolin, + LiquidityProviders.AlienBaseV2, + LiquidityProviders.RingExchangeV2, + LiquidityProviders.BakerySwap, + LiquidityProviders.SquadSwapV2, + LiquidityProviders.BSCSwap, + LiquidityProviders.Kwikswap, + LiquidityProviders.ShibaSwap, + LiquidityProviders.CroDefiSwap, + LiquidityProviders.NineInch, + LiquidityProviders.Wigoswap, + LiquidityProviders.EddyFinance, + LiquidityProviders.MMFinance, ] export const UniV3LiquidityProviders: LiquidityProviders[] = [ @@ -183,4 +224,16 @@ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.LynexV2, LiquidityProviders.SparkDexV3, LiquidityProviders.SparkDexV3_1, + LiquidityProviders.DackieSwapV3, + LiquidityProviders.AlienBaseV3, + LiquidityProviders.KimV4, + LiquidityProviders.RingExchangeV3, + LiquidityProviders.BladeSwap, + LiquidityProviders.Fenix, + LiquidityProviders.COREx, + LiquidityProviders.GlyphV4, + LiquidityProviders.ZebraV2, + LiquidityProviders.Scribe, + LiquidityProviders.Horizon, + LiquidityProviders.VVSFlawless, ] diff --git a/packages/sushi/src/router/liquidity-providers/MMFinance.ts b/packages/sushi/src/router/liquidity-providers/MMFinance.ts new file mode 100644 index 0000000000..7cace97e8c --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/MMFinance.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class MMFinanceProvider extends UniswapV2BaseProvider { + override fee = 0.0017 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.CRONOS]: '0xd590cC180601AEcD6eeADD9B7f2B7611519544f4', + } as const + const initCodeHash = { + [ChainId.CRONOS]: + '0x7ae6954210575e79ea2402d23bc6a59c4146a6e6296118aa8b99c747afec8acf', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.MMFinance + } + getPoolProviderName(): string { + return 'MMFinance' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/NineInch.ts b/packages/sushi/src/router/liquidity-providers/NineInch.ts new file mode 100644 index 0000000000..67e24f78e0 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/NineInch.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class NineInchProvider extends UniswapV2BaseProvider { + override fee = 0.0029 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0xcBAE5C3f8259181EB7E2309BC4c72fDF02dD56D8', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0xd2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.NineInch + } + getPoolProviderName(): string { + return 'NineInch' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Pangolin.ts b/packages/sushi/src/router/liquidity-providers/Pangolin.ts new file mode 100644 index 0000000000..71f509b6e1 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Pangolin.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class PangolinProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.AVALANCHE]: '0xefa94DE7a4656D787667C749f7E1223D71E9FD88', + } as const + const initCodeHash = { + [ChainId.AVALANCHE]: + '0x40231f6b438bce0797c9ada29b718a87ea0a5cea3fe9a771abdd76bd41a3e545', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.Pangolin + } + getPoolProviderName(): string { + return 'Pangolin' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts b/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts new file mode 100644 index 0000000000..774cadc231 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class RingExchangeV2Provider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x24F5Ac9A706De0cF795A8193F6AB3966B14ECfE6', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0x501ce753061ab6e75837b15f074633bb775f5972f8dc1112fcc829c2e88dc689', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.RingExchangeV2 + } + getPoolProviderName(): string { + return 'RingExchangeV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts b/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts new file mode 100644 index 0000000000..826d7ac54c --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts @@ -0,0 +1,26 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +export class RingExchangeV3Provider extends UniswapV3BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BLAST]: '0x890509Fab3dD11D4Ff57d8471b5eAC74687E4C75', + } as const + const initCodeHash = { + [ChainId.BLAST]: + '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54', + } as const + const tickLens = { + [ChainId.BLAST]: '0x160958266EA8fe90D3be91474BaF633eebaD17a0', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.RingExchangeV3 + } + getPoolProviderName(): string { + return 'RingExchangeV3' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Scribe.ts b/packages/sushi/src/router/liquidity-providers/Scribe.ts new file mode 100644 index 0000000000..085738cafe --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Scribe.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class ScribeProvider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.SCROLL]: '0xDc62aCDF75cc7EA4D93C69B2866d9642E79d5e2e', + } as const + const poolDeployer = { + [ChainId.SCROLL]: '0xbAE27269D777D6fc0AefFa9DfAbA8960291E51eB', + } as const + const initCodeHash = { + [ChainId.SCROLL]: + '0x4b9e4a8044ce5695e06fce9421a63b6f5c3db8a561eebb30ea4c775469e36eaf', + } as const + const tickLens = { + [ChainId.SCROLL]: '0xECd0DD811B55f5b7e20e7999f1e986Ba7d7df901', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.Scribe + } + getPoolProviderName(): string { + return 'Scribe' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts b/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts new file mode 100644 index 0000000000..25b04d677c --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class ShibaSwapProvider extends UniswapV2BaseProvider { + override fee = 0.003 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.ETHEREUM]: '0x115934131916C8b277DD010Ee02de363c09d037c', + } as const + const initCodeHash = { + [ChainId.ETHEREUM]: + '0x65d1a3b1e46c6e4f1be1ad5f99ef14dc488ae0549dc97db9b30afe2241ce1c7a', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.ShibaSwap + } + getPoolProviderName(): string { + return 'ShibaSwap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts index e8c179bf04..d924acc535 100644 --- a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts +++ b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts @@ -7,13 +7,13 @@ export class SolarbeamProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.MOONRIVER]: '0x049581aEB6Fe262727f290165C29BDAB065a1B68', - // [ChainId.MOONBEAM]: '0x19B85ae92947E0725d5265fFB3389e7E4F191FDa', + [ChainId.MOONBEAM]: '0x19B85ae92947E0725d5265fFB3389e7E4F191FDa', } as const const initCodeHash = { [ChainId.MOONRIVER]: '0x9a100ded5f254443fbd264cb7e87831e398a8b642e061670a9bc35ba27293dbf', - // [ChainId.MOONBEAM]: - // '0x36b89359c46a8b622814170939bcaa0d3c05c32c3ad83cac4d4217e1a0edf5fa', + [ChainId.MOONBEAM]: + '0xe21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f', } as const super(chainId, web3Client, factory, initCodeHash) } diff --git a/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts b/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts new file mode 100644 index 0000000000..68a027f49e --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class SquadSwapV2Provider extends UniswapV2BaseProvider { + override fee = 0.002 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BSC]: '0x1D9F43a6195054313ac1aE423B1f810f593b6ac1', + } as const + const initCodeHash = { + [ChainId.BSC]: + '0xd424455c1204e4f46a4a380651928652376a351698d3d97e2da05d3041c15fbe', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.SquadSwapV2 + } + getPoolProviderName(): string { + return 'SquadSwapV2' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Swapsicle.ts b/packages/sushi/src/router/liquidity-providers/Swapsicle.ts new file mode 100644 index 0000000000..61dce9b6c9 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Swapsicle.ts @@ -0,0 +1,29 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { LiquidityProviders } from './LiquidityProvider.js' + +export class SwapsicleProvider extends AlgebraV1BaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.SCROLL]: '0xA09BAbf9A48003ae9b9333966a8Bda94d820D0d9', + } as const + const poolDeployer = { + [ChainId.SCROLL]: '0x061e47Ab9f31D293172efb88674782f80eCa88de', + } as const + const initCodeHash = { + [ChainId.SCROLL]: + '0x177d5fbf994f4d130c008797563306f1a168dc689f81b2fa23b4396931014d91', + } as const + const tickLens = { + [ChainId.SCROLL]: '0x9dE2dEA5c68898eb4cb2DeaFf357DFB26255a4aa', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) + } + getType(): LiquidityProviders { + return LiquidityProviders.Swapsicle + } + getPoolProviderName(): string { + return 'Swapsicle' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 49fb2c80ba..ddd02d2427 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -485,18 +485,15 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { + const fees = Object.values(this.FEE) + const feeList = fees.splice(fees.length / 2) as number[] const currencyCombinations = getCurrencyCombinations(this.chainId, t1, t2) const allCurrencyCombinationsWithAllFees: [Type, Type, number][] = currencyCombinations.reduce<[Currency, Currency, number][]>( (list, [tokenA, tokenB]) => { if (tokenA !== undefined && tokenB !== undefined) { - return list.concat([ - [tokenA, tokenB, this.FEE.LOWEST], - [tokenA, tokenB, this.FEE.LOW], - [tokenA, tokenB, this.FEE.MEDIUM], - [tokenA, tokenB, this.FEE.HIGH], - ]) + return list.concat(feeList.map((fee) => [tokenA, tokenB, fee])) } return [] }, @@ -573,12 +570,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } async ensureFeeAndTicks(): Promise { - const feeList = [ - this.FEE.LOWEST, - this.FEE.LOW, - this.FEE.MEDIUM, - this.FEE.HIGH, - ] as number[] + const fees = Object.values(this.FEE) + const feeList = fees.splice(fees.length / 2) as number[] const results = (await this.client.multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, diff --git a/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts new file mode 100644 index 0000000000..ba775b03c4 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts @@ -0,0 +1,113 @@ +import { Address, PublicClient } from 'viem' +import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' +import { ChainId } from '../../chain/index.js' +import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +/** + * The default factory enabled fee amounts, denominated in hundredths of bips. + */ +export enum VVSFlawlessFeeAmount { + /** 0.01% */ + LOWEST = 100, + /** 0.05% */ + LOW = 500, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +export const VVS_FLAWLESS_FEE_SPACING_MAP: Record< + VVSFlawlessFeeAmount, + number +> = { + [VVSFlawlessFeeAmount.LOWEST]: 1, + [VVSFlawlessFeeAmount.LOW]: 10, + [VVSFlawlessFeeAmount.MEDIUM]: 60, + [VVSFlawlessFeeAmount.HIGH]: 200, +} + +export class VVSFlawlessProvider extends UniswapV3BaseProvider { + override FEE = VVSFlawlessFeeAmount + override TICK_SPACINGS = VVS_FLAWLESS_FEE_SPACING_MAP + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.CRONOS]: '0x6757E8E1B694e60285D733D8684eF2F60b2407ff', + } as const + const initCodeHash = { + [ChainId.CRONOS]: + '0x3ea5f55d6524ce396b6eb0054ae36a854425f2ed4c48b04b78e228656dc0b7de', + } as const + const tickLens = { + [ChainId.CRONOS]: '0xFe2b370F14Efe064Ae6ef17f44EB3F72594F2939', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.VVSFlawless + } + getPoolProviderName(): string { + return 'VVSFlawless' + } + + override async ensureFeeAndTicks(): Promise { + const feeList = [ + this.FEE.LOWEST, + this.FEE.LOW, + this.FEE.MEDIUM, + this.FEE.HIGH, + ] as number[] + const factoryAddress = ( + await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: [ + { + address: this.factory[this.chainId as keyof typeof this.factory]!, + abi: [ + { + inputs: [], + name: 'factory', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'factory', + } as const, + ], + }) + )[0] + + const results = (await this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: false, + contracts: feeList.map( + (fee) => + ({ + chainId: this.chainId, + address: factoryAddress as Address, + abi: uniswapV3FactoryAbi, + functionName: 'feeAmountTickSpacing', + args: [fee], + }) as const, + ), + })) as number[] + + // fetched fee map to ticks should match correctly with hardcoded literals in the dex + return results.every( + (v, i) => + this.TICK_SPACINGS[feeList[i] as SushiSwapV3FeeAmount] === v || v === 0, + ) + } +} diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts index 4c6b5f846c..a015c1570b 100644 --- a/packages/sushi/src/router/liquidity-providers/Wagmi.ts +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -31,6 +31,14 @@ export class WagmiProvider extends UniswapV3BaseProvider { [ChainId.KAVA]: '0x0e0Ce4D450c705F8a0B6Dd9d5123e3df2787D16B', [ChainId.ZKSYNC_ERA]: '0x31be61CE896e8770B21e7A1CAFA28402Dd701995', [ChainId.METIS]: '0x8112E18a34b63964388a3B2984037d6a2EFE5B8A', + [ChainId.BASE]: '0x576A1301B42942537d38FB147895fE83fB418fD4', + + // these chains dont have any pools deployed yet + // [ChainId.OPTIMISM]: '0xC49c177736107fD8351ed6564136B9ADbE5B1eC3', + // [ChainId.BSC]: '0xE3Dc1A5a7aB81F1cC1895FA55034725c24a5BD0e', + // [ChainId.POLYGON]: '0x8bb1Be7acD806BF6C9766486dC4c21284a472BaC', + // [ChainId.AVALANCHE]: '0x08d6E1aE0f91423dDBD16f083ca39ccDd1D79cE8', + // [ChainId.ARBITRUM]: '0x7301350CC76D669ea384e77aF38a70C61661CA48', } as const const initCodeHash = { [ChainId.ETHEREUM]: @@ -43,6 +51,14 @@ export class WagmiProvider extends UniswapV3BaseProvider { '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', [ChainId.METIS]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + [ChainId.BASE]: + '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + + // [ChainId.OPTIMISM]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + // [ChainId.BSC]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + // [ChainId.POLYGON]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + // [ChainId.AVALANCHE]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', + // [ChainId.ARBITRUM]: '0x30146866f3a846fe3c636beb2756dbd24cf321bc52c9113c837c21f47470dfeb', } as const const tickLens = { [ChainId.ETHEREUM]: '0xb1F795776cB9DdAC6E7e162f31C7419Dd3d48297', @@ -50,6 +66,13 @@ export class WagmiProvider extends UniswapV3BaseProvider { [ChainId.KAVA]: '0xf914e1329e4588783Ee68f06B2b900adDC97f966', [ChainId.ZKSYNC_ERA]: '0x09Cbf436DE2273dAC3f0971fB905aCBe41b1CC81', [ChainId.METIS]: '0x428065998a96F82bf66A0A427A157429A6Fdd649', + [ChainId.BASE]: '0x2Dc123Ff6757fcEa46c025758E93bd8b98710cEA', + + // [ChainId.OPTIMISM]: '0xE1609682d9fA627301125C402078A8074151886d', + // [ChainId.BSC]: '0x67241f1a9471B366039bdBbc1810061A7312298f', + // [ChainId.POLYGON]: '0xA6D200ED01389b49E21D8A0018d5b81528bcFC0D', + // [ChainId.AVALANCHE]: '0x66034b71A749E655feE0005C5496D5c0949590F0', + // [ChainId.ARBITRUM]: '0x08d6E1aE0f91423dDBD16f083ca39ccDd1D79cE8', } as const super(chainId, web3Client, factory, initCodeHash, tickLens) } diff --git a/packages/sushi/src/router/liquidity-providers/Wigoswap.ts b/packages/sushi/src/router/liquidity-providers/Wigoswap.ts new file mode 100644 index 0000000000..350e54d781 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/Wigoswap.ts @@ -0,0 +1,24 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' + +export class WigoswapProvider extends UniswapV2BaseProvider { + override fee = 0.0019 + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.FANTOM]: '0xC831A5cBfb4aC2Da5ed5B194385DFD9bF5bFcBa7', + } as const + const initCodeHash = { + [ChainId.FANTOM]: + '0x55c39e9406ff3c89a193882b4752879e73c8a0ce1222fe1de34c5e8f6482d9b6', + } as const + super(chainId, web3Client, factory, initCodeHash) + } + getType(): LiquidityProviders { + return LiquidityProviders.Wigoswap + } + getPoolProviderName(): string { + return 'Wigoswap' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/ZebraV2.ts b/packages/sushi/src/router/liquidity-providers/ZebraV2.ts new file mode 100644 index 0000000000..f7d1e6d7ea --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/ZebraV2.ts @@ -0,0 +1,46 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' + +/** + * The default factory enabled fee amounts, denominated in hundredths of bips. + */ +export enum ZebraV2FeeAmount { + /** 0.05% */ + LOW = 500, + /** 0.3% */ + MEDIUM = 3000, + /** 1% */ + HIGH = 10000, +} + +export const ZEBRA_V2_FEE_SPACING_MAP: Record = { + [ZebraV2FeeAmount.LOW]: 10, + [ZebraV2FeeAmount.MEDIUM]: 60, + [ZebraV2FeeAmount.HIGH]: 200, +} + +export class ZebraV2Provider extends UniswapV3BaseProvider { + override FEE = ZebraV2FeeAmount as any + override TICK_SPACINGS = ZEBRA_V2_FEE_SPACING_MAP + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.SCROLL]: '0x96a7F53f7636c93735bf85dE416A4Ace94B56Bd9', + } as const + const initCodeHash = { + [ChainId.SCROLL]: + '0xcf0b3414328c2bd327a4f093539d0d7d82fb94f893a2965c75cb470289cb5ac7', + } as const + const tickLens = { + [ChainId.SCROLL]: '0x1Daef3F1D97CcD9ae428641B23733cF1C619AeAA', + } as const + super(chainId, web3Client, factory, initCodeHash, tickLens) + } + getType(): LiquidityProviders { + return LiquidityProviders.ZebraV2 + } + getPoolProviderName(): string { + return 'ZebraV2' + } +} From 12f5e62adfdbda699fdcbc152838b5413dadb1fa Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 1 Feb 2025 02:45:45 +0000 Subject: [PATCH 111/140] fix algebra v2 dexes --- .../liquidity-providers/AlgebraV1Base.ts | 61 ++++++------ .../liquidity-providers/AlgebraV2Base.ts | 22 +++++ .../router/liquidity-providers/BladeSwap.ts | 4 +- .../src/router/liquidity-providers/Fenix.ts | 4 +- .../src/router/liquidity-providers/GlyphV4.ts | 12 +-- .../src/router/liquidity-providers/Horizon.ts | 4 +- .../src/router/liquidity-providers/KimV4.ts | 4 +- .../src/router/liquidity-providers/Scribe.ts | 4 +- .../router/liquidity-providers/Swapsicle.ts | 12 +-- .../router/liquidity-providers/VVSFlawless.ts | 4 +- .../route-processor/test/DataFetcher.test.ts | 97 +++++++++++++++++++ 11 files changed, 175 insertions(+), 53 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index bd6958be91..c0bce08a9e 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -20,11 +20,42 @@ import { bitmapIndex, } from './UniswapV3Base.js' +export const globalStateAbi = [ + { + inputs: [], + name: 'globalState', + outputs: [ + { internalType: 'uint160', name: 'price', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'fee', type: 'uint16' }, + { + internalType: 'uint16', + name: 'timepointIndex', + type: 'uint16', + }, + { + internalType: 'uint8', + name: 'communityFeeToken0', + type: 'uint8', + }, + { + internalType: 'uint8', + name: 'communityFeeToken1', + type: 'uint8', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const + export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { override TICK_SPACINGS: Record = {} readonly BASE_FEE = 100 DEFAULT_TICK_SPACING = 1 + gloablStateAbi = globalStateAbi poolDeployer: Record = {} @@ -67,35 +98,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { ({ address: pool.address, chainId: this.chainId, - abi: [ - { - inputs: [], - name: 'globalState', - outputs: [ - { internalType: 'uint160', name: 'price', type: 'uint160' }, - { internalType: 'int24', name: 'tick', type: 'int24' }, - { internalType: 'uint16', name: 'fee', type: 'uint16' }, - { - internalType: 'uint16', - name: 'timepointIndex', - type: 'uint16', - }, - { - internalType: 'uint8', - name: 'communityFeeToken0', - type: 'uint8', - }, - { - internalType: 'uint8', - name: 'communityFeeToken1', - type: 'uint8', - }, - { internalType: 'bool', name: 'unlocked', type: 'bool' }, - ], - stateMutability: 'view', - type: 'function', - }, - ] as const, + abi: this.gloablStateAbi, functionName: 'globalState', }) as const, ), diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts new file mode 100644 index 0000000000..9662f0d4fa --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts @@ -0,0 +1,22 @@ +import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' + +export const globalStateAbi = [ + { + inputs: [], + name: 'globalState', + outputs: [ + { internalType: 'uint160', name: 'price', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'lastFee', type: 'uint16' }, + { internalType: 'uint8', name: 'pluginConfig', type: 'uint8' }, + { internalType: 'uint16', name: 'communityFee', type: 'uint16' }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const + +export abstract class AlgebraV2BaseProvider extends AlgebraV1BaseProvider { + override gloablStateAbi = globalStateAbi as any +} diff --git a/packages/sushi/src/router/liquidity-providers/BladeSwap.ts b/packages/sushi/src/router/liquidity-providers/BladeSwap.ts index a6e3a71191..ca74394365 100644 --- a/packages/sushi/src/router/liquidity-providers/BladeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BladeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class BladeSwapProvider extends AlgebraV1BaseProvider { +export class BladeSwapProvider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0xA87DbF5082Af26c9A6Ab2B854E378f704638CCa5', diff --git a/packages/sushi/src/router/liquidity-providers/Fenix.ts b/packages/sushi/src/router/liquidity-providers/Fenix.ts index 6d48a67a70..95a35dde4c 100644 --- a/packages/sushi/src/router/liquidity-providers/Fenix.ts +++ b/packages/sushi/src/router/liquidity-providers/Fenix.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class FenixProvider extends AlgebraV1BaseProvider { +export class FenixProvider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0x7a44CD060afC1B6F4c80A2B9b37f4473E74E25Df', diff --git a/packages/sushi/src/router/liquidity-providers/GlyphV4.ts b/packages/sushi/src/router/liquidity-providers/GlyphV4.ts index a829fda974..1bccb45299 100644 --- a/packages/sushi/src/router/liquidity-providers/GlyphV4.ts +++ b/packages/sushi/src/router/liquidity-providers/GlyphV4.ts @@ -1,22 +1,22 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class GlyphV4Provider extends AlgebraV1BaseProvider { +export class GlyphV4Provider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.BLAST]: '0x74EfE55beA4988e7D92D03EFd8ddB8BF8b7bD597', + [ChainId.CORE]: '0x74EfE55beA4988e7D92D03EFd8ddB8BF8b7bD597', } as const const poolDeployer = { - [ChainId.BLAST]: '0x24196b3f35E1B8313016b9f6641D605dCf48A76a', + [ChainId.CORE]: '0x24196b3f35E1B8313016b9f6641D605dCf48A76a', } as const const initCodeHash = { - [ChainId.BLAST]: + [ChainId.CORE]: '0xf96d2474815c32e070cd63233f06af5413efc5dcb430aee4ff18cc29007c562d', } as const const tickLens = { - [ChainId.BLAST]: '0x433cef5888C701831360686e54668376330cED6D', + [ChainId.CORE]: '0x433cef5888C701831360686e54668376330cED6D', } as const super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) } diff --git a/packages/sushi/src/router/liquidity-providers/Horizon.ts b/packages/sushi/src/router/liquidity-providers/Horizon.ts index 98558d02e2..03d0541e29 100644 --- a/packages/sushi/src/router/liquidity-providers/Horizon.ts +++ b/packages/sushi/src/router/liquidity-providers/Horizon.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class HorizonProvider extends AlgebraV1BaseProvider { +export class HorizonProvider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.LINEA]: '0xec4f2937e57a6F39087187816eCc83191E6dB1aB', diff --git a/packages/sushi/src/router/liquidity-providers/KimV4.ts b/packages/sushi/src/router/liquidity-providers/KimV4.ts index 829fa56af6..8d606eee12 100644 --- a/packages/sushi/src/router/liquidity-providers/KimV4.ts +++ b/packages/sushi/src/router/liquidity-providers/KimV4.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class KimV4Provider extends AlgebraV1BaseProvider { +export class KimV4Provider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BASE]: '0x2F0d41f94d5D1550b79A83D2fe85C82d68c5a3ca', diff --git a/packages/sushi/src/router/liquidity-providers/Scribe.ts b/packages/sushi/src/router/liquidity-providers/Scribe.ts index 085738cafe..a6d39d164e 100644 --- a/packages/sushi/src/router/liquidity-providers/Scribe.ts +++ b/packages/sushi/src/router/liquidity-providers/Scribe.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class ScribeProvider extends AlgebraV1BaseProvider { +export class ScribeProvider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.SCROLL]: '0xDc62aCDF75cc7EA4D93C69B2866d9642E79d5e2e', diff --git a/packages/sushi/src/router/liquidity-providers/Swapsicle.ts b/packages/sushi/src/router/liquidity-providers/Swapsicle.ts index 61dce9b6c9..eec7d0f4eb 100644 --- a/packages/sushi/src/router/liquidity-providers/Swapsicle.ts +++ b/packages/sushi/src/router/liquidity-providers/Swapsicle.ts @@ -1,22 +1,22 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV2BaseProvider } from './AlgebraV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SwapsicleProvider extends AlgebraV1BaseProvider { +export class SwapsicleProvider extends AlgebraV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { - [ChainId.SCROLL]: '0xA09BAbf9A48003ae9b9333966a8Bda94d820D0d9', + [ChainId.TELOS]: '0xA09BAbf9A48003ae9b9333966a8Bda94d820D0d9', } as const const poolDeployer = { - [ChainId.SCROLL]: '0x061e47Ab9f31D293172efb88674782f80eCa88de', + [ChainId.TELOS]: '0x061e47Ab9f31D293172efb88674782f80eCa88de', } as const const initCodeHash = { - [ChainId.SCROLL]: + [ChainId.TELOS]: '0x177d5fbf994f4d130c008797563306f1a168dc689f81b2fa23b4396931014d91', } as const const tickLens = { - [ChainId.SCROLL]: '0x9dE2dEA5c68898eb4cb2DeaFf357DFB26255a4aa', + [ChainId.TELOS]: '0x9dE2dEA5c68898eb4cb2DeaFf357DFB26255a4aa', } as const super(chainId, web3Client, factory, initCodeHash, tickLens, poolDeployer) } diff --git a/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts index ba775b03c4..e1a2858e61 100644 --- a/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts +++ b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts @@ -70,7 +70,7 @@ export class VVSFlawlessProvider extends UniswapV3BaseProvider { abi: [ { inputs: [], - name: 'factory', + name: 'factoryAddress', outputs: [ { internalType: 'address', @@ -82,7 +82,7 @@ export class VVSFlawlessProvider extends UniswapV3BaseProvider { type: 'function', }, ], - functionName: 'factory', + functionName: 'factoryAddress', } as const, ], }) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index f177fc6234..24b6b5e129 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -213,6 +213,66 @@ async function runTest() { ) } + // only for kimv4 on base + if (chainId === ChainId.BASE) { + const token = new Token({ + chainId: ChainId.BASE, + address: '0x5dC25aA049837B696d1dc0F966aC8DF1491f819B', + decimals: 18, + symbol: 'KIM', + }) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + token, + WNATIVE[chainId as keyof typeof WNATIVE], + 'KIM', + 'WETH', + ), + ) + + foundRouteReports.push( + findRoute( + dataFetcher, + token, + WNATIVE[chainId as keyof typeof WNATIVE], + chainId, + [LiquidityProviders.KimV4], + ), + ) + } + + // only for horizon on linea + if (chainId === ChainId.LINEA) { + const token = new Token({ + chainId: ChainId.LINEA, + address: '0x7d43AABC515C356145049227CeE54B608342c0ad', + decimals: 18, + symbol: 'BUSD', + }) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + token, + WNATIVE[chainId as keyof typeof WNATIVE], + 'BUSD', + 'WETH', + ), + ) + + foundRouteReports.push( + findRoute( + dataFetcher, + token, + WNATIVE[chainId as keyof typeof WNATIVE], + chainId, + [LiquidityProviders.Horizon], + ), + ) + } + // only for Dfyn and JetSwap on fantom chain if ( chainId === ChainId.FANTOM && @@ -263,6 +323,43 @@ async function runTest() { ) } + // only for Blast chain + if ( + chainId === ChainId.BLAST && + reportMissingDexes(allFoundPools).hasMissingDex + ) { + const token0 = new Token({ + chainId: ChainId.BLAST, + address: '0x18755D2ceC785aB87680Edb8e117615E4B005430', + decimals: 18, + symbol: 'fwRING', + }) + const token1 = new Token({ + chainId: ChainId.BLAST, + address: '0x66714DB8F3397c767d0A602458B5b4E3C0FE7dd1', + decimals: 18, + symbol: 'fwWETH', + }) + allFoundPools.push( + await testDF( + chName, + dataFetcher, + token0, + token1, + 'fwRING', + 'fwWETH', + ), + ) + foundRouteReports.push( + findRoute( + dataFetcher, + token0, + token1, + chainId, + ), + ) + } + // only for Moonbeam chain if ( chainId === ChainId.MOONBEAM && From 3b1fa2827849ee9e9e25086d32e63d588a66440b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 1 Feb 2025 02:49:11 +0000 Subject: [PATCH 112/140] Update DataFetcher.test.ts --- protocols/route-processor/test/DataFetcher.test.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 24b6b5e129..3863a2ce84 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -351,12 +351,7 @@ async function runTest() { ), ) foundRouteReports.push( - findRoute( - dataFetcher, - token0, - token1, - chainId, - ), + findRoute(dataFetcher, token0, token1, chainId), ) } From 51bd633fd8df6b4563f3d33668f2932d57216990 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 1 Feb 2025 05:01:10 +0000 Subject: [PATCH 113/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 3863a2ce84..ff7839dd41 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -180,32 +180,25 @@ async function runTest() { // only for pancakev3 with 0.2.5% fee pool pair if (chainId === ChainId.BSC) { - const token = new Token({ - chainId: ChainId.BSC, - address: '0x4BE35Ec329343d7d9F548d42B0F8c17FFfe07db4', - decimals: 18, - symbol: 'USDT.z', - }) allFoundPools.push( await testDF( chName, dataFetcher, - token, + WNATIVE[chainId], USDT[chainId as keyof typeof USDT], - 'USDT.z', + 'WNATIVE', 'USDT', ), ) const pcMap = dataFetcher.getCurrentPoolCodeMap( - token, + WNATIVE[chainId], USDT[chainId as keyof typeof USDT], ) - assert.ok(!!pcMap.get('0xB30b2030b2F950401aBCD69763e9D0F81958d72d')) - + assert.ok(!!pcMap.get('0x1401ff943D08a7E098328C1d3a9d388923B115D2')) foundRouteReports.push( findRoute( dataFetcher, - token, + WNATIVE[chainId], USDT[chainId as keyof typeof USDT], chainId, [LiquidityProviders.PancakeSwapV3], From be72205d200a68f4b18b7a1e7804b418114b90a1 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 7 Feb 2025 02:54:26 +0000 Subject: [PATCH 114/140] init --- packages/sushi/src/router/data-fetcher.ts | 4 + .../AerodromeSlipstream.ts | 35 ++ .../liquidity-providers/LiquidityProvider.ts | 4 + .../liquidity-providers/UniswapV3Base.ts | 6 +- .../VelodromeSlipstream.ts | 35 ++ .../VelodromeSlipstreamBase.ts | 333 ++++++++++++++++++ 6 files changed, 413 insertions(+), 4 deletions(-) create mode 100644 packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts create mode 100644 packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts create mode 100644 packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 764273d996..19aa82f957 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -2,6 +2,7 @@ import { http, PublicClient, createPublicClient } from 'viem' import { ChainId, TestnetChainId } from '../chain/index.js' import { publicClientConfig } from '../config/index.js' import { Type } from '../currency/index.js' +import { AerodromeSlipstreamProvider } from './liquidity-providers/AerodromeSlipstream.js' import { AlienBaseV2Provider } from './liquidity-providers/AlienBaseV2.js' import { AlienBaseV3Provider } from './liquidity-providers/AlienBaseV3.js' import { ApeSwapProvider } from './liquidity-providers/ApeSwap.js' @@ -82,6 +83,7 @@ import { UniswapV2Provider } from './liquidity-providers/UniswapV2.js' import { UniswapV3Provider } from './liquidity-providers/UniswapV3.js' import { VVSFlawlessProvider } from './liquidity-providers/VVSFlawless.js' import { VVSStandardProvider } from './liquidity-providers/VVSStandard.js' +import { VelodromeSlipstreamProvider } from './liquidity-providers/VelodromeSlipstream.js' import { WagmiProvider } from './liquidity-providers/Wagmi.js' import { WigoswapProvider } from './liquidity-providers/Wigoswap.js' import { ZebraV2Provider } from './liquidity-providers/ZebraV2.js' @@ -183,6 +185,7 @@ export class DataFetcher { // concrete providers this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] ;[ + AerodromeSlipstreamProvider, AlienBaseV2Provider, AlienBaseV3Provider, ApeSwapProvider, @@ -254,6 +257,7 @@ export class DataFetcher { UbeSwapProvider, UniswapV2Provider, UniswapV3Provider, + VelodromeSlipstreamProvider, VVSStandardProvider, VVSFlawlessProvider, WagmiProvider, diff --git a/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts b/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts new file mode 100644 index 0000000000..476820f0fa --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts @@ -0,0 +1,35 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' + +export class AerodromeSlipstreamProvider extends VelodromeSlipstreamBaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.BASE]: '0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A', + } as const + const customSwapFeeModule = { + [ChainId.BASE]: '0xF4171B0953b52Fa55462E4d76ecA1845Db69af00', + } as const + const poolImplementation = { + [ChainId.BASE]: '0xeC8E5342B19977B4eF8892e02D8DAEcfa1315831', + } as const + const tickLens = { + [ChainId.BASE]: '0x3e1116ea5034f5d73a7b530071709d54a4109f5f', + } as const + super( + chainId, + web3Client, + factory, + tickLens, + poolImplementation, + customSwapFeeModule, + ) + } + getType(): LiquidityProviders { + return LiquidityProviders.AerodromeSlipstream + } + getPoolProviderName(): string { + return 'AerodromeSlipstream' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index b8806439d0..2600d58807 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -83,6 +83,8 @@ export enum LiquidityProviders { EddyFinance = 'EddyFinance', MMFinance = 'MMFinance', VVSFlawless = 'VVSFlawless', + AerodromeSlipstream = 'AerodromeSlipstream', + VelodromeSlipstream = 'VelodromeSlipstream', } export abstract class LiquidityProvider { @@ -236,4 +238,6 @@ export const UniV3LiquidityProviders: LiquidityProviders[] = [ LiquidityProviders.Scribe, LiquidityProviders.Horizon, LiquidityProviders.VVSFlawless, + LiquidityProviders.AerodromeSlipstream, + LiquidityProviders.VelodromeSlipstream, ] diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index ddd02d2427..041d9c6534 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -485,8 +485,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } getStaticPools(t1: Token, t2: Token): StaticPoolUniV3[] { - const fees = Object.values(this.FEE) - const feeList = fees.splice(fees.length / 2) as number[] + const feeList = Object.values(this.FEE).filter((v) => typeof v === 'number') const currencyCombinations = getCurrencyCombinations(this.chainId, t1, t2) const allCurrencyCombinationsWithAllFees: [Type, Type, number][] = @@ -570,8 +569,7 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { } async ensureFeeAndTicks(): Promise { - const fees = Object.values(this.FEE) - const feeList = fees.splice(fees.length / 2) as number[] + const feeList = Object.values(this.FEE).filter((v) => typeof v === 'number') const results = (await this.client.multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts new file mode 100644 index 0000000000..92ed77e554 --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts @@ -0,0 +1,35 @@ +import { PublicClient } from 'viem' +import { ChainId } from '../../chain/index.js' +import { LiquidityProviders } from './LiquidityProvider.js' +import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' + +export class VelodromeSlipstreamProvider extends VelodromeSlipstreamBaseProvider { + constructor(chainId: ChainId, web3Client: PublicClient) { + const factory = { + [ChainId.OPTIMISM]: '0xCc0bDDB707055e04e497aB22a59c2aF4391cd12F', + } as const + const customSwapFeeModule = { + [ChainId.OPTIMISM]: '0x7361E9079920fb75496E9764A2665d8ee5049D5f', + } as const + const poolImplementation = { + [ChainId.OPTIMISM]: '0xc28aD28853A547556780BEBF7847628501A3bCbb', + } as const + const tickLens = { + [ChainId.OPTIMISM]: '0x49C6FDCb3D5b2CecD8baff66c8e94b9B261ad925', + } as const + super( + chainId, + web3Client, + factory, + tickLens, + poolImplementation, + customSwapFeeModule, + ) + } + getType(): LiquidityProviders { + return LiquidityProviders.VelodromeSlipstream + } + getPoolProviderName(): string { + return 'VelodromeSlipstream' + } +} diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts new file mode 100644 index 0000000000..80f61834ad --- /dev/null +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts @@ -0,0 +1,333 @@ +import { + Address, + Hex, + PublicClient, + encodeAbiParameters, + getAddress, + keccak256, + parseAbi, + parseAbiParameters, +} from 'viem' +import { ChainId } from '../../chain/index.js' +import { Token } from '../../currency/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { + NUMBER_OF_SURROUNDING_TICKS, + PoolFilter, + StaticPoolUniV3, + UniswapV3BaseProvider, + V3Pool, + bitmapIndex, +} from './UniswapV3Base.js' + +export const ZERO_FEE_INDICATOR = 420 + +export interface SlipstreamPool extends StaticPoolUniV3 { + tickSpacing: number +} + +const feeAbi = [ + { + inputs: [], + name: 'fee', + outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +const slot0Abi = [ + { + inputs: [], + name: 'slot0', + outputs: [ + { internalType: 'uint160', name: 'sqrtPriceX96', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'observationIndex', type: 'uint16' }, + { + internalType: 'uint16', + name: 'observationCardinality', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinalityNext', + type: 'uint16', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const + +const SlipstreamABI = parseAbi([ + 'function tickSpacingToFee(int24) view returns (uint24)', + 'function poolImplementation() view returns (address)', + 'function tickSpacings() view returns (int24[])', + 'function swapFeeModule() view returns (address)', +]) + +export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvider { + override TICK_SPACINGS: Record = {} + didFetchTickSpacing = false + + readonly BASE_FEE = 100 + DEFAULT_TICK_SPACINGS = [1, 50, 100, 200, 2000] as const + tickSpacings: number[] = [...this.DEFAULT_TICK_SPACINGS] + + poolImplementation: Record = {} + customSwapFeeModule: Record = {} + + constructor( + chainId: ChainId, + web3Client: PublicClient, + factory: Record, + tickLens: Record, + poolImplementation: Record, + customSwapFeeModule: Record, + isTest = false, + ) { + super( + chainId, + web3Client, + factory, + { [chainId]: `0x${'0'.repeat(64)}` }, + tickLens, + isTest, + ) + this.poolImplementation = poolImplementation + this.customSwapFeeModule = customSwapFeeModule + if (!(chainId in this.poolImplementation)) { + throw new Error( + `${this.getType()} cannot be instantiated for chainid ${chainId}, no poolImplementation address`, + ) + } + if (!(chainId in this.customSwapFeeModule)) { + throw new Error( + `${this.getType()} cannot be instantiated for chainid ${chainId}, no customSwapFeeModule address`, + ) + } + } + + override async fetchPoolData( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + if (!this.didFetchTickSpacing) { + const result = await this.client + .readContract({ + address: this.factory[this.chainId as keyof typeof this.factory]!, + blockNumber: options?.blockNumber, + abi: SlipstreamABI, + functionName: 'tickSpacings', + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + if (result) this.didFetchTickSpacing = true + this.tickSpacings = (result ?? this.DEFAULT_TICK_SPACINGS) as number[] + } + + let staticPools = this.getStaticPools(t0, t1) + if (excludePools) + staticPools = staticPools.filter((p) => !excludePools.has(p.address)) + + const slot0 = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map((pool) => ({ + address: pool.address, + chainId: this.chainId, + abi: slot0Abi, + functionName: 'slot0', + })), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const poolFees = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: feeAbi, + functionName: 'fee', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const existingPools: V3Pool[] = [] + + staticPools.forEach((pool, i) => { + if (slot0 === undefined || !slot0[i]) return + const sqrtPriceX96 = slot0[i]!.result?.[0] // price + const tick = slot0[i]!.result?.[1] // tick + if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') + return + const fee = poolFees?.[i]?.result // fee + if (!fee) return + const activeTick = Math.floor(tick / pool.tickSpacing) * pool.tickSpacing + if (typeof activeTick !== 'number') return + this.TICK_SPACINGS[pool.address.toLowerCase()] = pool.tickSpacing + existingPools.push({ + ...pool, + fee, + sqrtPriceX96, + activeTick, + }) + }) + + return existingPools + } + + override getIndexes(existingPools: V3Pool[]): [number[], number[]] { + const minIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + const maxIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + return [minIndexes, maxIndexes] + } + + override handleTickBoundries( + i: number, + pool: V3Pool, + poolTicks: { + index: number + DLiquidity: bigint + }[], + minIndexes: number[], + maxIndexes: number[], + ) { + const lowerUnknownTick = + minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - + this.TICK_SPACINGS[pool.address.toLowerCase()]! + console.assert( + poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, + 'Error 236: unexpected min tick index', + ) + poolTicks.unshift({ + index: lowerUnknownTick, + DLiquidity: 0n, + }) + const upperUnknownTick = + (maxIndexes[i]! + 1) * + this.TICK_SPACINGS[pool.address.toLowerCase()]! * + 256 + console.assert( + poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, + 'Error 244: unexpected max tick index', + ) + poolTicks.push({ + index: upperUnknownTick, + DLiquidity: 0n, + }) + } + + override getStaticPools(t1: Token, t2: Token): SlipstreamPool[] { + const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) + const currencyCombinations: [Token, Token, number][] = [] + allCombinations.forEach(([currencyA, currencyB]) => { + if (currencyA && currencyB) { + const tokenA = currencyA.wrapped + const tokenB = currencyB.wrapped + if (tokenA.equals(tokenB)) return + const tokens = tokenA.sortsBefore(tokenB) + ? [tokenA, tokenB] + : [tokenB, tokenA] + currencyCombinations.push( + ...this.tickSpacings.map( + (t) => [...tokens, t] as [Token, Token, number], + ), + ) + } + }) + return currencyCombinations.map(([currencyA, currencyB, tickSpacing]) => ({ + address: this.getSlipstreamPoolAddress( + this.factory[this.chainId as keyof typeof this.factory]!, + currencyA.wrapped, + currencyB.wrapped, + tickSpacing, + ), + token0: currencyA, + token1: currencyB, + fee: this.BASE_FEE, + tickSpacing, + })) + } + + // algebra doesnt have the fee/ticks setup the same way univ3 has + override async ensureFeeAndTicks(): Promise { + return true + } + + getSlipstreamPoolAddress( + factory: Address, + tokenA: Token, + tokenB: Token, + tickSpacing: number, + ): Address { + const [token0, token1] = tokenA.sortsBefore(tokenB) + ? [tokenA, tokenB] + : [tokenB, tokenA] + const constructorArgumentsEncoded = encodeAbiParameters( + parseAbiParameters('address, address, int24'), + [token0.address, token1.address, tickSpacing], + ) + const initCode = + `0x3d602d80600a3d3981f3363d3d373d3d3d363d73${this.poolImplementation[ + this.chainId as keyof typeof this.poolImplementation + ]!.replace('0x', '')}5af43d82803e903d91602b57fd5bf3` as Hex + const initCodeHash = keccak256(initCode) + + const create2Inputs = [ + '0xff', + factory, + // salt + keccak256(constructorArgumentsEncoded), + // init code hash + initCodeHash, + ] + const sanitizedInputs = `0x${create2Inputs + .map((i) => i.slice(2)) + .join('')}` as Hex + return getAddress(`0x${keccak256(sanitizedInputs).slice(-40)}`) + } +} From ca5d6c2a9f072f95f7f1b584f5bf0eba8a67c0f5 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 7 Feb 2025 02:58:20 +0000 Subject: [PATCH 115/140] Update VelodromeSlipstreamBase.ts --- .../VelodromeSlipstreamBase.ts | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts index 80f61834ad..a2a12ab179 100644 --- a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts @@ -13,12 +13,10 @@ import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { - NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, UniswapV3BaseProvider, V3Pool, - bitmapIndex, } from './UniswapV3Base.js' export const ZERO_FEE_INDICATOR = 420 @@ -210,57 +208,6 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi return existingPools } - override getIndexes(existingPools: V3Pool[]): [number[], number[]] { - const minIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - const maxIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - return [minIndexes, maxIndexes] - } - - override handleTickBoundries( - i: number, - pool: V3Pool, - poolTicks: { - index: number - DLiquidity: bigint - }[], - minIndexes: number[], - maxIndexes: number[], - ) { - const lowerUnknownTick = - minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - - this.TICK_SPACINGS[pool.address.toLowerCase()]! - console.assert( - poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, - 'Error 236: unexpected min tick index', - ) - poolTicks.unshift({ - index: lowerUnknownTick, - DLiquidity: 0n, - }) - const upperUnknownTick = - (maxIndexes[i]! + 1) * - this.TICK_SPACINGS[pool.address.toLowerCase()]! * - 256 - console.assert( - poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, - 'Error 244: unexpected max tick index', - ) - poolTicks.push({ - index: upperUnknownTick, - DLiquidity: 0n, - }) - } - override getStaticPools(t1: Token, t2: Token): SlipstreamPool[] { const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) const currencyCombinations: [Token, Token, number][] = [] From 2514e9fc1f5d0746f7f5c343d96203da74b47987 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 25 Feb 2025 10:20:18 +0000 Subject: [PATCH 116/140] Update DataFetcher.test.ts --- .../route-processor/test/DataFetcher.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index ff7839dd41..e567cd14e5 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -164,6 +164,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); // only for quickswapv3 if (chainId === ChainId.POLYGON) { @@ -204,6 +205,7 @@ async function runTest() { [LiquidityProviders.PancakeSwapV3], ), ) + await sleep(60_000); } // only for kimv4 on base @@ -234,6 +236,7 @@ async function runTest() { [LiquidityProviders.KimV4], ), ) + await sleep(60_000); } // only for horizon on linea @@ -264,6 +267,7 @@ async function runTest() { [LiquidityProviders.Horizon], ), ) + await sleep(60_000); } // only for Dfyn and JetSwap on fantom chain @@ -289,6 +293,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } // only for Blast chain @@ -314,6 +319,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } // only for Blast chain @@ -346,6 +352,7 @@ async function runTest() { foundRouteReports.push( findRoute(dataFetcher, token0, token1, chainId), ) + await sleep(60_000); } // only for Moonbeam chain @@ -377,6 +384,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } // only for Elk dex on Moonriver since it only has 1 pool deployed which is with following pair @@ -408,6 +416,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } // shared pairs for all chains and dexes @@ -430,6 +439,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } if (reportMissingDexes(allFoundPools).hasMissingDex) { @@ -451,6 +461,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } if (reportMissingDexes(allFoundPools).hasMissingDex) { @@ -472,6 +483,7 @@ async function runTest() { chainId, ), ) + await sleep(60_000); } dataFetcher.stopDataFetching() @@ -513,4 +525,11 @@ async function runTest() { }) } +async function sleep(ms: number, msg = "") { + let _timeoutReference: string | number | NodeJS.Timeout | undefined; + return new Promise( + (resolve) => (_timeoutReference = setTimeout(() => resolve(msg), ms)), + ).finally(() => clearTimeout(_timeoutReference)); +} + runTest() From 645fc3ede523db0695125be0151682759d19fdc2 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 25 Feb 2025 11:26:09 +0000 Subject: [PATCH 117/140] fix --- .../VelodromeSlipstreamBase.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts index a2a12ab179..aff0766e47 100644 --- a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts @@ -13,6 +13,8 @@ import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { + bitmapIndex, + NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, UniswapV3BaseProvider, @@ -208,6 +210,55 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi return existingPools } + override getIndexes(existingPools: V3Pool[]): [number[], number[]] { + const minIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + const maxIndexes = existingPools.map((pool) => + bitmapIndex( + pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, + this.TICK_SPACINGS[pool.address.toLowerCase()]!, + ), + ) + return [minIndexes, maxIndexes] + } + + override handleTickBoundries( + i: number, + pool: V3Pool, + poolTicks: { + index: number + DLiquidity: bigint + }[], + minIndexes: number[], + maxIndexes: number[], + ) { + const lowerUnknownTick = + minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - + this.TICK_SPACINGS[pool.address.toLowerCase()]! + console.assert( + poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, + 'Error 236: unexpected min tick index', + ) + poolTicks.unshift({ + index: lowerUnknownTick, + DLiquidity: 0n, + }) + const upperUnknownTick = + (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 + console.assert( + poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, + 'Error 244: unexpected max tick index', + ) + poolTicks.push({ + index: upperUnknownTick, + DLiquidity: 0n, + }) + } + override getStaticPools(t1: Token, t2: Token): SlipstreamPool[] { const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) const currencyCombinations: [Token, Token, number][] = [] From d5e1ecfb3115a05df0da6cd8e6e6928559cfbead Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 25 Feb 2025 11:28:21 +0000 Subject: [PATCH 118/140] lint --- .../VelodromeSlipstreamBase.ts | 6 ++-- .../route-processor/test/DataFetcher.test.ts | 31 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts index aff0766e47..80f61834ad 100644 --- a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts @@ -13,12 +13,12 @@ import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { - bitmapIndex, NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, UniswapV3BaseProvider, V3Pool, + bitmapIndex, } from './UniswapV3Base.js' export const ZERO_FEE_INDICATOR = 420 @@ -248,7 +248,9 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi DLiquidity: 0n, }) const upperUnknownTick = - (maxIndexes[i]! + 1) * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 + (maxIndexes[i]! + 1) * + this.TICK_SPACINGS[pool.address.toLowerCase()]! * + 256 console.assert( poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, 'Error 244: unexpected max tick index', diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index e567cd14e5..bb5a3ea261 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -164,7 +164,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) // only for quickswapv3 if (chainId === ChainId.POLYGON) { @@ -205,7 +205,7 @@ async function runTest() { [LiquidityProviders.PancakeSwapV3], ), ) - await sleep(60_000); + await sleep(60_000) } // only for kimv4 on base @@ -236,7 +236,7 @@ async function runTest() { [LiquidityProviders.KimV4], ), ) - await sleep(60_000); + await sleep(60_000) } // only for horizon on linea @@ -267,7 +267,7 @@ async function runTest() { [LiquidityProviders.Horizon], ), ) - await sleep(60_000); + await sleep(60_000) } // only for Dfyn and JetSwap on fantom chain @@ -293,7 +293,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } // only for Blast chain @@ -319,7 +319,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } // only for Blast chain @@ -352,7 +352,7 @@ async function runTest() { foundRouteReports.push( findRoute(dataFetcher, token0, token1, chainId), ) - await sleep(60_000); + await sleep(60_000) } // only for Moonbeam chain @@ -384,7 +384,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } // only for Elk dex on Moonriver since it only has 1 pool deployed which is with following pair @@ -416,7 +416,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } // shared pairs for all chains and dexes @@ -439,7 +439,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } if (reportMissingDexes(allFoundPools).hasMissingDex) { @@ -461,7 +461,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } if (reportMissingDexes(allFoundPools).hasMissingDex) { @@ -483,7 +483,7 @@ async function runTest() { chainId, ), ) - await sleep(60_000); + await sleep(60_000) } dataFetcher.stopDataFetching() @@ -525,11 +525,8 @@ async function runTest() { }) } -async function sleep(ms: number, msg = "") { - let _timeoutReference: string | number | NodeJS.Timeout | undefined; - return new Promise( - (resolve) => (_timeoutReference = setTimeout(() => resolve(msg), ms)), - ).finally(() => clearTimeout(_timeoutReference)); +async function sleep(ms: number, msg = '') { + return new Promise((resolve) => setTimeout(() => resolve(msg), ms)) } runTest() From 6eb6b1c4207f66648ea4f8b39684f5a6c3634a15 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 25 Feb 2025 15:02:22 +0000 Subject: [PATCH 119/140] Update viem.ts --- packages/sushi/src/config/viem.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 983e8d8956..4cb3cc7e2b 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -670,7 +670,10 @@ export const publicClientConfig = { }, [ChainId.ETHEREUM]: { chain: mainnet as Chain, - transport: publicTransports[ChainId.ETHEREUM], + transport: fallback([ + http('https://rpc.ankr.com/eth'), + publicTransports[ChainId.ETHEREUM], // default that uses ankr rpc is now only available as paid account + ]), }, [ChainId.FANTOM]: { chain: fantom as Chain, From 084ddf15b27984f12a28aeb01c7e05b23149b9d8 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 25 Feb 2025 16:08:21 +0000 Subject: [PATCH 120/140] Update viem.ts --- packages/sushi/src/config/viem.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 4cb3cc7e2b..8510cd74fe 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -672,7 +672,7 @@ export const publicClientConfig = { chain: mainnet as Chain, transport: fallback([ http('https://rpc.ankr.com/eth'), - publicTransports[ChainId.ETHEREUM], // default that uses ankr rpc is now only available as paid account + publicTransports[ChainId.ETHEREUM], ]), }, [ChainId.FANTOM]: { @@ -760,7 +760,10 @@ export const publicClientConfig = { }, [ChainId.BASE]: { chain: base as Chain, - transport: publicTransports[ChainId.BASE], + transport: fallback([ + http('https://rpc.ankr.com/base'), + publicTransports[ChainId.BASE], + ]), }, [ChainId.SCROLL]: { chain: scroll as Chain, From 97b21836ff88807ac18f26dd0e28fb7f99957ece Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sat, 1 Mar 2025 00:20:57 +0000 Subject: [PATCH 121/140] Update rain-data-fetcher.ts --- packages/sushi/src/router/rain/rain-data-fetcher.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.ts b/packages/sushi/src/router/rain/rain-data-fetcher.ts index a54e8d669d..8907342938 100644 --- a/packages/sushi/src/router/rain/rain-data-fetcher.ts +++ b/packages/sushi/src/router/rain/rain-data-fetcher.ts @@ -222,4 +222,17 @@ export class RainDataFetcher extends DataFetcher { } }) } + + reset() { + this.providers.forEach((provider) => { + if ( + provider instanceof RainUniswapV2BaseProvider || + provider instanceof RainUniswapV3BaseProvider + ) { + provider.pools.clear() + provider.poolsByTrade.clear() + provider.nonExistentPools.clear() + } + }) + } } From ddca91d093c72b087454868aed047df17fdf2ed9 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 23 Mar 2025 14:37:57 +0000 Subject: [PATCH 122/140] init --- packages/sushi/package.json | 1 - packages/sushi/src/router/data-fetcher.ts | 2 - .../liquidity-providers/AlgebraV1Base.ts | 61 ++-- .../src/router/liquidity-providers/Camelot.ts | 59 +-- .../liquidity-providers/CurveProvider.ts | 38 +- .../src/router/liquidity-providers/LynexV1.ts | 33 +- .../src/router/liquidity-providers/Trident.ts | 233 +++++------- .../liquidity-providers/UniswapV2Base.ts | 28 +- .../liquidity-providers/UniswapV3Base.ts | 112 +----- packages/sushi/src/router/memoizer.test.ts | 62 ---- packages/sushi/src/router/memoizer.ts | 34 -- .../src/router/static-pool-fetcher/Trident.ts | 57 +-- packages/sushi/test/tines/snapshots/report | 341 ------------------ pnpm-lock.yaml | 13 - 14 files changed, 187 insertions(+), 887 deletions(-) delete mode 100644 packages/sushi/src/router/memoizer.test.ts delete mode 100644 packages/sushi/src/router/memoizer.ts diff --git a/packages/sushi/package.json b/packages/sushi/package.json index f56eda3c8b..ad65b48761 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -202,7 +202,6 @@ "date-fns": "3.3.1", "decimal.js-light": "2.5.1", "lodash.flatmap": "4.5.0", - "memoize-fs": "github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5", "numbro": "2.5.0", "seedrandom": "3.0.5", "serialijse": "0.3.0", diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 19aa82f957..0a4db1ffb6 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -98,8 +98,6 @@ export type DataFetcherOptions = { * price, etc of a certain block */ blockNumber?: bigint - /** Determines if memoizer should be used or not */ - memoize?: boolean /** Determines a timeout (in ms) for fetching pools for a token pair */ fetchPoolsTimeout?: number } diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts index c0bce08a9e..d089c570b6 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV1Base.ts @@ -10,7 +10,6 @@ import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { NUMBER_OF_SURROUNDING_TICKS, PoolFilter, @@ -87,8 +86,6 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - const multicallMemoize = await memoizer.fn(this.client.multicall) - const globalStateData = { multicallAddress: this.client.chain?.contracts?.multicall3?.address!, allowFailure: true, @@ -102,24 +99,17 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { functionName: 'globalState', }) as const, ), - } - const globalState = options?.memoize - ? await (multicallMemoize(globalStateData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(globalStateData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + } as const + const globalState = await this.client + .multicall(globalStateData) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) let poolsTickSpacing: | ( @@ -159,26 +149,17 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { functionName: 'tickSpacing', }) as const, ), - } - poolsTickSpacing = options?.memoize - ? await (multicallMemoize(tickSpacingsData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, + } as const + poolsTickSpacing = await this.client + .multicall(tickSpacingsData) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, ) - : await this.client.multicall(tickSpacingsData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return undefined + }) } catch (_error) {} const existingPools: V3Pool[] = [] diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index 48d99dc102..2c50aa02ab 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -1,7 +1,6 @@ import { Address, PublicClient, parseAbi } from 'viem' import { ChainId } from '../../chain/index.js' import { DataFetcherOptions } from '../data-fetcher.js' -import { memoizer } from '../memoizer.js' import { type PoolCode } from '../pool-codes/index.js' import { LiquidityProviders } from './LiquidityProvider.js' import { UniswapV2BaseProvider } from './UniswapV2Base.js' @@ -51,8 +50,6 @@ export class CamelotProvider extends UniswapV2BaseProvider { poolCodesToCreate: PoolCode[], options?: DataFetcherOptions, ): Promise { - const multicallMemoize = await memoizer.fn(this.client.multicall) - if (!this.FEE_INFO) { try { this.FEE_INFO = (await this.client.readContract({ @@ -98,24 +95,15 @@ export class CamelotProvider extends UniswapV2BaseProvider { functionName: 'getReserves', }) as const, ), - } - const reserves = options?.memoize - ? await (multicallMemoize(getReservesData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(getReservesData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + } as const + const reserves = await this.client.multicall(getReservesData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const stableSwapData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -141,24 +129,17 @@ export class CamelotProvider extends UniswapV2BaseProvider { functionName: 'stableSwap', }) as const, ), - } - const stableSwap: IsStableSwap = options?.memoize - ? await (multicallMemoize(stableSwapData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(stableSwapData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + } as const + const stableSwap: IsStableSwap = await this.client + .multicall(stableSwapData) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) return [reserves, stableSwap] } diff --git a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts index 4c80ac4bec..0fba00bd66 100644 --- a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts @@ -20,7 +20,6 @@ import { Native, Token, Type } from '../../currency/index.js' import { RToken, createCurvePoolsForMultipool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { CurvePoolCode } from '../pool-codes/CurvePool.js' import { PoolCode } from '../pool-codes/PoolCode.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' @@ -386,8 +385,6 @@ export class CurveProvider extends LiquidityProvider { const pools: Map = new Map() let currencyCombinations = getCurrencyCombinations(this.chainId, t0, t1) - const multicallMemoize = await memoizer.fn(this.client.multicall) - for (let i = 0; currencyCombinations.length > 0; ++i) { const calls = (CURVE_FACTORY_ADDRESSES[this.chainId] ?? []).flatMap( (factory) => @@ -403,27 +400,13 @@ export class CurveProvider extends LiquidityProvider { ] as const, })), ) - const newfoundPoolsData = { + const newFoundPools = await this.client.multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, blockNumber: options?.blockNumber, contracts: calls, - } - const newFoundPools: ( - | { - error?: undefined - result: `0x${string}` - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] = options?.memoize - ? ((await multicallMemoize(newfoundPoolsData)) as any) - : await this.client.multicall(newfoundPoolsData) + }) newFoundPools.forEach((pool, i) => { if ( @@ -454,9 +437,7 @@ export class CurveProvider extends LiquidityProvider { options?: DataFetcherOptions, ): Promise<(number[] | undefined)[]> { if (this.chainId === ChainId.ETHEREUM) { - const multicallMemoize = await memoizer.fn(this.client.multicall) - - const ratiosData = { + const ratios = await this.client.multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, @@ -493,10 +474,7 @@ export class CurveProvider extends LiquidityProvider { functionName: 'exchangeRateCurrent', }, ], - } as any - const ratios = options?.memoize - ? ((await multicallMemoize(ratiosData)) as any) - : await this.client.multicall(ratiosData) + }) return pools.map(([poolAddress]) => { // collection of freaks @@ -543,8 +521,7 @@ export class CurveProvider extends LiquidityProvider { T >['args'], ) => { - const multicallMemoize = await memoizer.fn(this.client.multicall) - const data = { + return this.client.multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', allowFailure: true, @@ -556,10 +533,7 @@ export class CurveProvider extends LiquidityProvider { functionName: functionName, args, })) as any, - } as any - return options?.memoize - ? (multicallMemoize(data) as any) - : this.client.multicall(data) + }) } // const poolContract = getContract({ // address: poolAddress as '0x${string}', diff --git a/packages/sushi/src/router/liquidity-providers/LynexV1.ts b/packages/sushi/src/router/liquidity-providers/LynexV1.ts index b9d14e40a3..6e957fe41d 100644 --- a/packages/sushi/src/router/liquidity-providers/LynexV1.ts +++ b/packages/sushi/src/router/liquidity-providers/LynexV1.ts @@ -4,7 +4,6 @@ import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { LiquidityProviders } from './LiquidityProvider.js' import { StaticPool, UniswapV2BaseProvider } from './UniswapV2Base.js' @@ -43,7 +42,6 @@ export class LynexV1Provider extends UniswapV2BaseProvider { options?: DataFetcherOptions, ): Promise { // get current fees - const multicallMemoize = await memoizer.fn(this.client.multicall) const getFeesData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -61,29 +59,20 @@ export class LynexV1Provider extends UniswapV2BaseProvider { args: [isStable], }) as const, ), - } - const fees = options?.memoize - ? await (multicallMemoize(getFeesData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(getFeesData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + } as const + const fees = await this.client.multicall(getFeesData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) // convert to % in number // returned values are represented in 1/100th of a percent // so returned value of 25 is 0.25%, ie 0.0025 in numeric value - this.STABLE_FEE = Number(fees[0]) * 0.0001 - this.VOLATILE_FEE = Number(fees[1]) * 0.0001 + this.STABLE_FEE = Number(fees?.[0]) * 0.0001 + this.VOLATILE_FEE = Number(fees?.[1]) * 0.0001 // proceed the rest as a normal univ2 based dex await this.getOnDemandPools(t0, t1, excludePools, options) diff --git a/packages/sushi/src/router/liquidity-providers/Trident.ts b/packages/sushi/src/router/liquidity-providers/Trident.ts index 267b3ecb2c..45e87dfd71 100644 --- a/packages/sushi/src/router/liquidity-providers/Trident.ts +++ b/packages/sushi/src/router/liquidity-providers/Trident.ts @@ -30,7 +30,6 @@ import { filterTopPools, mapToken, } from '../lib/api.js' -import { memoizer } from '../memoizer.js' import { BentoBridgePoolCode, BentoPoolCode, @@ -727,145 +726,109 @@ export class TridentProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall) - - const classicReservesPromiseData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: classicPoolCodesToCreate.map( - (pc) => - ({ - address: pc.pool.address as Address, - chainId: this.chainId, - abi: getReservesAbi, - functionName: 'getReserves', - }) as const, - ), - } - const classicReservePromise = options?.memoize - ? (multicallMemoize(classicReservesPromiseData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, + const classicReservePromise = this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: classicPoolCodesToCreate.map( + (pc) => + ({ + address: pc.pool.address as Address, + chainId: this.chainId, + abi: getReservesAbi, + functionName: 'getReserves', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, ) - : this.client.multicall(classicReservesPromiseData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return undefined + }) - const stableReservePromiseData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: stablePoolCodesToCreate.map( - (pc) => - ({ - address: pc.pool.address as Address, - chainId: this.chainId, - abi: getStableReservesAbi, - functionName: 'getReserves', - }) as const, - ), - } - const stableReservePromise = options?.memoize - ? (multicallMemoize(stableReservePromiseData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, + const stableReservePromise = this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: stablePoolCodesToCreate.map( + (pc) => + ({ + address: pc.pool.address as Address, + chainId: this.chainId, + abi: getStableReservesAbi, + functionName: 'getReserves', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, ) - : this.client.multicall(stableReservePromiseData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return undefined + }) - const totalsPromiseData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: bridgesToCreate.map( - (b) => - ({ - args: [b.pool.token0.address as Address], - address: this.bentoBox[this.chainId as BentoBoxChainId] as Address, - chainId: this.chainId, - abi: totalsAbi, - functionName: 'totals', - }) as const, - ), - } - const totalsPromise = options?.memoize - ? (multicallMemoize(totalsPromiseData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : this.client.multicall(totalsPromiseData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const totalsPromise = this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: bridgesToCreate.map( + (b) => + ({ + args: [b.pool.token0.address as Address], + address: this.bentoBox[ + this.chainId as BentoBoxChainId + ] as Address, + chainId: this.chainId, + abi: totalsAbi, + functionName: 'totals', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) - const balancesPromiseData = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: bridgesToCreate.map( - (b) => - ({ - args: [this.bentoBox[this.chainId as BentoBoxChainId] as Address], - address: b.pool.token0.address as Address, - chainId: this.chainId, - abi: balanceOfAbi, - functionName: 'balanceOf', - }) as const, - ), - } - const balancesPromise = options?.memoize - ? (multicallMemoize(balancesPromiseData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : this.client.multicall(balancesPromiseData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const balancesPromise = this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: bridgesToCreate.map( + (b) => + ({ + args: [this.bentoBox[this.chainId as BentoBoxChainId] as Address], + address: b.pool.token0.address as Address, + chainId: this.chainId, + abi: balanceOfAbi, + functionName: 'balanceOf', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const [classicReserves, stableReserves, totals, balances] = await Promise.all([ diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index a41c4db9f8..eb01441f18 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -17,7 +17,6 @@ import { filterTopPools, mapToken, } from '../lib/api.js' -import { memoizer } from '../memoizer.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' @@ -163,8 +162,6 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { poolCodesToCreate: PoolCode[], options?: DataFetcherOptions, ): Promise { - const multicallMemoize = await memoizer.fn(this.client.multicall) - const multicallData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -180,23 +177,14 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { }) as const, ), } - return options?.memoize - ? await (multicallMemoize(multicallData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(multicallData).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return await this.client.multicall(multicallData).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) } async getOnDemandPools( diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index 041d9c6534..0c230cc62c 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -7,7 +7,6 @@ import { computeSushiSwapV3PoolAddress } from '../../pool/index.js' import { RToken, UniV3Pool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' @@ -102,8 +101,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - const multicallMemoize = await memoizer.fn(this.client.multicall) - const slot0Data = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -154,24 +151,15 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'slot0', }) as const, ), - } - const slot0 = options?.memoize - ? await (multicallMemoize(slot0Data) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - : await this.client.multicall(slot0Data).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + } as const + const slot0 = await this.client.multicall(slot0Data).catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) const existingPools: V3Pool[] = [] @@ -256,8 +244,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { ) if (existingPools.length === 0) return - const multicallMemoize = await memoizer.fn(this.client.multicall) - const liquidityContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -282,23 +268,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'liquidity', }) as const, ), - } - const liquidityContracts: Promise< - ( - | { - error?: undefined - result: bigint - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] - > = options?.memoize - ? (multicallMemoize(liquidityContractsData) as Promise) - : this.client.multicall(liquidityContractsData) + } as const + const liquidityContracts = this.client.multicall(liquidityContractsData) const token0ContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -315,23 +286,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'balanceOf', }) as const, ), - } - const token0Contracts: Promise< - ( - | { - error: Error - result?: undefined - status: 'failure' - } - | { - error?: undefined - result: bigint - status: 'success' - } - )[] - > = options?.memoize - ? (multicallMemoize(token0ContractsData) as Promise) - : this.client.multicall(token0ContractsData) + } as const + const token0Contracts = this.client.multicall(token0ContractsData) const token1ContractsData = { multicallAddress: this.client.chain?.contracts?.multicall3 @@ -348,23 +304,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { functionName: 'balanceOf', }) as const, ), - } - const token1Contracts: Promise< - ( - | { - error?: undefined - result: bigint - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] - > = options?.memoize - ? (multicallMemoize(token1ContractsData) as Promise) - : this.client.multicall(token1ContractsData) + } as const + const token1Contracts = this.client.multicall(token1ContractsData) const [minIndexes, maxIndexes] = this.getIndexes(existingPools) @@ -394,27 +335,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { allowFailure: true, contracts: wordList, blockNumber: options?.blockNumber, - } - const ticksContracts: Promise< - ( - | { - error?: undefined - result: readonly { - tick: number - liquidityNet: bigint - liquidityGross: bigint - }[] - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] - > = options?.memoize - ? (multicallMemoize(ticksContractsData) as Promise) - : this.client.multicall(ticksContractsData) + } as const + const ticksContracts = this.client.multicall(ticksContractsData) const [liquidityResults, token0Balances, token1Balances, tickResults] = await Promise.all([ diff --git a/packages/sushi/src/router/memoizer.test.ts b/packages/sushi/src/router/memoizer.test.ts deleted file mode 100644 index 4e9d1da9f7..0000000000 --- a/packages/sushi/src/router/memoizer.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import fs from 'fs' -import memoize from 'memoize-fs' -import { describe, expect, it } from 'vitest' -import { deserialize, serialize } from './memoizer.js' - -describe('Memoizer', async () => { - it('should serialize, memoize, read from cache, deserialize', async () => { - let didHitCacheOnce = false - const testFn = (value1: any) => { - didHitCacheOnce = !didHitCacheOnce - return { - ...value1, - someOtherValue: 'some data', - } - } - const memoizer = memoize({ - cachePath: './test-cache', - serialize, - deserialize, - }) - const testMemoizer = await memoizer.fn(testFn) - - const testValue = { - bigint: 12345n, - string: 'some text', - number: 123, - bool: true, - obj: { - prop: 'some prop', - }, - } - const noCacheHitReturnedValue = await testMemoizer(testValue) - const cacheHitReturnedValue = await testMemoizer(testValue) - const expectedReturnedValue = { - bigint: 12345n, - string: 'some text', - number: 123, - bool: true, - obj: { - prop: 'some prop', - }, - someOtherValue: 'some data', - } - - expect(didHitCacheOnce).toEqual(true) - expect(noCacheHitReturnedValue).toStrictEqual(expectedReturnedValue) - expect(cacheHitReturnedValue).toStrictEqual(expectedReturnedValue) - - // read cached file content - const cacheFileContent = fs.readFileSync( - `./test-cache/${fs.readdirSync('./test-cache')[0]}`, - { encoding: 'utf-8' }, - ) - const expectedCachedContent = - '{"data":{"bigint":"12345n","string":"some text","number":123,"bool":true,"obj":{"prop":"some prop"},"someOtherValue":"some data"}}' - - expect(cacheFileContent).toEqual(expectedCachedContent) - - // remove the cached data - fs.rmSync('./test-cache', { recursive: true, force: true }) - }) -}) diff --git a/packages/sushi/src/router/memoizer.ts b/packages/sushi/src/router/memoizer.ts deleted file mode 100644 index bd0b5d8c3c..0000000000 --- a/packages/sushi/src/router/memoizer.ts +++ /dev/null @@ -1,34 +0,0 @@ -import memoize from 'memoize-fs' - -export const serialize = (val: any) => { - const circRefColl: any[] = [] - return JSON.stringify(val, (_name, value) => { - if (typeof value === 'function') { - return // ignore arguments and attributes of type function silently - } - if (typeof value === 'object' && value !== null) { - if (circRefColl.indexOf(value) !== -1) { - // circular reference has been found, discard key - return - } - // store value in collection - circRefColl.push(value) - } - if (typeof value === 'bigint') return `${value.toString()}n` - return value - }) -} - -export const deserialize = (val: string) => { - return JSON.parse(val, (_key, value) => { - if (typeof value === 'string' && /^\d+n$/.test(value)) { - return BigInt(value.slice(0, -1)) - } else return value - }).data -} - -export const memoizer = memoize({ - cachePath: './mem-cache', - serialize, - deserialize, -}) diff --git a/packages/sushi/src/router/static-pool-fetcher/Trident.ts b/packages/sushi/src/router/static-pool-fetcher/Trident.ts index 80dd95d61a..98b2471d95 100644 --- a/packages/sushi/src/router/static-pool-fetcher/Trident.ts +++ b/packages/sushi/src/router/static-pool-fetcher/Trident.ts @@ -13,7 +13,6 @@ import { import { Currency, Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' export interface TridentStaticPool { address: Address @@ -63,9 +62,7 @@ export class TridentStaticPoolFetcher { chainId as TridentChainId ] as Address) - const multicallMemoize = await memoizer.fn(client.multicall) - - const callStatePoolsCountData = { + const callStatePoolsCount = await client.multicall({ multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, blockNumber: options?.blockNumber, @@ -79,21 +76,7 @@ export class TridentStaticPoolFetcher { args: el as [Address, Address], }) as const, ), - } - const callStatePoolsCount: ( - | { - error?: undefined - result: bigint - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] = options?.memoize - ? await (multicallMemoize(callStatePoolsCountData) as Promise) - : await client.multicall(callStatePoolsCountData) + }) const callStatePoolsCountProcessed = callStatePoolsCount ?.map( @@ -125,7 +108,7 @@ export class TridentStaticPoolFetcher { .filter(([, length]) => length) .map(([i]) => [_pairsUnique[i]![0], _pairsUnique[i]![1]]) - const callStatePoolsData = { + const callStatePools = await client.multicall({ multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, blockNumber: options?.blockNumber, @@ -139,21 +122,7 @@ export class TridentStaticPoolFetcher { args, }) as const, ), - } - const callStatePools: ( - | { - error?: undefined - result: readonly `0x${string}`[] - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] = options?.memoize - ? await (multicallMemoize(callStatePoolsData) as Promise) - : await client.multicall(callStatePoolsData) + }) const pools: TridentStaticPool[] = [] callStatePools.forEach((s, i) => { @@ -170,7 +139,7 @@ export class TridentStaticPoolFetcher { const poolsAddresses = pools.map((p) => p.address) - const feesData = { + const fees = await client.multicall({ multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, blockNumber: options?.blockNumber, @@ -183,21 +152,7 @@ export class TridentStaticPoolFetcher { functionName: 'swapFee', }) as const, ), - } - const fees: ( - | { - error?: undefined - result: bigint - status: 'success' - } - | { - error: Error - result?: undefined - status: 'failure' - } - )[] = options?.memoize - ? await (multicallMemoize(feesData) as Promise) - : await client.multicall(feesData) + }) const results: TridentStaticPool[] = [] diff --git a/packages/sushi/test/tines/snapshots/report b/packages/sushi/test/tines/snapshots/report index 306557668b..6b75ab34dc 100644 --- a/packages/sushi/test/tines/snapshots/report +++ b/packages/sushi/test/tines/snapshots/report @@ -3,362 +3,21 @@ 3:"bridge-3": 11953.94 -> 11953.94 (0%) avg:0% 4:"bridge-4": 5496.94 -> 5496.94 (0%) avg:0% 5:"bridge-5-1": 4260.964 -> 4260.964 (0%) avg:0% -2:"top20-1": 1.1195509365387262e+37 -> 1.1195509365387262e+37 (0%) avg:0% 6:"bridge-5-2": 5473.94 -> 5473.94 (0%) avg:0% 7:"bridge-5-3": 5501.94 -> 5501.94 (0%) avg:0% 8:"bridge-5-5": 5528.94 -> 5528.94 (0%) avg:0% 9:"bridge-5-10": 5528.94 -> 5528.94 (0%) avg:0% 10:"bridge-5-30": 5528.94 -> 5528.94 (0%) avg:0% 11:"bridge-5-100": 5528.94 -> 5528.94 (0%) avg:0% -3:"top20-2": 96249232830474440000 -> 96249232830474440000 (0%) avg:0% -4:"top20-3": 467011582838851800000 -> 467011582838851800000 (0%) avg:0% -5:"top20-4": 14263706377454.916 -> 14263706377454.916 (0%) avg:0% 12:"bridge-5-300": 5528.94 -> 5528.94 (0%) avg:0% -6:"top20-5": 111208992328025 -> 111208992328025 (0%) avg:0% -7:"top20-6": 184056193599 -> 184056193599 (0%) avg:0% 13:"bridge-5-1000": 5528.94 -> 5528.94 (0%) avg:0% -8:"top20-7": 1.949010266471403e+21 -> 1.949010266471403e+21 (0%) avg:0% 14:"bridge-6": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 15:"bridge-7-1": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 16:"bridge-7-2": 567.9947198349995 -> 567.9947198349995 (0%) avg:0% 17:"bridge-7-3": 569.9929597799993 -> 569.9929597799993 (0%) avg:0% -9:"top20-8": 5147698251 -> 5147698251 (0%) avg:0% 18:"bridge-7-5": 577.9911997249991 -> 577.9911997249991 (0%) avg:0% 19:"bridge-7-10": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% 20:"bridge-7-30": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -10:"top20-9": 2.3146866045567974e+29 -> 2.3146866045567974e+29 (0%) avg:0% -11:"top20-10": 2.000939725061475e+25 -> 2.000939725061475e+25 (0%) avg:0% 21:"bridge-7-100": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -12:"top20-11": 0 -> 0 (0%) avg:0% 22:"bridge-7-300": 579.9911997249991 -> 579.9911997249991 (0%) avg:0% -13:"top20-12": 5.998729978399937e+23 -> 5.998729978399937e+23 (0%) avg:0% -14:"top20-13": 14.999999999999975 -> 14.999999999999975 (0%) avg:0% -15:"top20-14": 242561332730 -> 242561332730 (0%) avg:0% -16:"top20-15": 20057219983855420 -> 20057219983855420 (0%) avg:0% -17:"top20-16": 1371193183.507006 -> 1371193183.507006 (0%) avg:0% -18:"top20-17": 618784869519468900000 -> 618784869519468900000 (0%) avg:0% -19:"top20-18": 13965130914 -> 13965130914 (0%) avg:0% 23:"bridge-7-1000": 578.9911997249991 -> 578.9911997249991 (0%) avg:0% -20:"top20-19": 1719221840266011.2 -> 1719221840266011.2 (0%) avg:0% -21:"top20-20": 1.1539072915253164e+27 -> 1.1539072915253164e+27 (0%) avg:0% -22:"top20-21": 1.4857010533172297e+22 -> 1.4857010533172297e+22 (0%) avg:0% -23:"top20-22": 13216695381.96823 -> 13216695381.96823 (0%) avg:0% -24:"top20-23": 71.99999999995467 -> 71.99999999995467 (0%) avg:0% -25:"top20-24": 4.257526126994545e+23 -> 4.257526126994545e+23 (0%) avg:0% -26:"top20-25": 9.20707200216008e+22 -> 9.20707200216008e+22 (0%) avg:0% -27:"top20-26": 119377775 -> 119377775 (0%) avg:0% -28:"top20-27": 4.5396775085904846e+33 -> 4.5396775085904846e+33 (0%) avg:0% -29:"top20-28": 224764614280864 -> 224764614280864 (0%) avg:0% -30:"top20-29": 137910092016871140 -> 137910092016871140 (0%) avg:0% -31:"top20-30": 38414127759.999916 -> 38414127759.999916 (0%) avg:0% -32:"top20-31": 3.9150404497784796e+29 -> 3.9150404497784796e+29 (0%) avg:0% -33:"top20-32": 44939721212060795000 -> 44939721212060795000 (0%) avg:0% -34:"top20-33": 1.4260244914513205e+22 -> 1.4260244914513205e+22 (0%) avg:0% -35:"top20-34": 1.5495747386928312e+21 -> 1.5495747386928312e+21 (0%) avg:0% -36:"top20-35": 943239170088233300000 -> 943239170088233300000 (0%) avg:0% -37:"top20-36": 6121749117436.458 -> 6121749117436.458 (0%) avg:0% -38:"top20-37": 696747 -> 696747 (0%) avg:0% -39:"top20-38": 0 -> 0 (0%) avg:0% -40:"top20-39": 2.3426635283232224e+24 -> 2.3426635283232224e+24 (0%) avg:0% -41:"top20-40": 48254932363.26666 -> 48254932363.26666 (0%) avg:0% -42:"top20-41": 37860138974211.35 -> 37860138974211.35 (0%) avg:0% -43:"top20-42": 6.848076980412381e+22 -> 6.848076980412381e+22 (0%) avg:0% -44:"top20-43": 4320914881 -> 4320914881 (0%) avg:0% -45:"top20-44": 30713427089 -> 30713427089 (0%) avg:0% -46:"top20-45": 198661729955810 -> 198661729955810 (0%) avg:0% -47:"top20-46": 4003462547412852.5 -> 4003462547412852.5 (0%) avg:0% -48:"top20-47": 121585 -> 121585 (0%) avg:0% -49:"top20-48": 0 -> 0 (0%) avg:0% -50:"top20-49": 5.999999999999976 -> 5.999999999999976 (0%) avg:0% -51:"top20-50": 968129348392.8033 -> 968129348392.8033 (0%) avg:0% -52:"top20-51": 17468164450890598000 -> 17468164450890598000 (0%) avg:0% -53:"top20-52": 3370 -> 3370 (0%) avg:0% -54:"top20-53": 2.8669052288613494e+26 -> 2.8669052288613494e+26 (0%) avg:0% -55:"top20-54": 212397690771150670000 -> 212397690771150670000 (0%) avg:0% -56:"top20-55": 114722123950.99864 -> 114722123950.99864 (0%) avg:0% -57:"top20-56": 6237611807.9999895 -> 6237611807.9999895 (0%) avg:0% -58:"top20-57": 173 -> 173 (0%) avg:0% -59:"top20-58": 8.653786678134718e+34 -> 8.653786678134718e+34 (0%) avg:0% -60:"top20-59": 584843.9943957697 -> 584843.9943957697 (0%) avg:0% -61:"top20-60": 83746.99999922093 -> 83746.99999922093 (0%) avg:0% -62:"top20-61": 1.2108029911483686e+28 -> 1.2108029911483686e+28 (0%) avg:0% -63:"top20-62": 1.1321762736810075e+23 -> 1.1321762736810075e+23 (0%) avg:0% -64:"top20-63": 18624850720 -> 18624850720 (0%) avg:0% -65:"top20-64": 6558802213825504000 -> 6558802213825504000 (0%) avg:0% -66:"top20-65": 3006323408104.839 -> 3006323408104.839 (0%) avg:0% -67:"top20-66": 7.25699759360167e+33 -> 7.25699759360167e+33 (0%) avg:0% -68:"top20-67": 26997497976784.977 -> 26997497976784.977 (0%) avg:0% -69:"top20-68": 2.271898658800524e+29 -> 2.271898658800524e+29 (0%) avg:0% -70:"top20-69": 3320690.9992622463 -> 3320690.9992622463 (0%) avg:0% -71:"top20-70": 12137990973481046000 -> 12137990973481046000 (0%) avg:0% -72:"top20-71": 4.2988353121158716e+26 -> 4.2988353121158716e+26 (0%) avg:0% -73:"top20-72": 6.3575495792381146e+28 -> 6.3575495792381146e+28 (0%) avg:0% -74:"top20-73": 1.2313497939167126e+26 -> 1.2313497939167126e+26 (0%) avg:0% -75:"top20-74": 27707599790097 -> 27707599790097 (0%) avg:0% -76:"top20-75": 7124308 -> 7124308 (0%) avg:0% -77:"top20-76": 0 -> 0 (0%) avg:0% -78:"top20-77": 117608543724585440000 -> 117608543724585440000 (0%) avg:0% -79:"top20-78": 274576852204457 -> 274576852204457 (0%) avg:0% -80:"top20-79": 4.1679251723404575e+23 -> 4.1679251723404575e+23 (0%) avg:0% -81:"top20-80": 1.169123327125618e+23 -> 1.169123327125618e+23 (0%) avg:0% -82:"top20-81": 1.256638691159724e+26 -> 1.256638691159724e+26 (0%) avg:0% -83:"top20-82": 0 -> 0 (0%) avg:0% -84:"top20-83": 2.0149283251435153e+32 -> 2.0149283251435153e+32 (0%) avg:0% -85:"top20-84": 6.510078466693012e+35 -> 6.510078466693012e+35 (0%) avg:0% -86:"top20-85": 0 -> 0 (0%) avg:0% -87:"top20-86": 541712645104171 -> 541712645104171 (0%) avg:0% -88:"top20-87": 2935458414464351700 -> 2935458414464351700 (0%) avg:0% -89:"top20-88": 1672225 -> 1672225 (0%) avg:0% -90:"top20-89": 0 -> 0 (0%) avg:0% -91:"top20-90": 0 -> 0 (0%) avg:0% -92:"top20-91": 98143784 -> 98143784 (0%) avg:0% -93:"top20-92": 8692029076033.435 -> 8692029076033.435 (0%) avg:0% -94:"top20-93": 51562257056054440 -> 51562257056054440 (0%) avg:0% -95:"top20-94": 25641964396823.965 -> 25641964396823.965 (0%) avg:0% -96:"top20-95": 526418678128563400 -> 526418678128563400 (0%) avg:0% -97:"top20-96": 42011945995000000 -> 42011945995000000 (0%) avg:0% -98:"top20-97": 0 -> 0 (0%) avg:0% -99:"top20-98": 578210769514157600 -> 578210769514157600 (0%) avg:0% -100:"top20-99": 23757288573225 -> 23757288573225 (0%) avg:0% -101:"top20-100": 3519054200.963973 -> 3519054200.963973 (0%) avg:0% -102:"top20-101": 1.2366902841804613e+26 -> 1.2366902841804613e+26 (0%) avg:0% -103:"top20-102": 3.0616038596056797e+32 -> 3.0616038596056797e+32 (0%) avg:0% -104:"top20-103": 398198791124206 -> 398198791124206 (0%) avg:0% -105:"top20-104": 3434281999000000 -> 3434281999000000 (0%) avg:0% -106:"top20-105": 436386366610963040000 -> 436386366610963040000 (0%) avg:0% -107:"top20-106": 7814 -> 7814 (0%) avg:0% -108:"top20-107": 4.387432445585929e+34 -> 4.387432445585929e+34 (0%) avg:0% -109:"top20-108": 0 -> 0 (0%) avg:0% -110:"top20-109": 0 -> 0 (0%) avg:0% -111:"top20-110": 180771390372608.16 -> 180771390372608.16 (0%) avg:0% -112:"top20-111": 1.53356324718735e+23 -> 1.53356324718735e+23 (0%) avg:0% -113:"top20-112": 0 -> 0 (0%) avg:0% -114:"top20-113": 441807728976948040000 -> 441807728976948040000 (0%) avg:0% -115:"top20-114": 5.872905678780656e+30 -> 5.872905678780656e+30 (0%) avg:0% -116:"top20-115": 1.9999999999999998 -> 1.9999999999999998 (0%) avg:0% -117:"top20-116": 0 -> 0 (0%) avg:0% -118:"top20-117": 103625.91934739704 -> 103625.91934739704 (0%) avg:0% -119:"top20-118": 3994 -> 3994 (0%) avg:0% -120:"top20-119": 5481554822 -> 5481554822 (0%) avg:0% -121:"top20-120": 2148662632935361000 -> 2148662632935361000 (0%) avg:0% -122:"top20-121": 780768139203693200000 -> 780768139203693200000 (0%) avg:0% -123:"top20-122": 0 -> 0 (0%) avg:0% -124:"top20-123": 74390557839848180 -> 74390557839848180 (0%) avg:0% -125:"top20-124": 5.2767009412144705e+23 -> 5.2767009412144705e+23 (0%) avg:0% -126:"top20-125": 12999322599.999998 -> 12999322599.999998 (0%) avg:0% -127:"top20-126": 1.166563599584172e+25 -> 1.166563599584172e+25 (0%) avg:0% -128:"top20-127": 0 -> 0 (0%) avg:0% -129:"top20-128": 2.381239814048817e+29 -> 2.381239814048817e+29 (0%) avg:0% -130:"top20-129": 1.773617547666896e+21 -> 1.773617547666896e+21 (0%) avg:0% -131:"top20-130": 1043374941775 -> 1043374941775 (0%) avg:0% -132:"top20-131": 3 -> 3 (0%) avg:0% -133:"top20-132": 3523544256 -> 3523544256 (0%) avg:0% -134:"top20-133": 30660569440069612 -> 30660569440069612 (0%) avg:0% -135:"top20-134": 0 -> 0 (0%) avg:0% -136:"top20-135": 46215289309 -> 46215289309 (0%) avg:0% -137:"top20-136": 157666012290841060 -> 157666012290841060 (0%) avg:0% -138:"top20-137": 0 -> 0 (0%) avg:0% -139:"top20-138": 94486154517 -> 94486154517 (0%) avg:0% -140:"top20-139": 5381047.578903644 -> 5381047.578903644 (0%) avg:0% -141:"top20-140": 2904868891031402 -> 2904868891031402 (0%) avg:0% -142:"top20-141": 349815735970433660000 -> 349815735970433660000 (0%) avg:0% -143:"top20-142": 1.61321284630438e+29 -> 1.61321284630438e+29 (0%) avg:0% -144:"top20-143": 0 -> 0 (0%) avg:0% -145:"top20-144": 1.8715935050611244e+27 -> 1.8715935050611244e+27 (0%) avg:0% -146:"top20-145": 2329.999987331977 -> 2329.999987331977 (0%) avg:0% -147:"top20-146": 1.5754421469670991e+28 -> 1.5754421469670991e+28 (0%) avg:0% -148:"top20-147": 2.6838048385825768e+32 -> 2.6838048385825768e+32 (0%) avg:0% -149:"top20-148": 2.7141809250137436e+32 -> 2.7141809250137436e+32 (0%) avg:0% -150:"top20-149": 17399664148369718 -> 17399664148369718 (0%) avg:0% -151:"top20-150": 0 -> 0 (0%) avg:0% -152:"top20-151": 481 -> 481 (0%) avg:0% -153:"top20-152": 0 -> 0 (0%) avg:0% -154:"top20-153": 1.3468577317796694e+32 -> 1.3468577317796694e+32 (0%) avg:0% -155:"top20-154": 7978807883992.964 -> 7978807883992.964 (0%) avg:0% -156:"top20-155": 75460.9999999988 -> 75460.9999999988 (0%) avg:0% -157:"top20-156": 1433531033857000200 -> 1433531033857000200 (0%) avg:0% -158:"top20-157": 5729885219 -> 5729885219 (0%) avg:0% -159:"top20-158": 3.5295876698920206e+21 -> 3.5295876698920206e+21 (0%) avg:0% -160:"top20-159": 2752089826200724500 -> 2752089826200724500 (0%) avg:0% -161:"top20-160": 1.3721043284746797e+27 -> 1.3721043284746797e+27 (0%) avg:0% -162:"top20-161": 2628873 -> 2628873 (0%) avg:0% -163:"top20-162": 0 -> 0 (0%) avg:0% -164:"top20-163": 7.139942836800165e+35 -> 7.139942836800165e+35 (0%) avg:0% -165:"top20-164": 588671138.9993676 -> 588671138.9993676 (0%) avg:0% -166:"top20-165": 141491517.99997458 -> 141491517.99997458 (0%) avg:0% -167:"top20-166": 9.906334905865037e+36 -> 9.906334905865037e+36 (0%) avg:0% -168:"top20-167": 6.127970056928261e+23 -> 6.127970056928261e+23 (0%) avg:0% -169:"top20-168": 0 -> 0 (0%) avg:0% -170:"top20-169": 5.563914872862701e+28 -> 5.563914872862701e+28 (0%) avg:0% -171:"top20-170": 60.99999999999998 -> 60.99999999999998 (0%) avg:0% -172:"top20-171": 4.798308643628861e+25 -> 4.798308643628861e+25 (0%) avg:0% -173:"top20-172": 1.367545112055793e+32 -> 1.367545112055793e+32 (0%) avg:0% -174:"top20-173": 0 -> 0 (0%) avg:0% -175:"top20-174": 4.993017087793419e+24 -> 4.993017087793419e+24 (0%) avg:0% -176:"top20-175": 441351853599 -> 441351853599 (0%) avg:0% -177:"top20-176": 534 -> 534 (0%) avg:0% -178:"top20-177": 485417607049678900 -> 485417607049678900 (0%) avg:0% -179:"top20-178": 0 -> 0 (0%) avg:0% -180:"top20-179": 0 -> 0 (0%) avg:0% -181:"top20-180": 1.2621789345587139e+22 -> 1.2621789345587139e+22 (0%) avg:0% -182:"top20-181": 215019508513714540000 -> 215019508513714540000 (0%) avg:0% -183:"top20-182": 1.3446105728596857e+28 -> 1.3446105728596857e+28 (0%) avg:0% -184:"top20-183": 218271833509345280 -> 218271833509345280 (0%) avg:0% -185:"top20-184": 1.3560596494961327e+36 -> 1.3560596494961327e+36 (0%) avg:0% -186:"top20-185": 2.9275096959904162e+26 -> 2.9275096959904162e+26 (0%) avg:0% -187:"top20-186": 62225098320.952 -> 62225098320.952 (0%) avg:0% -188:"top20-187": 402767 -> 402767 (0%) avg:0% -189:"top20-188": 1545581776329305 -> 1545581776329305 (0%) avg:0% -190:"top20-189": 12592573197286450000 -> 12592573197286450000 (0%) avg:0% -191:"top20-190": 4110203427990146 -> 4110203427990146 (0%) avg:0% -192:"top20-191": 30858888.999999996 -> 30858888.999999996 (0%) avg:0% -193:"top20-192": 1315512 -> 1315512 (0%) avg:0% -194:"top20-193": 0 -> 0 (0%) avg:0% -195:"top20-194": 35645518265 -> 35645518265 (0%) avg:0% -196:"top20-195": 187628800443894.75 -> 187628800443894.75 (0%) avg:0% -197:"top20-196": 61348 -> 61348 (0%) avg:0% -198:"top20-197": 195599663704564 -> 195599663704564 (0%) avg:0% -199:"top20-198": 7.150706782902594e+25 -> 7.150706782902594e+25 (0%) avg:0% -200:"top20-199": 5.948111798638225e+27 -> 5.948111798638225e+27 (0%) avg:0% -201:"m100-0": 6.771484296681975e+23 -> 6.771484296681975e+23 (0%) avg:0% -202:"m100-1": 9.840311847767955e+26 -> 9.840311847767955e+26 (0%) avg:0% -203:"m100-2": 4129386959 -> 4129386959 (0%) avg:0% -204:"m100-3": 401699286402680300000 -> 401699286402680300000 (0%) avg:0% -205:"m100-4": 0 -> 0 (0%) avg:0% -206:"m100-5": 5.527533399902125e+23 -> 5.527533399902125e+23 (0%) avg:0% -207:"m100-6": 11370204433554 -> 11370204433554 (0%) avg:0% -208:"m100-7": 134.99999999999997 -> 134.99999999999997 (0%) avg:0% -209:"m100-8": 1.4799956370270965e+30 -> 1.4799956370270965e+30 (0%) avg:0% -210:"m100-9": 9.24662083836204e+21 -> 9.24662083836204e+21 (0%) avg:0% -211:"st-0-1": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -212:"st-0-2": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -213:"st-0-4": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -214:"st-0-10": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -215:"st-0-20": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -216:"st-0-40": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -217:"st-0-100": 33.99999999999998 -> 33.99999999999998 (0%) avg:0% -218:"st-1-1": 0 -> 0 (0%) avg:0% -219:"st-1-2": 0 -> 0 (0%) avg:0% -220:"st-1-4": 0 -> 0 (0%) avg:0% -221:"st-1-10": 0 -> 0 (0%) avg:0% -222:"st-1-20": 0 -> 0 (0%) avg:0% -223:"st-1-40": 0 -> 0 (0%) avg:0% -224:"st-1-100": 0 -> 0 (0%) avg:0% -225:"st-2-1": 6258246 -> 6258246 (0%) avg:0% -226:"st-2-2": 6258246 -> 6258246 (0%) avg:0% -227:"st-2-4": 6258246 -> 6258246 (0%) avg:0% -228:"st-2-10": 6258246 -> 6258246 (0%) avg:0% -229:"st-2-20": 6258246 -> 6258246 (0%) avg:0% -230:"st-2-40": 6258246 -> 6258246 (0%) avg:0% -231:"st-2-100": 6258246 -> 6258246 (0%) avg:0% -232:"st-3-1": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -233:"st-3-2": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -234:"st-3-4": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -235:"st-3-10": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -236:"st-3-20": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -237:"st-3-40": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -238:"st-3-100": 654213972821424900000 -> 654213972821424900000 (0%) avg:0% -239:"st-4-1": 0 -> 0 (0%) avg:0% -240:"st-4-2": 0 -> 0 (0%) avg:0% -241:"st-4-4": 0 -> 0 (0%) avg:0% -242:"st-4-10": 0 -> 0 (0%) avg:0% -243:"st-4-20": 0 -> 0 (0%) avg:0% -244:"st-4-40": 0 -> 0 (0%) avg:0% -245:"st-4-100": 0 -> 0 (0%) avg:0% -246:"single20-0": 3.110433173731008e+31 -> 3.110433173731008e+31 (0%) avg:0% -247:"single20-1": 4.918763490555518e+26 -> 4.918763490555518e+26 (0%) avg:0% -248:"single20-2": 3067374209460307 -> 3067374209460307 (0%) avg:0% -249:"single20-3": 127.99999999999996 -> 127.99999999999996 (0%) avg:0% -250:"single20-4": 30781798338.99999 -> 30781798338.99999 (0%) avg:0% -251:"single20-5": 510007647749 -> 510007647749 (0%) avg:0% -252:"single20-6": 12228714.999978304 -> 12228714.999978304 (0%) avg:0% -253:"single20-7": 30137.939997182115 -> 30137.939997182115 (0%) avg:0% -254:"single20-8": 68027738516254000000 -> 68027738516254000000 (0%) avg:0% -255:"single20-9": 0 -> 0 (0%) avg:0% -256:"single20-10": 2.4010151620123693e+26 -> 2.4010151620123693e+26 (0%) avg:0% -257:"single20-12": 1.2058573329386557e+21 -> 1.2058573329386557e+21 (0%) avg:0% -258:"single20-13": 3.8499082136677565e+29 -> 3.8499082136677565e+29 (0%) avg:0% -259:"single20-14": 1.739289559046476e+32 -> 1.739289559046476e+32 (0%) avg:0% -260:"single20-15": 26.99999995404102 -> 26.99999995404102 (0%) avg:0% -261:"single20-16": 5928814 -> 5928814 (0%) avg:0% -262:"single20-17": 171116433126.98795 -> 171116433126.98795 (0%) avg:0% -263:"single20-18": 17182663994373956 -> 17182663994373956 (0%) avg:0% -264:"single20-19": 5.455075077751915e+25 -> 5.455075077751915e+25 (0%) avg:0% -265:"single20-20": 360857285427093500000 -> 360857285427093500000 (0%) avg:0% -266:"single20-21": 2.304646401405295e+22 -> 2.304646401405295e+22 (0%) avg:0% -267:"single20-22": 0 -> 0 (0%) avg:0% -268:"single20-23": 2.2994347806532058e+36 -> 2.2994347806532058e+36 (0%) avg:0% -269:"single20-24": 7.447097880265051e+21 -> 7.447097880265051e+21 (0%) avg:0% -270:"single20-25": 133922523688561480000 -> 133922523688561480000 (0%) avg:0% -271:"single20-26": 5026553 -> 5026553 (0%) avg:0% -272:"single20-27": 47.999999999999964 -> 47.999999999999964 (0%) avg:0% -273:"single20-28": 1.9205043560883324e+24 -> 1.9205043560883324e+24 (0%) avg:0% -274:"single20-29": 3.0630038173782246e+29 -> 3.0630038173782246e+29 (0%) avg:0% -275:"single20-30": 4.792771135234192e+28 -> 4.792771135234192e+28 (0%) avg:0% -276:"single20-31": 186094651774764900000 -> 186094651774764900000 (0%) avg:0% -277:"single20-32": 1394820921664611600 -> 1394820921664611600 (0%) avg:0% -278:"single20-33": 335911113542380100 -> 335911113542380100 (0%) avg:0% -279:"single20-34": 0 -> 0 (0%) avg:0% -280:"single20-35": 8712.999999999955 -> 8712.999999999955 (0%) avg:0% -281:"single20-36": 478334445511687700000 -> 478334445511687700000 (0%) avg:0% -282:"single20-37": 29922687677716180000 -> 29922687677716180000 (0%) avg:0% -283:"single20-38": 7027962904639 -> 7027962904639 (0%) avg:0% -284:"single20-39": 54349026305008 -> 54349026305008 (0%) avg:0% -285:"single20-40": 1.048115189966003e+30 -> 1.048115189966003e+30 (0%) avg:0% -286:"single20-41": 0 -> 0 (0%) avg:0% -287:"single20-42": 88269162089.67043 -> 88269162089.67043 (0%) avg:0% -288:"single20-43": 1.1062465843952062e+26 -> 1.1062465843952062e+26 (0%) avg:0% -289:"single20-44": 1.1706032304343827e+29 -> 1.1706032304343827e+29 (0%) avg:0% -290:"single20-45": 3.8665402822771385e+30 -> 3.8665402822771385e+30 (0%) avg:0% -291:"single20-46": 5006500.999999981 -> 5006500.999999981 (0%) avg:0% -292:"single20-47": 1.3400049787611494e+21 -> 1.3400049787611494e+21 (0%) avg:0% -293:"single20-48": 3.355999525511012e+29 -> 3.355999525511012e+29 (0%) avg:0% -294:"single20-49": 752555750223170400 -> 752555750223170400 (0%) avg:0% -295:"single20-50": 3116677.9999996107 -> 3116677.9999996107 (0%) avg:0% -296:"single20-51": 26920158412794640 -> 26920158412794640 (0%) avg:0% -297:"single20-52": 203746532105.99997 -> 203746532105.99997 (0%) avg:0% -298:"single20-53": 1179122601233816 -> 1179122601233816 (0%) avg:0% -299:"single20-54": 213910825414942200 -> 213910825414942200 (0%) avg:0% -300:"single20-55": 0 -> 0 (0%) avg:0% -301:"single20-56": 210.9999999874765 -> 210.9999999874765 (0%) avg:0% -302:"single20-57": 5.999999987470895 -> 5.999999987470895 (0%) avg:0% -303:"single20-58": 8934960728455735 -> 8934960728455735 (0%) avg:0% -304:"single20-59": 548961453342463 -> 548961453342463 (0%) avg:0% -305:"single20-61": 10270254270231846 -> 10270254270231846 (0%) avg:0% -306:"single20-62": 1957972021 -> 1957972021 (0%) avg:0% -307:"single20-63": 2.780081385181302e+30 -> 2.780081385181302e+30 (0%) avg:0% -308:"single20-64": 46862570178490150 -> 46862570178490150 (0%) avg:0% -309:"single20-65": 93880 -> 93880 (0%) avg:0% -310:"single20-66": 104563807639877650000 -> 104563807639877650000 (0%) avg:0% -311:"single20-67": 762618499000000 -> 762618499000000 (0%) avg:0% -312:"single20-68": 152455414826877200000 -> 152455414826877200000 (0%) avg:0% -313:"single20-69": 4587453 -> 4587453 (0%) avg:0% -314:"single20-70": 2.999999999999988 -> 2.999999999999988 (0%) avg:0% -315:"single20-71": 3.1885969249920197e+25 -> 3.1885969249920197e+25 (0%) avg:0% -316:"single20-72": 0 -> 0 (0%) avg:0% -317:"single20-73": 323670280231 -> 323670280231 (0%) avg:0% -318:"single20-74": 1106163 -> 1106163 (0%) avg:0% -319:"single20-75": 205243486119 -> 205243486119 (0%) avg:0% -320:"single20-76": 9747 -> 9747 (0%) avg:0% -321:"single20-77": 846579839 -> 846579839 (0%) avg:0% -322:"single20-78": 2.4699054876781903e+36 -> 2.4699054876781903e+36 (0%) avg:0% -323:"single20-79": 4.246671249563139e+28 -> 4.246671249563139e+28 (0%) avg:0% -324:"single20-81": 1845.5775247637528 -> 1845.5775247637528 (0%) avg:0% -325:"single20-82": 3159304 -> 3159304 (0%) avg:0% -326:"single20-83": 1968634860443 -> 1968634860443 (0%) avg:0% -327:"single20-84": 1777226861761304 -> 1777226861761304 (0%) avg:0% -328:"single20-85": 0 -> 0 (0%) avg:0% -329:"single20-86": 58719.99999999999 -> 58719.99999999999 (0%) avg:0% -330:"single20-87": 17710930 -> 17710930 (0%) avg:0% -331:"single20-88": 0 -> 0 (0%) avg:0% -332:"single20-89": 0 -> 0 (0%) avg:0% -333:"single20-90": 1244477320958906 -> 1244477320958906 (0%) avg:0% -334:"single20-91": 410123511138301.8 -> 410123511138301.8 (0%) avg:0% -335:"single20-92": 839628132306643 -> 839628132306643 (0%) avg:0% -336:"single20-93": 479724950549 -> 479724950549 (0%) avg:0% -337:"single20-94": 8942951159051322 -> 8942951159051322 (0%) avg:0% -338:"single20-95": 2.980951054274543e+21 -> 2.980951054274543e+21 (0%) avg:0% -339:"single20-96": 0 -> 0 (0%) avg:0% -340:"single20-97": 8.021659281577077e+31 -> 8.021659281577077e+31 (0%) avg:0% -341:"single20-98": 1701170936126.7368 -> 1701170936126.7368 (0%) avg:0% -342:"single20-99": 433219 -> 433219 (0%) avg:0% diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0167f28201..7fac592223 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1814,9 +1814,6 @@ importers: lodash.flatmap: specifier: 4.5.0 version: 4.5.0 - memoize-fs: - specifier: github:rouzwelt/memoize-fs#e5fcc9f6effc4ad087514372a53a49d380520ad5 - version: github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5 numbro: specifier: 2.5.0 version: 2.5.0 @@ -42494,13 +42491,3 @@ packages: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - - github.com/rouzwelt/memoize-fs/e5fcc9f6effc4ad087514372a53a49d380520ad5: - resolution: {tarball: https://codeload.github.com/rouzwelt/memoize-fs/tar.gz/e5fcc9f6effc4ad087514372a53a49d380520ad5} - name: memoize-fs - version: 3.0.0 - engines: {node: '>= 10.13.0', npm: '>= 6.0.0'} - requiresBuild: true - dependencies: - meriyah: 4.4.2 - dev: false From f03fb29ace46dcce3374b64fd87372cbb40ebbcb Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 26 Mar 2025 22:42:30 +0000 Subject: [PATCH 123/140] update rpcs --- packages/sushi/src/config/viem.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 8510cd74fe..3377c38910 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -658,7 +658,10 @@ export const publicClientConfig = { }, [ChainId.BSC]: { chain: bsc as Chain, - transport: publicTransports[ChainId.BSC], + transport: fallback([ + http('https://bsc.drpc.org'), + publicTransports[ChainId.BSC], + ]), }, [ChainId.BTTC]: { chain: bttc as Chain, @@ -671,7 +674,7 @@ export const publicClientConfig = { [ChainId.ETHEREUM]: { chain: mainnet as Chain, transport: fallback([ - http('https://rpc.ankr.com/eth'), + http('https://eth.drpc.org'), publicTransports[ChainId.ETHEREUM], ]), }, @@ -692,7 +695,11 @@ export const publicClientConfig = { }, [ChainId.HARMONY]: { chain: harmonyOne as Chain, - transport: publicTransports[ChainId.HARMONY], + transport: fallback([ + http('https://api.harmony.one'), + http('https://harmony-0.drpc.org'), + publicTransports[ChainId.HARMONY], + ]), }, [ChainId.KAVA]: { chain: kava as Chain, @@ -761,7 +768,7 @@ export const publicClientConfig = { [ChainId.BASE]: { chain: base as Chain, transport: fallback([ - http('https://rpc.ankr.com/base'), + http('https://base.drpc.org'), publicTransports[ChainId.BASE], ]), }, From ca170ab2946a564b769345bb9570fd24a8709cc4 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 6 Apr 2025 02:37:36 +0000 Subject: [PATCH 124/140] init --- .github/workflows/rain-release.yml | 56 +++++++++++ packages/sushi/package.json | 156 +++++++++++++++++------------ packages/sushi/tsconfig.esm.json | 26 +++++ packages/sushi/tsconfig.json | 3 +- 4 files changed, 174 insertions(+), 67 deletions(-) create mode 100644 .github/workflows/rain-release.yml create mode 100644 packages/sushi/tsconfig.esm.json diff --git a/.github/workflows/rain-release.yml b/.github/workflows/rain-release.yml new file mode 100644 index 0000000000..24f004c991 --- /dev/null +++ b/.github/workflows/rain-release.yml @@ -0,0 +1,56 @@ +# creates a github release with packed tarball (.tgz) for sushi pkg +name: Create GitHub Release +on: ["workflow_dispatch"] + +jobs: + release: + runs-on: ubuntu-latest + permissions: + id-token: write + contents: write + steps: + - uses: actions/checkout@v4 + with: + ssh-key: ${{ secrets.PUBLISH_PRIVATE_KEY }} + + - uses: DeterminateSystems/nix-installer-action@main + with: + determinate: true + - uses: DeterminateSystems/flakehub-cache-action@main + + - run: nix develop -c pnpm install --frozen-lockfile + - run: nix develop -c pnpm exec turbo run build --filter=./packages/sushi + + - name: Git Config + run: | + git config --global user.email "${{ secrets.CI_GIT_EMAIL }}" + git config --global user.name "${{ secrets.CI_GIT_USER }}" + + # create tag + - name: Create Tag + run: git tag sushi-${{ github.sha }} + + # Push the tag to remote + - name: Push Changes To Remote + run: git push origin sushi-${{ github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Create sushi npm package tarball + - name: Create sushi NPM Package Tarball + run: echo "NPM_PACKAGE=$(nix develop -c pnpm pack --pack-destination ../..)" >> $GITHUB_ENV + working-directory: packages/sushi + + - name: Rename sushi NPM Package Tarball + run: mv ${{ env.NPM_PACKAGE }} sushi-${{ github.sha }}.tgz + + # Create a gitHub release with tarball + - name: Create GitHub Release with sushi pkg + id: gh_release + uses: softprops/action-gh-release@v2 + with: + tag_name: sushi-${{ github.sha }} + name: Sushi NPM Package Release ${{ github.sha }} + files: sushi-${{ github.sha }}.tgz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/packages/sushi/package.json b/packages/sushi/package.json index ad65b48761..1cf88b0553 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -22,158 +22,180 @@ ], "exports": { ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + "types": "./dist/types/index.d.ts", + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js" }, "./abi": { - "types": "./dist/abi/index.d.ts", - "default": "./dist/abi/index.js" + "types": "./dist/types/abi/index.d.ts", + "require": "./dist/cjs/abi/index.js", + "import": "./dist/esm/abi/index.js" }, "./calculate": { - "types": "./dist/calculate/index.d.ts", - "default": "./dist/calculate/index.js" + "types": "./dist/types/calculate/index.d.ts", + "require": "./dist/cjs/calculate/index.js", + "import": "./dist/esm/calculate/index.js" }, "./chain": { - "types": "./dist/chain/index.d.ts", - "default": "./dist/chain/index.js" + "types": "./dist/types/chain/index.d.ts", + "require": "./dist/cjs/chain/index.js", + "import": "./dist/esm/chain/index.js" }, "./config": { - "types": "./dist/config/index.d.ts", - "default": "./dist/config/index.js" + "types": "./dist/types/config/index.d.ts", + "require": "./dist/cjs/config/index.js", + "import": "./dist/esm/config/index.js" }, "./contract": { - "types": "./dist/contract/index.d.ts", - "default": "./dist/contract/index.js" + "types": "./dist/types/contract/index.d.ts", + "require": "./dist/cjs/contract/index.js", + "import": "./dist/esm/contract/index.js" }, "./convert": { - "types": "./dist/convert/index.d.ts", - "default": "./dist/convert/index.js" + "types": "./dist/types/convert/index.d.ts", + "require": "./dist/cjs/convert/index.js", + "import": "./dist/esm/convert/index.js" }, "./currency": { - "types": "./dist/currency/index.d.ts", - "default": "./dist/currency/index.js" + "types": "./dist/types/currency/index.d.ts", + "require": "./dist/cjs/currency/index.js", + "import": "./dist/esm/currency/index.js" }, "./extractor": { - "types": "./dist/extractor/index.d.ts", - "default": "./dist/extractor/index.js" + "types": "./dist/types/extractor/index.d.ts", + "require": "./dist/cjs/extractor/index.js", + "import": "./dist/esm/extractor/index.js" }, "./dex": { - "types": "./dist/dex/index.d.ts", - "default": "./dist/dex/index.js" + "types": "./dist/types/dex/index.d.ts", + "require": "./dist/cjs/dex/index.js", + "import": "./dist/esm/dex/index.js" }, "./format": { - "types": "./dist/format/index.d.ts", - "default": "./dist/format/index.js" + "types": "./dist/types/format/index.d.ts", + "require": "./dist/cjs/format/index.js", + "import": "./dist/esm/format/index.js" }, "./log": { - "types": "./dist/log/index.d.ts", - "default": "./dist/log/index.js" + "types": "./dist/types/log/index.d.ts", + "require": "./dist/cjs/log/index.js", + "import": "./dist/esm/log/index.js" }, "./pool": { - "types": "./dist/pool/index.d.ts", - "default": "./dist/pool/index.js" + "types": "./dist/types/pool/index.d.ts", + "require": "./dist/cjs/pool/index.js", + "import": "./dist/esm/pool/index.js" }, "./router": { - "types": "./dist/router/index.d.ts", - "default": "./dist/router/index.js" + "types": "./dist/types/router/index.d.ts", + "require": "./dist/cjs/router/index.js", + "import": "./dist/esm/router/index.js" }, "./serializer": { - "types": "./dist/serializer/index.d.ts", - "default": "./dist/serializer/index.js" + "types": "./dist/types/serializer/index.d.ts", + "require": "./dist/cjs/serializer/index.js", + "import": "./dist/esm/serializer/index.js" }, "./math": { - "types": "./dist/math/index.d.ts", - "default": "./dist/math/index.js" + "types": "./dist/types/math/index.d.ts", + "require": "./dist/cjs/math/index.js", + "import": "./dist/esm/math/index.js" }, "./sort": { - "types": "./dist/sort/index.d.ts", - "default": "./dist/sort/index.js" + "types": "./dist/types/sort/index.d.ts", + "require": "./dist/cjs/sort/index.js", + "import": "./dist/esm/sort/index.js" }, "./tines": { - "types": "./dist/tines/index.d.ts", - "default": "./dist/tines/index.js" + "types": "./dist/types/tines/index.d.ts", + "require": "./dist/cjs/tines/index.js", + "import": "./dist/esm/tines/index.js" }, "./token-list": { - "types": "./dist/token-list/index.d.ts", - "default": "./dist/token-list/index.js" + "types": "./dist/types/token-list/index.d.ts", + "require": "./dist/cjs/token-list/index.js", + "import": "./dist/esm/token-list/index.js" }, "./types": { - "types": "./dist/types/index.d.ts", - "default": "./dist/types/index.js" + "types": "./dist/types/types/index.d.ts", + "require": "./dist/cjs/types/index.js", + "import": "./dist/esm/types/index.js" }, "./validate": { - "types": "./dist/validate/index.d.ts", - "default": "./dist/validate/index.js" + "types": "./dist/types/validate/index.d.ts", + "require": "./dist/cjs/validate/index.js", + "import": "./dist/esm/validate/index.js" }, "./package.json": "./package.json" }, - "main": "dist/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", "source": "src/index.ts", - "types": "dist/index.d.ts", + "types": "dist/types/index.d.ts", "typesVersions": { "*": { "abi": [ - "./dist/abi/index.d.ts" + "./dist/types/abi/index.d.ts" ], "calculate": [ - "./dist/calculate/index.d.ts" + "./dist/types/calculate/index.d.ts" ], "chain": [ - "./dist/chain/index.d.ts" + "./dist/types/chain/index.d.ts" ], "config": [ - "./dist/config/index.d.ts" + "./dist/types/config/index.d.ts" ], "contract": [ - "./dist/contract/index.d.ts" + "./dist/types/contract/index.d.ts" ], "convert": [ - "./dist/convert/index.d.ts" + "./dist/types/convert/index.d.ts" ], "currency": [ - "./dist/currency/index.d.ts" + "./dist/types/currency/index.d.ts" ], "dex": [ - "./dist/dex/index.d.ts" + "./dist/types/dex/index.d.ts" ], "extractor": [ - "./dist/extractor/index.d.ts" + "./dist/types/extractor/index.d.ts" ], "format": [ - "./dist/format/index.d.ts" + "./dist/types/format/index.d.ts" ], "gas": [ - "./dist/gas/index.d.ts" + "./dist/types/gas/index.d.ts" ], "log": [ - "./dist/log/index.d.ts" + "./dist/types/log/index.d.ts" ], "serializer": [ - "./dist/serializer/index.d.ts" + "./dist/types/serializer/index.d.ts" ], "math": [ - "./dist/math/index.d.ts" + "./dist/types/math/index.d.ts" ], "pool": [ - "./dist/pool/index.d.ts" + "./dist/types/pool/index.d.ts" ], "router": [ - "./dist/router/index.d.ts" + "./dist/types/router/index.d.ts" ], "sort": [ - "./dist/sort/index.d.ts" + "./dist/types/sort/index.d.ts" ], "tines": [ - "./dist/tines/index.d.ts" + "./dist/types/tines/index.d.ts" ], "token-list": [ - "./dist/token-list/index.d.ts" + "./dist/types/token-list/index.d.ts" ], "types": [ - "./dist/types/index.d.ts" + "./dist/types/types/index.d.ts" ], "validate": [ - "./dist/validate/index.d.ts" + "./dist/types/validate/index.d.ts" ] } }, @@ -181,7 +203,9 @@ "dist" ], "scripts": { - "build": "tsc", + "build": "npm run build-cjs && npm run build-esm", + "build-cjs": "tsc -p tsconfig.json", + "build-esm": "tsc -p tsconfig.esm.json", "check": "tsc --pretty --noEmit", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist", "dev": "tsc -w", diff --git a/packages/sushi/tsconfig.esm.json b/packages/sushi/tsconfig.esm.json new file mode 100644 index 0000000000..30264ccf40 --- /dev/null +++ b/packages/sushi/tsconfig.esm.json @@ -0,0 +1,26 @@ +{ + "extends": ["@tsconfig/strictest/tsconfig"], + "include": ["src"], + "exclude": [ + "node_modules", + "dist", + ".turbo", + "src/**/*.test.ts", + "src/**/*.test-d.ts", + "src/**/*.bench.ts" + ], + "compilerOptions": { + "target": "es2022", + "module": "ES2022", + "lib": ["ES2022", "DOM", "ES6"], + "outDir": "./dist/esm", + "rootDir": "./src", + "declaration": false, + "declarationMap": false, + "sourceMap": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "moduleResolution": "bundler" + } + } + \ No newline at end of file diff --git a/packages/sushi/tsconfig.json b/packages/sushi/tsconfig.json index fb39f028eb..317aaf9e94 100644 --- a/packages/sushi/tsconfig.json +++ b/packages/sushi/tsconfig.json @@ -10,10 +10,11 @@ "src/**/*.bench.ts" ], "compilerOptions": { - "outDir": "./dist", + "outDir": "./dist/cjs", "rootDir": "./src", "declaration": true, "declarationMap": true, + "declarationDir": "./dist/types", "sourceMap": true, "skipLibCheck": true, "resolveJsonModule": true From 85cda2875550a483c238b0064046b7198ca01d5e Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 6 Apr 2025 03:19:48 +0000 Subject: [PATCH 125/140] fix tests --- .github/workflows/rain-release.yml | 4 +- packages/sushi/package.json | 84 ++++++++++++++----- .../route-processor/test/DataFetcher.test.ts | 2 +- 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/.github/workflows/rain-release.yml b/.github/workflows/rain-release.yml index 24f004c991..6273d2ce50 100644 --- a/.github/workflows/rain-release.yml +++ b/.github/workflows/rain-release.yml @@ -38,11 +38,11 @@ jobs: # Create sushi npm package tarball - name: Create sushi NPM Package Tarball - run: echo "NPM_PACKAGE=$(nix develop -c pnpm pack --pack-destination ../..)" >> $GITHUB_ENV + run: echo "NPM_PACKAGE=$(nix develop -c pnpm pack)" >> $GITHUB_ENV working-directory: packages/sushi - name: Rename sushi NPM Package Tarball - run: mv ${{ env.NPM_PACKAGE }} sushi-${{ github.sha }}.tgz + run: mv ${{ env.NPM_PACKAGE }} ../../sushi-${{ github.sha }}.tgz # Create a gitHub release with tarball - name: Create GitHub Release with sushi pkg diff --git a/packages/sushi/package.json b/packages/sushi/package.json index 1cf88b0553..8a517bc9da 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -23,108 +23,150 @@ "exports": { ".": { "types": "./dist/types/index.d.ts", + "node": "./dist/cjs/index.js", "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js" + "import": "./dist/esm/index.js", + "default": "./dist/cjs/index.js" }, "./abi": { "types": "./dist/types/abi/index.d.ts", + "node": "./dist/cjs/abi/index.js", "require": "./dist/cjs/abi/index.js", - "import": "./dist/esm/abi/index.js" + "import": "./dist/esm/abi/index.js", + "default": "./dist/cjs/abi/index.js" }, "./calculate": { "types": "./dist/types/calculate/index.d.ts", + "node": "./dist/cjs/calculate/index.js", "require": "./dist/cjs/calculate/index.js", - "import": "./dist/esm/calculate/index.js" + "import": "./dist/esm/calculate/index.js", + "default": "./dist/cjs/calculate/index.js" }, "./chain": { "types": "./dist/types/chain/index.d.ts", + "node": "./dist/cjs/chain/index.js", "require": "./dist/cjs/chain/index.js", - "import": "./dist/esm/chain/index.js" + "import": "./dist/esm/chain/index.js", + "default": "./dist/cjs/chain/index.js" }, "./config": { "types": "./dist/types/config/index.d.ts", + "node": "./dist/cjs/config/index.js", "require": "./dist/cjs/config/index.js", - "import": "./dist/esm/config/index.js" + "import": "./dist/esm/config/index.js", + "default": "./dist/cjs/config/index.js" }, "./contract": { "types": "./dist/types/contract/index.d.ts", + "node": "./dist/cjs/contract/index.js", "require": "./dist/cjs/contract/index.js", - "import": "./dist/esm/contract/index.js" + "import": "./dist/esm/contract/index.js", + "default": "./dist/cjs/contract/index.js" }, "./convert": { "types": "./dist/types/convert/index.d.ts", + "node": "./dist/cjs/convert/index.js", "require": "./dist/cjs/convert/index.js", - "import": "./dist/esm/convert/index.js" + "import": "./dist/esm/convert/index.js", + "default": "./dist/cjs/convert/index.js" }, "./currency": { "types": "./dist/types/currency/index.d.ts", + "node": "./dist/cjs/currency/index.js", "require": "./dist/cjs/currency/index.js", - "import": "./dist/esm/currency/index.js" + "import": "./dist/esm/currency/index.js", + "default": "./dist/cjs/currency/index.js" }, "./extractor": { "types": "./dist/types/extractor/index.d.ts", + "node": "./dist/cjs/extractor/index.js", "require": "./dist/cjs/extractor/index.js", - "import": "./dist/esm/extractor/index.js" + "import": "./dist/esm/extractor/index.js", + "default": "./dist/cjs/extractor/index.js" }, "./dex": { "types": "./dist/types/dex/index.d.ts", + "node": "./dist/cjs/dex/index.js", "require": "./dist/cjs/dex/index.js", - "import": "./dist/esm/dex/index.js" + "import": "./dist/esm/dex/index.js", + "default": "./dist/cjs/dex/index.js" }, "./format": { "types": "./dist/types/format/index.d.ts", + "node": "./dist/cjs/format/index.js", "require": "./dist/cjs/format/index.js", - "import": "./dist/esm/format/index.js" + "import": "./dist/esm/format/index.js", + "default": "./dist/cjs/format/index.js" }, "./log": { "types": "./dist/types/log/index.d.ts", + "node": "./dist/cjs/log/index.js", "require": "./dist/cjs/log/index.js", - "import": "./dist/esm/log/index.js" + "import": "./dist/esm/log/index.js", + "default": "./dist/cjs/log/index.js" }, "./pool": { "types": "./dist/types/pool/index.d.ts", + "node": "./dist/cjs/pool/index.js", "require": "./dist/cjs/pool/index.js", - "import": "./dist/esm/pool/index.js" + "import": "./dist/esm/pool/index.js", + "default": "./dist/cjs/pool/index.js" }, "./router": { "types": "./dist/types/router/index.d.ts", + "node": "./dist/cjs/router/index.js", "require": "./dist/cjs/router/index.js", - "import": "./dist/esm/router/index.js" + "import": "./dist/esm/router/index.js", + "default": "./dist/cjs/router/index.js" }, "./serializer": { "types": "./dist/types/serializer/index.d.ts", + "node": "./dist/cjs/serializer/index.js", "require": "./dist/cjs/serializer/index.js", - "import": "./dist/esm/serializer/index.js" + "import": "./dist/esm/serializer/index.js", + "default": "./dist/cjs/serializer/index.js" }, "./math": { "types": "./dist/types/math/index.d.ts", + "node": "./dist/cjs/math/index.js", "require": "./dist/cjs/math/index.js", - "import": "./dist/esm/math/index.js" + "import": "./dist/esm/math/index.js", + "default": "./dist/cjs/math/index.js" }, "./sort": { "types": "./dist/types/sort/index.d.ts", + "node": "./dist/cjs/sort/index.js", "require": "./dist/cjs/sort/index.js", - "import": "./dist/esm/sort/index.js" + "import": "./dist/esm/sort/index.js", + "default": "./dist/cjs/sort/index.js" }, "./tines": { "types": "./dist/types/tines/index.d.ts", + "node": "./dist/cjs/tines/index.js", "require": "./dist/cjs/tines/index.js", - "import": "./dist/esm/tines/index.js" + "import": "./dist/esm/tines/index.js", + "default": "./dist/cjs/tines/index.js" }, "./token-list": { "types": "./dist/types/token-list/index.d.ts", + "node": "./dist/cjs/token-list/index.js", "require": "./dist/cjs/token-list/index.js", - "import": "./dist/esm/token-list/index.js" + "import": "./dist/esm/token-list/index.js", + "default": "./dist/cjs/token-list/index.js" }, "./types": { "types": "./dist/types/types/index.d.ts", + "node": "./dist/cjs/types/index.js", "require": "./dist/cjs/types/index.js", - "import": "./dist/esm/types/index.js" + "import": "./dist/esm/types/index.js", + "default": "./dist/cjs/types/index.js" }, "./validate": { "types": "./dist/types/validate/index.d.ts", + "node": "./dist/cjs/validate/index.js", "require": "./dist/cjs/validate/index.js", - "import": "./dist/esm/validate/index.js" + "import": "./dist/esm/validate/index.js", + "default": "./dist/cjs/validate/index.js" }, "./package.json": "./package.json" }, diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index bb5a3ea261..db5418880e 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -17,7 +17,7 @@ import { Router, UniV3LiquidityProviders, } from 'sushi/router' -import { UniswapV3BaseProvider } from '../../../packages/sushi/dist/router/liquidity-providers/UniswapV3Base.js' +import { UniswapV3BaseProvider } from '../../../packages/sushi/src/router/liquidity-providers/UniswapV3Base.js' async function testDF( _chainName: string, From 88f244210f7a20d700b773a13d4a49d410ca230f Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Sun, 6 Apr 2025 03:38:23 +0000 Subject: [PATCH 126/140] Update rain-release.yml --- .github/workflows/rain-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/rain-release.yml b/.github/workflows/rain-release.yml index 6273d2ce50..db6317ccf5 100644 --- a/.github/workflows/rain-release.yml +++ b/.github/workflows/rain-release.yml @@ -43,6 +43,7 @@ jobs: - name: Rename sushi NPM Package Tarball run: mv ${{ env.NPM_PACKAGE }} ../../sushi-${{ github.sha }}.tgz + working-directory: packages/sushi # Create a gitHub release with tarball - name: Create GitHub Release with sushi pkg From fdcb20711ff953132e15b3b01f4f4ee02ac8cf61 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 8 Apr 2025 04:07:44 +0000 Subject: [PATCH 127/140] update --- packages/sushi/src/router/data-fetcher.ts | 4 + packages/sushi/src/router/index.ts | 2 +- .../AerodromeSlipstream.ts | 19 +- .../liquidity-providers/AlgebraV2Base.ts | 2 +- .../router/liquidity-providers/AlienBaseV2.ts | 2 +- .../router/liquidity-providers/AlienBaseV3.ts | 2 +- .../src/router/liquidity-providers/ApeSwap.ts | 4 +- .../src/router/liquidity-providers/BSCSwap.ts | 2 +- .../router/liquidity-providers/BakerySwap.ts | 2 +- .../router/liquidity-providers/BaseSwap.ts | 4 +- .../router/liquidity-providers/BaseSwapV3.ts | 2 +- .../src/router/liquidity-providers/Biswap.ts | 4 +- .../router/liquidity-providers/BlastDEX.ts | 4 +- .../router/liquidity-providers/BlazeSwap.ts | 4 +- .../src/router/liquidity-providers/COREx.ts | 2 +- .../src/router/liquidity-providers/Camelot.ts | 4 +- .../router/liquidity-providers/CroDefiSwap.ts | 2 +- .../liquidity-providers/DackieSwapV2.ts | 2 +- .../liquidity-providers/DackieSwapV3.ts | 2 +- .../src/router/liquidity-providers/Dfyn.ts | 4 +- .../router/liquidity-providers/DovishV3.ts | 4 +- .../src/router/liquidity-providers/DyorV2.ts | 4 +- .../router/liquidity-providers/EddyFinance.ts | 2 +- .../src/router/liquidity-providers/Elk.ts | 4 +- .../src/router/liquidity-providers/Enosys.ts | 4 +- .../liquidity-providers/GravityFinance.ts | 4 +- .../router/liquidity-providers/HoneySwap.ts | 4 +- .../router/liquidity-providers/HyperBlast.ts | 4 +- .../src/router/liquidity-providers/JetSwap.ts | 4 +- .../router/liquidity-providers/KinetixV2.ts | 4 +- .../router/liquidity-providers/KinetixV3.ts | 4 +- .../router/liquidity-providers/Kwikswap.ts | 2 +- .../router/liquidity-providers/LaserSwap.ts | 4 +- .../liquidity-providers/LiquidityProvider.ts | 5 + .../src/router/liquidity-providers/LynexV1.ts | 4 +- .../router/liquidity-providers/MMFinance.ts | 2 +- .../src/router/liquidity-providers/MSwap.ts | 4 +- .../router/liquidity-providers/MonoSwapV2.ts | 4 +- .../router/liquidity-providers/MonoSwapV3.ts | 4 +- .../src/router/liquidity-providers/NetSwap.ts | 4 +- .../router/liquidity-providers/NineInch.ts | 2 +- .../liquidity-providers/PancakeSwapV2.ts | 4 +- .../liquidity-providers/PancakeSwapV3.ts | 6 +- .../router/liquidity-providers/Pangolin.ts | 2 +- .../router/liquidity-providers/QuickSwapV2.ts | 4 +- .../liquidity-providers/RingExchangeV2.ts | 2 +- .../liquidity-providers/RingExchangeV3.ts | 2 +- .../router/liquidity-providers/ShibaSwap.ts | 2 +- .../router/liquidity-providers/Solarbeam.ts | 4 +- .../router/liquidity-providers/SparkDexV2.ts | 4 +- .../router/liquidity-providers/SparkDexV3.ts | 4 +- .../liquidity-providers/SparkDexV3_1.ts | 4 +- .../liquidity-providers/SpookySwapV2.ts | 4 +- .../liquidity-providers/SpookySwapV3.ts | 4 +- .../router/liquidity-providers/SquadSwapV2.ts | 2 +- .../router/liquidity-providers/SushiSwapV2.ts | 4 +- .../router/liquidity-providers/SushiSwapV3.ts | 4 +- .../router/liquidity-providers/SwapBlast.ts | 4 +- .../router/liquidity-providers/ThrusterV2.ts | 6 +- .../router/liquidity-providers/ThrusterV3.ts | 4 +- .../router/liquidity-providers/TraderJoe.ts | 4 +- .../src/router/liquidity-providers/UbeSwap.ts | 4 +- .../router/liquidity-providers/UniswapV2.ts | 4 +- .../router/liquidity-providers/UniswapV3.ts | 4 +- .../router/liquidity-providers/VVSFlawless.ts | 2 +- .../router/liquidity-providers/VVSStandard.ts | 4 +- .../VelodromeSlipstream.ts | 17 +- .../VelodromeSlipstreamBase.ts | 333 ---------- .../src/router/liquidity-providers/Wagmi.ts | 4 +- .../router/liquidity-providers/Wigoswap.ts | 2 +- .../src/router/liquidity-providers/ZebraV2.ts | 2 +- .../sushi/src/router/rain/AlgebraV1Base.ts | 30 +- .../src/router/rain/RainDataFetcher.test.ts | 184 ++++++ .../sushi/src/router/rain/RainDataFetcher.ts | 430 ++++++++++++ ...{RainUniswapV2Base.ts => UniswapV2Base.ts} | 74 ++- ...{RainUniswapV3Base.ts => UniswapV3Base.ts} | 149 ++--- .../router/rain/VelodromeSlipstreamBase.ts | 619 ++++++++++++++++++ .../src/router/rain/rain-data-fetcher.ts | 238 ------- packages/sushi/src/router/rain/rain.test.ts | 124 ---- packages/sushi/test/vitest.config.ts | 1 + .../route-processor/test/DataFetcher.test.ts | 11 +- 81 files changed, 1481 insertions(+), 979 deletions(-) delete mode 100644 packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts create mode 100644 packages/sushi/src/router/rain/RainDataFetcher.test.ts create mode 100644 packages/sushi/src/router/rain/RainDataFetcher.ts rename packages/sushi/src/router/rain/{RainUniswapV2Base.ts => UniswapV2Base.ts} (76%) rename packages/sushi/src/router/rain/{RainUniswapV3Base.ts => UniswapV3Base.ts} (87%) create mode 100644 packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts delete mode 100644 packages/sushi/src/router/rain/rain-data-fetcher.ts delete mode 100644 packages/sushi/src/router/rain/rain.test.ts diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 0a4db1ffb6..39ee411a67 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -100,6 +100,10 @@ export type DataFetcherOptions = { blockNumber?: bigint /** Determines a timeout (in ms) for fetching pools for a token pair */ fetchPoolsTimeout?: number + /** + * Set to true for ignoring cached pools data and fetch them regardless + */ + ignoreCache?: boolean } // TODO: Should be a mode on the config for DataFetcher diff --git a/packages/sushi/src/router/index.ts b/packages/sushi/src/router/index.ts index 17a5063f26..479badcd76 100644 --- a/packages/sushi/src/router/index.ts +++ b/packages/sushi/src/router/index.ts @@ -9,4 +9,4 @@ export * from './tines-to-route-processor-2.js' export * from './tines-to-route-processor-4.js' export * from './PoolBinarySerialization.js' export * from './Sankey.AnyChart.js' -export * from './rain/rain-data-fetcher.js' +export * from './rain/RainDataFetcher.js' diff --git a/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts b/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts index 476820f0fa..9dbe16e5ef 100644 --- a/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts +++ b/packages/sushi/src/router/liquidity-providers/AerodromeSlipstream.ts @@ -1,30 +1,19 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { VelodromeSlipstreamBaseProvider } from '../rain/VelodromeSlipstreamBase.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' export class AerodromeSlipstreamProvider extends VelodromeSlipstreamBaseProvider { + override DEFAULT_TICK_SPACINGS = [1, 50, 100, 200, 2000, 10] as any + override tickSpacings: number[] = [...this.DEFAULT_TICK_SPACINGS] constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BASE]: '0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A', } as const - const customSwapFeeModule = { - [ChainId.BASE]: '0xF4171B0953b52Fa55462E4d76ecA1845Db69af00', - } as const - const poolImplementation = { - [ChainId.BASE]: '0xeC8E5342B19977B4eF8892e02D8DAEcfa1315831', - } as const const tickLens = { [ChainId.BASE]: '0x3e1116ea5034f5d73a7b530071709d54a4109f5f', } as const - super( - chainId, - web3Client, - factory, - tickLens, - poolImplementation, - customSwapFeeModule, - ) + super(chainId, web3Client, factory, tickLens) } getType(): LiquidityProviders { return LiquidityProviders.AerodromeSlipstream diff --git a/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts b/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts index 9662f0d4fa..cda3b3502b 100644 --- a/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/AlgebraV2Base.ts @@ -1,4 +1,4 @@ -import { AlgebraV1BaseProvider } from './AlgebraV1Base.js' +import { AlgebraV1BaseProvider } from '../rain/AlgebraV1Base.js' export const globalStateAbi = [ { diff --git a/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts b/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts index 6103f63f54..7d64f83212 100644 --- a/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts +++ b/packages/sushi/src/router/liquidity-providers/AlienBaseV2.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class AlienBaseV2Provider extends UniswapV2BaseProvider { override fee = 0.0016 diff --git a/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts b/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts index 4c3634d238..320cbb6c51 100644 --- a/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts +++ b/packages/sushi/src/router/liquidity-providers/AlienBaseV3.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' /** * The default factory enabled fee amounts, denominated in hundredths of bips. diff --git a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts index 7dfe25e531..3cef677d15 100644 --- a/packages/sushi/src/router/liquidity-providers/ApeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/ApeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class ApeSwapProvider extends RainUniswapV2BaseProvider { +export class ApeSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0xBAe5dc9B19004883d0377419FeF3c2C8832d7d7B', diff --git a/packages/sushi/src/router/liquidity-providers/BSCSwap.ts b/packages/sushi/src/router/liquidity-providers/BSCSwap.ts index c16f48895b..37068a9247 100644 --- a/packages/sushi/src/router/liquidity-providers/BSCSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BSCSwap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class BSCSwapProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/BakerySwap.ts b/packages/sushi/src/router/liquidity-providers/BakerySwap.ts index b5c68518ed..8c62d7e7e1 100644 --- a/packages/sushi/src/router/liquidity-providers/BakerySwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BakerySwap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class BakerySwapProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts index 46deecc1a5..a8cdcf9163 100644 --- a/packages/sushi/src/router/liquidity-providers/BaseSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BaseSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class BaseSwapProvider extends RainUniswapV2BaseProvider { +export class BaseSwapProvider extends UniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts b/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts index 1eac59572c..e2dd0924c6 100644 --- a/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/BaseSwapV3.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' /** * The default factory enabled fee amounts, denominated in hundredths of bips. diff --git a/packages/sushi/src/router/liquidity-providers/Biswap.ts b/packages/sushi/src/router/liquidity-providers/Biswap.ts index ab1693c5aa..8e8aab8b99 100644 --- a/packages/sushi/src/router/liquidity-providers/Biswap.ts +++ b/packages/sushi/src/router/liquidity-providers/Biswap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class BiswapProvider extends RainUniswapV2BaseProvider { +export class BiswapProvider extends UniswapV2BaseProvider { override fee = 0.002 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/BlastDEX.ts b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts index 31267e85d3..81a12e83c6 100644 --- a/packages/sushi/src/router/liquidity-providers/BlastDEX.ts +++ b/packages/sushi/src/router/liquidity-providers/BlastDEX.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class BlastDEXProvider extends RainUniswapV2BaseProvider { +export class BlastDEXProvider extends UniswapV2BaseProvider { override fee = 0.002 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts index ba69dc348f..6a5334b508 100644 --- a/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/BlazeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class BlazeSwapProvider extends RainUniswapV2BaseProvider { +export class BlazeSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x440602f459D7Dd500a74528003e6A20A46d6e2A6', diff --git a/packages/sushi/src/router/liquidity-providers/COREx.ts b/packages/sushi/src/router/liquidity-providers/COREx.ts index 093eeb0820..45c60dbcc2 100644 --- a/packages/sushi/src/router/liquidity-providers/COREx.ts +++ b/packages/sushi/src/router/liquidity-providers/COREx.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class CORExProvider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index bc91455398..f2ceb97ed2 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -2,7 +2,7 @@ import { Address, PublicClient, parseAbi } from 'viem' import { ChainId } from '../../chain/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { type PoolCode } from '../pool-codes/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' type IsStableSwap = @@ -21,7 +21,7 @@ type IsStableSwap = )[] | undefined -export class CamelotProvider extends RainUniswapV2BaseProvider { +export class CamelotProvider extends UniswapV2BaseProvider { // Camelot has a slightly different getReserves() abi // so needs to be overriden override getReservesAbi = parseAbi([ diff --git a/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts b/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts index c9c550867b..74572e96d5 100644 --- a/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/CroDefiSwap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class CroDefiSwapProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts b/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts index a8a06a94a2..556331f4e5 100644 --- a/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/DackieSwapV2.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class DackieSwapV2Provider extends UniswapV2BaseProvider { override fee = 0.0025 diff --git a/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts b/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts index fc32ff3755..67a9040e41 100644 --- a/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/DackieSwapV3.ts @@ -5,8 +5,8 @@ import { PANCAKESWAP_V3_FEE_SPACING_MAP, PancakeSwapV3FeeAmount, } from '../../config/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class DackieSwapV3Provider extends UniswapV3BaseProvider { override FEE = PancakeSwapV3FeeAmount diff --git a/packages/sushi/src/router/liquidity-providers/Dfyn.ts b/packages/sushi/src/router/liquidity-providers/Dfyn.ts index 15017f38ba..49475dfce1 100644 --- a/packages/sushi/src/router/liquidity-providers/Dfyn.ts +++ b/packages/sushi/src/router/liquidity-providers/Dfyn.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class DfynProvider extends RainUniswapV2BaseProvider { +export class DfynProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0xE7Fb3e833eFE5F9c441105EB65Ef8b261266423B', diff --git a/packages/sushi/src/router/liquidity-providers/DovishV3.ts b/packages/sushi/src/router/liquidity-providers/DovishV3.ts index e886e3ea2e..6b4eb9be26 100644 --- a/packages/sushi/src/router/liquidity-providers/DovishV3.ts +++ b/packages/sushi/src/router/liquidity-providers/DovishV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class DovishV3Provider extends RainUniswapV3BaseProvider { +export class DovishV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON_ZKEVM]: '0xdE474Db1Fa59898BC91314328D29507AcD0D593c', diff --git a/packages/sushi/src/router/liquidity-providers/DyorV2.ts b/packages/sushi/src/router/liquidity-providers/DyorV2.ts index a83e5db88a..f8c2b15dc2 100644 --- a/packages/sushi/src/router/liquidity-providers/DyorV2.ts +++ b/packages/sushi/src/router/liquidity-providers/DyorV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class DyorV2Provider extends RainUniswapV2BaseProvider { +export class DyorV2Provider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/EddyFinance.ts b/packages/sushi/src/router/liquidity-providers/EddyFinance.ts index 6980a45f19..59a4d4a525 100644 --- a/packages/sushi/src/router/liquidity-providers/EddyFinance.ts +++ b/packages/sushi/src/router/liquidity-providers/EddyFinance.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class EddyFinanceProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/Elk.ts b/packages/sushi/src/router/liquidity-providers/Elk.ts index a191985d1b..34a6ebb074 100644 --- a/packages/sushi/src/router/liquidity-providers/Elk.ts +++ b/packages/sushi/src/router/liquidity-providers/Elk.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class ElkProvider extends RainUniswapV2BaseProvider { +export class ElkProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.AVALANCHE]: '0x091d35d7F63487909C863001ddCA481c6De47091', diff --git a/packages/sushi/src/router/liquidity-providers/Enosys.ts b/packages/sushi/src/router/liquidity-providers/Enosys.ts index ceea900f62..e6019e2071 100644 --- a/packages/sushi/src/router/liquidity-providers/Enosys.ts +++ b/packages/sushi/src/router/liquidity-providers/Enosys.ts @@ -3,7 +3,7 @@ import { Address, PublicClient, encodePacked, keccak256 } from 'viem' import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/Token.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' import { StaticPool } from './UniswapV2Base.js' @@ -11,7 +11,7 @@ import { StaticPool } from './UniswapV2Base.js' // calculations methods to use all the available initCodeHashes to generate multiple // pool addresses for a pair and then the wrong ones will be filtered out automatically // on multicall, just the same as any other non existant calculated pool addresses -export class EnosysProvider extends RainUniswapV2BaseProvider { +export class EnosysProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x28b70f6Ed97429E40FE9a9CD3EB8E86BCBA11dd4', diff --git a/packages/sushi/src/router/liquidity-providers/GravityFinance.ts b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts index 6458fb9f21..731dd9536a 100644 --- a/packages/sushi/src/router/liquidity-providers/GravityFinance.ts +++ b/packages/sushi/src/router/liquidity-providers/GravityFinance.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class GravityFinanceProvider extends RainUniswapV2BaseProvider { +export class GravityFinanceProvider extends UniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/HoneySwap.ts b/packages/sushi/src/router/liquidity-providers/HoneySwap.ts index a475653bd8..64088ad9c6 100644 --- a/packages/sushi/src/router/liquidity-providers/HoneySwap.ts +++ b/packages/sushi/src/router/liquidity-providers/HoneySwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class HoneySwapProvider extends RainUniswapV2BaseProvider { +export class HoneySwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.GNOSIS]: '0xA818b4F111Ccac7AA31D0BCc0806d64F2E0737D7', diff --git a/packages/sushi/src/router/liquidity-providers/HyperBlast.ts b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts index 77dcd86b96..b8776674ab 100644 --- a/packages/sushi/src/router/liquidity-providers/HyperBlast.ts +++ b/packages/sushi/src/router/liquidity-providers/HyperBlast.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class HyperBlastProvider extends RainUniswapV2BaseProvider { +export class HyperBlastProvider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/JetSwap.ts b/packages/sushi/src/router/liquidity-providers/JetSwap.ts index c375bc003e..29b3b6129f 100644 --- a/packages/sushi/src/router/liquidity-providers/JetSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/JetSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class JetSwapProvider extends RainUniswapV2BaseProvider { +export class JetSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0x668ad0ed2622C62E24f0d5ab6B6Ac1b9D2cD4AC7', diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV2.ts b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts index 01abce8f32..38fdd8c75e 100644 --- a/packages/sushi/src/router/liquidity-providers/KinetixV2.ts +++ b/packages/sushi/src/router/liquidity-providers/KinetixV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class KinetixV2Provider extends RainUniswapV2BaseProvider { +export class KinetixV2Provider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/KinetixV3.ts b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts index 850d3a968c..fe469e94a9 100644 --- a/packages/sushi/src/router/liquidity-providers/KinetixV3.ts +++ b/packages/sushi/src/router/liquidity-providers/KinetixV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class KinetixV3Provider extends RainUniswapV3BaseProvider { +export class KinetixV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.KAVA]: '0x2dBB6254231C5569B6A4313c6C1F5Fe1340b35C2', diff --git a/packages/sushi/src/router/liquidity-providers/Kwikswap.ts b/packages/sushi/src/router/liquidity-providers/Kwikswap.ts index 47b7372fe8..b447f6f14f 100644 --- a/packages/sushi/src/router/liquidity-providers/Kwikswap.ts +++ b/packages/sushi/src/router/liquidity-providers/Kwikswap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class KwikswapProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/LaserSwap.ts b/packages/sushi/src/router/liquidity-providers/LaserSwap.ts index 957920587f..03635dd1e6 100644 --- a/packages/sushi/src/router/liquidity-providers/LaserSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/LaserSwap.ts @@ -1,9 +1,9 @@ import { Address, PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class LaserSwapV2Provider extends RainUniswapV2BaseProvider { +export class LaserSwapV2Provider extends UniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 0c44079d79..2c3853cd72 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -92,6 +92,7 @@ export abstract class LiquidityProvider { client: PublicClient lastUpdateBlock = 0 isTest = false + initialized = false readonly ON_DEMAND_POOLS_LIFETIME_IN_SECONDS = 60 readonly FETCH_AVAILABLE_POOLS_AFTER_SECONDS = 900 @@ -160,6 +161,10 @@ export abstract class LiquidityProvider { .sort((first, second) => (first > second ? -1 : 1)) .join(':') + async init(_blockNumber?: bigint) { + this.initialized = true + } + // methods interface for event log handling processLog(_log: Log) {} async afterProcessLog(_untilBlock: bigint) {} diff --git a/packages/sushi/src/router/liquidity-providers/LynexV1.ts b/packages/sushi/src/router/liquidity-providers/LynexV1.ts index 99219cbfbd..bdd731b335 100644 --- a/packages/sushi/src/router/liquidity-providers/LynexV1.ts +++ b/packages/sushi/src/router/liquidity-providers/LynexV1.ts @@ -4,7 +4,7 @@ import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' import { StaticPool } from './UniswapV2Base.js' @@ -12,7 +12,7 @@ const GetFeesAbi = parseAbi([ 'function getFee(bool _stable) public view returns(uint256)', ]) -export class LynexV1Provider extends RainUniswapV2BaseProvider { +export class LynexV1Provider extends UniswapV2BaseProvider { STABLE_FEE = 0.0001 VOLATILE_FEE = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { diff --git a/packages/sushi/src/router/liquidity-providers/MMFinance.ts b/packages/sushi/src/router/liquidity-providers/MMFinance.ts index 7cace97e8c..171560a03d 100644 --- a/packages/sushi/src/router/liquidity-providers/MMFinance.ts +++ b/packages/sushi/src/router/liquidity-providers/MMFinance.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class MMFinanceProvider extends UniswapV2BaseProvider { override fee = 0.0017 diff --git a/packages/sushi/src/router/liquidity-providers/MSwap.ts b/packages/sushi/src/router/liquidity-providers/MSwap.ts index aa8d6b01c4..be10e9d3b6 100644 --- a/packages/sushi/src/router/liquidity-providers/MSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/MSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class MSwapProvider extends RainUniswapV2BaseProvider { +export class MSwapProvider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts index 8ad0fa4da1..49c8ad2d7c 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class MonoswapV2Provider extends RainUniswapV2BaseProvider { +export class MonoswapV2Provider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts index a4bc46b2a5..3733c49e5f 100644 --- a/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/MonoSwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class MonoswapV3Provider extends RainUniswapV3BaseProvider { +export class MonoswapV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0x48d0F09710794313f33619c95147F34458BF7C3b', diff --git a/packages/sushi/src/router/liquidity-providers/NetSwap.ts b/packages/sushi/src/router/liquidity-providers/NetSwap.ts index 51d85408a2..076e2e429c 100644 --- a/packages/sushi/src/router/liquidity-providers/NetSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/NetSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class NetSwapProvider extends RainUniswapV2BaseProvider { +export class NetSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.METIS]: '0x70f51d68D16e8f9e418441280342BD43AC9Dff9f', diff --git a/packages/sushi/src/router/liquidity-providers/NineInch.ts b/packages/sushi/src/router/liquidity-providers/NineInch.ts index 67e24f78e0..ceb1100fb2 100644 --- a/packages/sushi/src/router/liquidity-providers/NineInch.ts +++ b/packages/sushi/src/router/liquidity-providers/NineInch.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class NineInchProvider extends UniswapV2BaseProvider { override fee = 0.0029 diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts index 950f2f51f5..60cc7c74b4 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class PancakeSwapV2Provider extends RainUniswapV2BaseProvider { +export class PancakeSwapV2Provider extends UniswapV2BaseProvider { override fee = 0.0025 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index 29f2e7d633..323565fc39 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -5,7 +5,7 @@ import { PANCAKESWAP_V3_FEE_SPACING_MAP, PancakeSwapV3FeeAmount, } from '../../config/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' export const PancakeV3EventsAbi = [ @@ -33,11 +33,11 @@ export const PancakeV3EventsAbi = [ ), ] -export class PancakeSwapV3Provider extends RainUniswapV3BaseProvider { +export class PancakeSwapV3Provider extends UniswapV3BaseProvider { override FEE = PancakeSwapV3FeeAmount override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP override eventsAbi = - PancakeV3EventsAbi as any as RainUniswapV3BaseProvider['eventsAbi'] + PancakeV3EventsAbi as any as UniswapV3BaseProvider['eventsAbi'] constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/Pangolin.ts b/packages/sushi/src/router/liquidity-providers/Pangolin.ts index 71f509b6e1..6d4c33ea10 100644 --- a/packages/sushi/src/router/liquidity-providers/Pangolin.ts +++ b/packages/sushi/src/router/liquidity-providers/Pangolin.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class PangolinProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts index 5f180c2c61..69f863b674 100644 --- a/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/QuickSwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class QuickSwapV2Provider extends RainUniswapV2BaseProvider { +export class QuickSwapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.POLYGON]: '0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32', diff --git a/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts b/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts index 774cadc231..dd2ac811e2 100644 --- a/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts +++ b/packages/sushi/src/router/liquidity-providers/RingExchangeV2.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class RingExchangeV2Provider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts b/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts index 826d7ac54c..94bd1d540e 100644 --- a/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts +++ b/packages/sushi/src/router/liquidity-providers/RingExchangeV3.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' export class RingExchangeV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { diff --git a/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts b/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts index 25b04d677c..8f6368eaac 100644 --- a/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/ShibaSwap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class ShibaSwapProvider extends UniswapV2BaseProvider { override fee = 0.003 diff --git a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts index a006e9de56..638d3361f9 100644 --- a/packages/sushi/src/router/liquidity-providers/Solarbeam.ts +++ b/packages/sushi/src/router/liquidity-providers/Solarbeam.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SolarbeamProvider extends RainUniswapV2BaseProvider { +export class SolarbeamProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.MOONRIVER]: '0x049581aEB6Fe262727f290165C29BDAB065a1B68', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts index 5822a417bc..749f973b92 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SparkDexV2Provider extends RainUniswapV2BaseProvider { +export class SparkDexV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x16b619B04c961E8f4F06C10B42FDAbb328980A89', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts index 5412e47794..ecc9fd5c56 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SparkDexV3Provider extends RainUniswapV3BaseProvider { +export class SparkDexV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0xb3fB4f96175f6f9D716c17744e5A6d4BA9da8176', diff --git a/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts index 0382e0f84f..d1a3b2c59b 100644 --- a/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts +++ b/packages/sushi/src/router/liquidity-providers/SparkDexV3_1.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SparkDexV3_1Provider extends RainUniswapV3BaseProvider { +export class SparkDexV3_1Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FLARE]: '0x8A2578d23d4C532cC9A98FaD91C0523f5efDE652', diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts index 7ac270e0e3..f06c2e65eb 100644 --- a/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SpookySwapV2Provider extends RainUniswapV2BaseProvider { +export class SpookySwapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FANTOM]: '0x152eE697f2E276fA89E96742e9bB9aB1F2E61bE3', diff --git a/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts index 6f498334cd..c95b6ae879 100644 --- a/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SpookySwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SpookySwapV3Provider extends RainUniswapV3BaseProvider { +export class SpookySwapV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.FANTOM]: '0x7928a2c48754501f3a8064765ECaE541daE5c3E6', diff --git a/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts b/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts index 68a027f49e..4453f1099f 100644 --- a/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SquadSwapV2.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class SquadSwapV2Provider extends UniswapV2BaseProvider { override fee = 0.002 diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts index 73affe3eec..24992fb131 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV2.ts @@ -4,10 +4,10 @@ import { SUSHISWAP_V2_FACTORY_ADDRESS, SUSHISWAP_V2_INIT_CODE_HASH, } from '../../config/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SushiSwapV2Provider extends RainUniswapV2BaseProvider { +export class SushiSwapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = SUSHISWAP_V2_FACTORY_ADDRESS super(chainId, web3Client, factory, SUSHISWAP_V2_INIT_CODE_HASH) diff --git a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts index 816d45eb0a..878989a91e 100644 --- a/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/SushiSwapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SushiSwapV3Provider extends RainUniswapV3BaseProvider { +export class SushiSwapV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ARBITRUM_NOVA]: '0xaa26771d497814E81D305c511Efbb3ceD90BF5bd', diff --git a/packages/sushi/src/router/liquidity-providers/SwapBlast.ts b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts index 8500485199..0ec4856bfe 100644 --- a/packages/sushi/src/router/liquidity-providers/SwapBlast.ts +++ b/packages/sushi/src/router/liquidity-providers/SwapBlast.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class SwapBlastProvider extends RainUniswapV2BaseProvider { +export class SwapBlastProvider extends UniswapV2BaseProvider { override fee = 0.001 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts index 994aeddb3d..7b9e84288c 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class ThrusterV2_3Provider extends RainUniswapV2BaseProvider { +export class ThrusterV2_3Provider extends UniswapV2BaseProvider { override fee = 0.003 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { @@ -23,7 +23,7 @@ export class ThrusterV2_3Provider extends RainUniswapV2BaseProvider { } } -export class ThrusterV2_1Provider extends RainUniswapV2BaseProvider { +export class ThrusterV2_1Provider extends UniswapV2BaseProvider { override fee = 0.01 constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts index 6b321ebc0e..53a2d1e018 100644 --- a/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts +++ b/packages/sushi/src/router/liquidity-providers/ThrusterV3.ts @@ -2,10 +2,10 @@ import { Address, PublicClient } from 'viem' import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class ThrusterV3Provider extends RainUniswapV3BaseProvider { +export class ThrusterV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.BLAST]: '0xa08ae3d3f4dA51C22d3c041E468bdF4C61405AaB', diff --git a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts index a8c67c5e5f..81938a3622 100644 --- a/packages/sushi/src/router/liquidity-providers/TraderJoe.ts +++ b/packages/sushi/src/router/liquidity-providers/TraderJoe.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class TraderJoeProvider extends RainUniswapV2BaseProvider { +export class TraderJoeProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.AVALANCHE]: '0x9Ad6C38BE94206cA50bb0d90783181662f0Cfa10', diff --git a/packages/sushi/src/router/liquidity-providers/UbeSwap.ts b/packages/sushi/src/router/liquidity-providers/UbeSwap.ts index 0d471a7a4f..4e7a0d0030 100644 --- a/packages/sushi/src/router/liquidity-providers/UbeSwap.ts +++ b/packages/sushi/src/router/liquidity-providers/UbeSwap.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class UbeSwapProvider extends RainUniswapV2BaseProvider { +export class UbeSwapProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.CELO]: '0x62d5b84bE28a183aBB507E125B384122D2C25fAE', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts index e0380979da..1a08470af8 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class UniswapV2Provider extends RainUniswapV2BaseProvider { +export class UniswapV2Provider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3.ts index 56b21f3de6..819cf10478 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class UniswapV3Provider extends RainUniswapV3BaseProvider { +export class UniswapV3Provider extends UniswapV3BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.ETHEREUM]: '0x1F98431c8aD98523631AE4a59f267346ea31F984', diff --git a/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts index e1a2858e61..8bfbb9add2 100644 --- a/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts +++ b/packages/sushi/src/router/liquidity-providers/VVSFlawless.ts @@ -2,8 +2,8 @@ import { Address, PublicClient } from 'viem' import { uniswapV3FactoryAbi } from '../../abi/uniswapV3FactoryAbi.js' import { ChainId } from '../../chain/index.js' import { SushiSwapV3FeeAmount } from '../../config/sushiswap-v3.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' /** * The default factory enabled fee amounts, denominated in hundredths of bips. diff --git a/packages/sushi/src/router/liquidity-providers/VVSStandard.ts b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts index 02baf0b65e..f5f9a13380 100644 --- a/packages/sushi/src/router/liquidity-providers/VVSStandard.ts +++ b/packages/sushi/src/router/liquidity-providers/VVSStandard.ts @@ -1,9 +1,9 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV2BaseProvider } from '../rain/RainUniswapV2Base.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -export class VVSStandardProvider extends RainUniswapV2BaseProvider { +export class VVSStandardProvider extends UniswapV2BaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.CRONOS]: '0x3B44B2a187a7b3824131F8db5a74194D0a42Fc15', diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts index 92ed77e554..15c192f65c 100644 --- a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts +++ b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstream.ts @@ -1,30 +1,17 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { VelodromeSlipstreamBaseProvider } from '../rain/VelodromeSlipstreamBase.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' export class VelodromeSlipstreamProvider extends VelodromeSlipstreamBaseProvider { constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { [ChainId.OPTIMISM]: '0xCc0bDDB707055e04e497aB22a59c2aF4391cd12F', } as const - const customSwapFeeModule = { - [ChainId.OPTIMISM]: '0x7361E9079920fb75496E9764A2665d8ee5049D5f', - } as const - const poolImplementation = { - [ChainId.OPTIMISM]: '0xc28aD28853A547556780BEBF7847628501A3bCbb', - } as const const tickLens = { [ChainId.OPTIMISM]: '0x49C6FDCb3D5b2CecD8baff66c8e94b9B261ad925', } as const - super( - chainId, - web3Client, - factory, - tickLens, - poolImplementation, - customSwapFeeModule, - ) + super(chainId, web3Client, factory, tickLens) } getType(): LiquidityProviders { return LiquidityProviders.VelodromeSlipstream diff --git a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts deleted file mode 100644 index 80f61834ad..0000000000 --- a/packages/sushi/src/router/liquidity-providers/VelodromeSlipstreamBase.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { - Address, - Hex, - PublicClient, - encodeAbiParameters, - getAddress, - keccak256, - parseAbi, - parseAbiParameters, -} from 'viem' -import { ChainId } from '../../chain/index.js' -import { Token } from '../../currency/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' -import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { - NUMBER_OF_SURROUNDING_TICKS, - PoolFilter, - StaticPoolUniV3, - UniswapV3BaseProvider, - V3Pool, - bitmapIndex, -} from './UniswapV3Base.js' - -export const ZERO_FEE_INDICATOR = 420 - -export interface SlipstreamPool extends StaticPoolUniV3 { - tickSpacing: number -} - -const feeAbi = [ - { - inputs: [], - name: 'fee', - outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }], - stateMutability: 'view', - type: 'function', - }, -] as const - -const slot0Abi = [ - { - inputs: [], - name: 'slot0', - outputs: [ - { internalType: 'uint160', name: 'sqrtPriceX96', type: 'uint160' }, - { internalType: 'int24', name: 'tick', type: 'int24' }, - { internalType: 'uint16', name: 'observationIndex', type: 'uint16' }, - { - internalType: 'uint16', - name: 'observationCardinality', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'observationCardinalityNext', - type: 'uint16', - }, - { internalType: 'bool', name: 'unlocked', type: 'bool' }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const - -const SlipstreamABI = parseAbi([ - 'function tickSpacingToFee(int24) view returns (uint24)', - 'function poolImplementation() view returns (address)', - 'function tickSpacings() view returns (int24[])', - 'function swapFeeModule() view returns (address)', -]) - -export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvider { - override TICK_SPACINGS: Record = {} - didFetchTickSpacing = false - - readonly BASE_FEE = 100 - DEFAULT_TICK_SPACINGS = [1, 50, 100, 200, 2000] as const - tickSpacings: number[] = [...this.DEFAULT_TICK_SPACINGS] - - poolImplementation: Record = {} - customSwapFeeModule: Record = {} - - constructor( - chainId: ChainId, - web3Client: PublicClient, - factory: Record, - tickLens: Record, - poolImplementation: Record, - customSwapFeeModule: Record, - isTest = false, - ) { - super( - chainId, - web3Client, - factory, - { [chainId]: `0x${'0'.repeat(64)}` }, - tickLens, - isTest, - ) - this.poolImplementation = poolImplementation - this.customSwapFeeModule = customSwapFeeModule - if (!(chainId in this.poolImplementation)) { - throw new Error( - `${this.getType()} cannot be instantiated for chainid ${chainId}, no poolImplementation address`, - ) - } - if (!(chainId in this.customSwapFeeModule)) { - throw new Error( - `${this.getType()} cannot be instantiated for chainid ${chainId}, no customSwapFeeModule address`, - ) - } - } - - override async fetchPoolData( - t0: Token, - t1: Token, - excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, - ): Promise { - if (!this.didFetchTickSpacing) { - const result = await this.client - .readContract({ - address: this.factory[this.chainId as keyof typeof this.factory]!, - blockNumber: options?.blockNumber, - abi: SlipstreamABI, - functionName: 'tickSpacings', - }) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - if (result) this.didFetchTickSpacing = true - this.tickSpacings = (result ?? this.DEFAULT_TICK_SPACINGS) as number[] - } - - let staticPools = this.getStaticPools(t0, t1) - if (excludePools) - staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - - const slot0 = await this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3?.address!, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: staticPools.map((pool) => ({ - address: pool.address, - chainId: this.chainId, - abi: slot0Abi, - functionName: 'slot0', - })), - }) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - - const poolFees = await this.client - .multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3?.address!, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: staticPools.map( - (pool) => - ({ - address: pool.address, - chainId: this.chainId, - abi: feeAbi, - functionName: 'fee', - }) as const, - ), - }) - .catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) - - const existingPools: V3Pool[] = [] - - staticPools.forEach((pool, i) => { - if (slot0 === undefined || !slot0[i]) return - const sqrtPriceX96 = slot0[i]!.result?.[0] // price - const tick = slot0[i]!.result?.[1] // tick - if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') - return - const fee = poolFees?.[i]?.result // fee - if (!fee) return - const activeTick = Math.floor(tick / pool.tickSpacing) * pool.tickSpacing - if (typeof activeTick !== 'number') return - this.TICK_SPACINGS[pool.address.toLowerCase()] = pool.tickSpacing - existingPools.push({ - ...pool, - fee, - sqrtPriceX96, - activeTick, - }) - }) - - return existingPools - } - - override getIndexes(existingPools: V3Pool[]): [number[], number[]] { - const minIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick - NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - const maxIndexes = existingPools.map((pool) => - bitmapIndex( - pool.activeTick + NUMBER_OF_SURROUNDING_TICKS, - this.TICK_SPACINGS[pool.address.toLowerCase()]!, - ), - ) - return [minIndexes, maxIndexes] - } - - override handleTickBoundries( - i: number, - pool: V3Pool, - poolTicks: { - index: number - DLiquidity: bigint - }[], - minIndexes: number[], - maxIndexes: number[], - ) { - const lowerUnknownTick = - minIndexes[i]! * this.TICK_SPACINGS[pool.address.toLowerCase()]! * 256 - - this.TICK_SPACINGS[pool.address.toLowerCase()]! - console.assert( - poolTicks.length === 0 || lowerUnknownTick < poolTicks[0]!.index, - 'Error 236: unexpected min tick index', - ) - poolTicks.unshift({ - index: lowerUnknownTick, - DLiquidity: 0n, - }) - const upperUnknownTick = - (maxIndexes[i]! + 1) * - this.TICK_SPACINGS[pool.address.toLowerCase()]! * - 256 - console.assert( - poolTicks[poolTicks.length - 1]!.index < upperUnknownTick, - 'Error 244: unexpected max tick index', - ) - poolTicks.push({ - index: upperUnknownTick, - DLiquidity: 0n, - }) - } - - override getStaticPools(t1: Token, t2: Token): SlipstreamPool[] { - const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) - const currencyCombinations: [Token, Token, number][] = [] - allCombinations.forEach(([currencyA, currencyB]) => { - if (currencyA && currencyB) { - const tokenA = currencyA.wrapped - const tokenB = currencyB.wrapped - if (tokenA.equals(tokenB)) return - const tokens = tokenA.sortsBefore(tokenB) - ? [tokenA, tokenB] - : [tokenB, tokenA] - currencyCombinations.push( - ...this.tickSpacings.map( - (t) => [...tokens, t] as [Token, Token, number], - ), - ) - } - }) - return currencyCombinations.map(([currencyA, currencyB, tickSpacing]) => ({ - address: this.getSlipstreamPoolAddress( - this.factory[this.chainId as keyof typeof this.factory]!, - currencyA.wrapped, - currencyB.wrapped, - tickSpacing, - ), - token0: currencyA, - token1: currencyB, - fee: this.BASE_FEE, - tickSpacing, - })) - } - - // algebra doesnt have the fee/ticks setup the same way univ3 has - override async ensureFeeAndTicks(): Promise { - return true - } - - getSlipstreamPoolAddress( - factory: Address, - tokenA: Token, - tokenB: Token, - tickSpacing: number, - ): Address { - const [token0, token1] = tokenA.sortsBefore(tokenB) - ? [tokenA, tokenB] - : [tokenB, tokenA] - const constructorArgumentsEncoded = encodeAbiParameters( - parseAbiParameters('address, address, int24'), - [token0.address, token1.address, tickSpacing], - ) - const initCode = - `0x3d602d80600a3d3981f3363d3d373d3d3d363d73${this.poolImplementation[ - this.chainId as keyof typeof this.poolImplementation - ]!.replace('0x', '')}5af43d82803e903d91602b57fd5bf3` as Hex - const initCodeHash = keccak256(initCode) - - const create2Inputs = [ - '0xff', - factory, - // salt - keccak256(constructorArgumentsEncoded), - // init code hash - initCodeHash, - ] - const sanitizedInputs = `0x${create2Inputs - .map((i) => i.slice(2)) - .join('')}` as Hex - return getAddress(`0x${keccak256(sanitizedInputs).slice(-40)}`) - } -} diff --git a/packages/sushi/src/router/liquidity-providers/Wagmi.ts b/packages/sushi/src/router/liquidity-providers/Wagmi.ts index 68e239a170..e49cc2cfc3 100644 --- a/packages/sushi/src/router/liquidity-providers/Wagmi.ts +++ b/packages/sushi/src/router/liquidity-providers/Wagmi.ts @@ -1,6 +1,6 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' -import { RainUniswapV3BaseProvider } from '../rain/RainUniswapV3Base.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' enum WagmiFeeAmount { @@ -21,7 +21,7 @@ const WagmiTickSpacing: Record = { [WagmiFeeAmount.HIGH]: 200, } -export class WagmiProvider extends RainUniswapV3BaseProvider { +export class WagmiProvider extends UniswapV3BaseProvider { override FEE = WagmiFeeAmount override TICK_SPACINGS = WagmiTickSpacing constructor(chainId: ChainId, web3Client: PublicClient) { diff --git a/packages/sushi/src/router/liquidity-providers/Wigoswap.ts b/packages/sushi/src/router/liquidity-providers/Wigoswap.ts index 350e54d781..d1689f67c1 100644 --- a/packages/sushi/src/router/liquidity-providers/Wigoswap.ts +++ b/packages/sushi/src/router/liquidity-providers/Wigoswap.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV2BaseProvider } from './UniswapV2Base.js' export class WigoswapProvider extends UniswapV2BaseProvider { override fee = 0.0019 diff --git a/packages/sushi/src/router/liquidity-providers/ZebraV2.ts b/packages/sushi/src/router/liquidity-providers/ZebraV2.ts index f7d1e6d7ea..8636114020 100644 --- a/packages/sushi/src/router/liquidity-providers/ZebraV2.ts +++ b/packages/sushi/src/router/liquidity-providers/ZebraV2.ts @@ -1,7 +1,7 @@ import { PublicClient } from 'viem' import { ChainId } from '../../chain/index.js' +import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' -import { UniswapV3BaseProvider } from './UniswapV3Base.js' /** * The default factory enabled fee amounts, denominated in hundredths of bips. diff --git a/packages/sushi/src/router/rain/AlgebraV1Base.ts b/packages/sushi/src/router/rain/AlgebraV1Base.ts index 5ba4fbd6b0..42f153a203 100644 --- a/packages/sushi/src/router/rain/AlgebraV1Base.ts +++ b/packages/sushi/src/router/rain/AlgebraV1Base.ts @@ -16,7 +16,7 @@ import { PoolFilter, StaticPoolUniV3, } from '../liquidity-providers/UniswapV3Base.js' -import { RainUniswapV3BaseProvider, RainV3Pool } from './RainUniswapV3Base.js' +import { RainV3Pool, UniswapV3BaseProvider } from './UniswapV3Base.js' export const AlgebraEventsAbi = [ parseAbiItem( @@ -72,7 +72,7 @@ export const globalStateAbi = [ }, ] as const -export abstract class AlgebraV1BaseProvider extends RainUniswapV3BaseProvider { +export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { override TICK_SPACINGS: Record = {} override eventsAbi = AlgebraEventsAbi as any @@ -117,6 +117,11 @@ export abstract class AlgebraV1BaseProvider extends RainUniswapV3BaseProvider { staticPools.map((pool) => pool.address.toLowerCase()), ) + // filter out cached pools + if (!options?.ignoreCache) { + staticPools = this.filterCachedPools(staticPools) + } + const globalStateData = { multicallAddress: this.client.chain?.contracts?.multicall3?.address!, allowFailure: true, @@ -147,37 +152,28 @@ export abstract class AlgebraV1BaseProvider extends RainUniswapV3BaseProvider { const existingPools: RainV3Pool[] = [] staticPools.forEach((pool, i) => { const poolAddress = pool.address.toLowerCase() - if (this.pools.has(poolAddress)) return - if (this.nonExistentPools.get(poolAddress) ?? 0 > 1) return if (globalState === undefined || !globalState[i]) { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } let tickSpacing = this.DEFAULT_TICK_SPACING - if (tickSpacings?.[i] !== undefined) { - const ts = tickSpacings[i] - if (typeof ts === 'number') { - tickSpacing = ts - } else { - if (ts?.status === 'success') { - tickSpacing = ts.result - } - } + if (typeof tickSpacings?.[i]?.result === 'number') { + tickSpacing = tickSpacings[i]!.result! } const sqrtPriceX96 = globalState[i]!.result?.[0] // price const tick = globalState[i]!.result?.[1] // tick if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } const fee = globalState[i]!.result?.[2] // fee if (!fee) { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } const activeTick = this.getActiveTick(tick, tickSpacing) if (typeof activeTick !== 'number') { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } existingPools.push({ diff --git a/packages/sushi/src/router/rain/RainDataFetcher.test.ts b/packages/sushi/src/router/rain/RainDataFetcher.test.ts new file mode 100644 index 0000000000..1e538797b5 --- /dev/null +++ b/packages/sushi/src/router/rain/RainDataFetcher.test.ts @@ -0,0 +1,184 @@ +import { PublicClient, createPublicClient } from 'viem' +import { beforeEach, describe, expect, it } from 'vitest' +import { ChainId } from '../../chain/constants.js' +import { ROUTE_PROCESSOR_4_ADDRESS } from '../../config/route-processor.js' +import { publicClientConfig } from '../../config/viem.js' +import { Token } from '../../currency/Token.js' +import { USDC, WNATIVE } from '../../currency/tokens.js' +import { LiquidityProviders } from '../liquidity-providers/index.js' +import { Router } from '../router.js' +import { RainDataFetcher } from './RainDataFetcher.js' + +describe('RainDataFetcher tests', async () => { + // we test on Base chain because it has at least one of each dex type + const client = createPublicClient(publicClientConfig[ChainId.BASE]) + + // 3000 blocks apart, to test pool data updates by event logs + const currentBlockNumber = await client.getBlockNumber() + const oldBlockNumber = currentBlockNumber - 3000n + + const fromToken = USDC[ChainId.BASE] + const toToken = WNATIVE[ChainId.BASE] + const amountIn = 10_000_000n // 10 USDC + const gasPrice = 30_000_000n + + // one of each type + const protocols = { + univ2: LiquidityProviders.UniswapV2, // Univ2 + univ3: LiquidityProviders.UniswapV3, // Univ3 + algebra: LiquidityProviders.KimV4, // Algebra + slipstream: LiquidityProviders.AerodromeSlipstream, // Slipstream + } + + // wait 60 sec before each test to avoid rpc ratelimiting + beforeEach(async () => { + await new Promise((resolve) => setTimeout(() => resolve(1), 60_000)) + }) + + it('should correctly update pools data by logs for Univ2 protocol', async () => { + await testRainDataFetcher( + [protocols.univ2], + client, + fromToken, + toToken, + amountIn, + gasPrice, + currentBlockNumber, + oldBlockNumber, + ) + }) + + it('should correctly update pools data by logs for Univ3 protocol', async () => { + await testRainDataFetcher( + [protocols.univ3], + client, + fromToken, + toToken, + amountIn, + gasPrice, + currentBlockNumber, + oldBlockNumber, + ) + }) + + it('should correctly update pools data by logs for Algebra protocol', async () => { + await testRainDataFetcher( + [protocols.algebra], + client, + fromToken, + toToken, + amountIn, + gasPrice, + currentBlockNumber, + oldBlockNumber, + ) + }) + + it('should correctly update pools data by logs for Slipstream protocol', async () => { + await testRainDataFetcher( + [protocols.slipstream], + client, + fromToken, + toToken, + amountIn, + gasPrice, + currentBlockNumber, + oldBlockNumber, + ) + }) +}) + +async function testRainDataFetcher( + lps: LiquidityProviders[], + client: PublicClient, + fromToken: Token, + toToken: Token, + amountIn: bigint, + gasPrice: bigint, + currentBlockNumber: bigint, + oldBlockNumber: bigint, +) { + // data fetcher without indexer (normal way ie raw pool data fecthed directly by contract calls) + const dataFectherFresh = await RainDataFetcher.init(ChainId.BASE, client, lps) + + // data fetcher with indexer (pool data will be updated from older block to current block by event logs) + const dataFectherIndexer = await RainDataFetcher.init( + ChainId.BASE, + client, + lps, + ) + + // get route at current block height for fresh dataFetcher + const { pcMap: freshPcMap, route: freshRoute } = + await dataFectherFresh.findBestRoute( + ChainId.BASE, + fromToken, + toToken, + amountIn, + gasPrice, + false, + { blockNumber: currentBlockNumber }, + lps, + undefined, + 'single', + ) + + // get route at older block height for indexer dataFetcher, then ensure the + // amount out it gives is different to fresh datafetcher amount out + // and then update the pools data with contract logs from between the blocks + const { route: indexerRouteOld } = await dataFectherIndexer.findBestRoute( + ChainId.BASE, + fromToken, + toToken, + amountIn, + gasPrice, + false, + { blockNumber: oldBlockNumber }, + lps, + undefined, + 'single', + ) + + // should not be equal + // just to make sure that pool data are actually different in current vs old block height + expect(freshRoute.amountOutBI).not.equal(indexerRouteOld.amountOutBI) + + // now get route at current block height for indexer dataFetcher with updating pool data + const { pcMap: indexerPcMap, route: indexerRoute } = + await dataFectherIndexer.findBestRoute( + ChainId.BASE, + fromToken, + toToken, + amountIn, + gasPrice, + true, // update pool data by logs + { blockNumber: currentBlockNumber }, + lps, + undefined, + 'single', + ) + + // assert amount outs and status + expect(freshRoute.status).toEqual(indexerRoute.status) + expect(freshRoute.amountOutBI).toEqual(indexerRoute.amountOutBI) + expect(freshRoute.totalAmountOutBI).toEqual(indexerRoute.totalAmountOutBI) + + // assert produced route code + const freshRpParams = Router.routeProcessor4Params( + freshPcMap, + freshRoute, + fromToken, + toToken, + ROUTE_PROCESSOR_4_ADDRESS[ChainId.BASE], + ROUTE_PROCESSOR_4_ADDRESS[ChainId.BASE], + ) + const indexerRpParams = Router.routeProcessor4Params( + indexerPcMap, + indexerRoute, + fromToken, + toToken, + ROUTE_PROCESSOR_4_ADDRESS[ChainId.BASE], + ROUTE_PROCESSOR_4_ADDRESS[ChainId.BASE], + ) + expect(freshRpParams.routeCode).toEqual(indexerRpParams.routeCode) +} diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts new file mode 100644 index 0000000000..efad4f0b58 --- /dev/null +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -0,0 +1,430 @@ +import { isDeepStrictEqual } from 'util' +import { ParseAbiItem, PublicClient } from 'viem' +import { ChainId } from '../../chain/constants.js' +import { Type } from '../../currency/index.js' +import { MultiRoute } from '../../tines/Graph.js' +import { DataFetcher, DataFetcherOptions } from '../data-fetcher.js' +import { AerodromeSlipstreamProvider } from '../liquidity-providers/AerodromeSlipstream.js' +import { AlienBaseV2Provider } from '../liquidity-providers/AlienBaseV2.js' +import { AlienBaseV3Provider } from '../liquidity-providers/AlienBaseV3.js' +import { ApeSwapProvider } from '../liquidity-providers/ApeSwap.js' +import { BSCSwapProvider } from '../liquidity-providers/BSCSwap.js' +import { BakerySwapProvider } from '../liquidity-providers/BakerySwap.js' +import { BaseSwapProvider } from '../liquidity-providers/BaseSwap.js' +import { BaseSwapV3Provider } from '../liquidity-providers/BaseSwapV3.js' +import { BiswapProvider } from '../liquidity-providers/Biswap.js' +import { BladeSwapProvider } from '../liquidity-providers/BladeSwap.js' +import { BlastDEXProvider } from '../liquidity-providers/BlastDEX.js' +import { BlazeSwapProvider } from '../liquidity-providers/BlazeSwap.js' +import { CORExProvider } from '../liquidity-providers/COREx.js' +import { CroDefiSwapProvider } from '../liquidity-providers/CroDefiSwap.js' +import { DackieSwapV2Provider } from '../liquidity-providers/DackieSwapV2.js' +import { DackieSwapV3Provider } from '../liquidity-providers/DackieSwapV3.js' +import { DfynProvider } from '../liquidity-providers/Dfyn.js' +import { DovishV3Provider } from '../liquidity-providers/DovishV3.js' +import { DyorV2Provider } from '../liquidity-providers/DyorV2.js' +import { EddyFinanceProvider } from '../liquidity-providers/EddyFinance.js' +import { ElkProvider } from '../liquidity-providers/Elk.js' +import { EnosysProvider } from '../liquidity-providers/Enosys.js' +import { FenixProvider } from '../liquidity-providers/Fenix.js' +import { GlyphV4Provider } from '../liquidity-providers/GlyphV4.js' +import { GravityFinanceProvider } from '../liquidity-providers/GravityFinance.js' +import { HoneySwapProvider } from '../liquidity-providers/HoneySwap.js' +import { HorizonProvider } from '../liquidity-providers/Horizon.js' +import { HyperBlastProvider } from '../liquidity-providers/HyperBlast.js' +import { JetSwapProvider } from '../liquidity-providers/JetSwap.js' +import { KimV4Provider } from '../liquidity-providers/KimV4.js' +import { KinetixV2Provider } from '../liquidity-providers/KinetixV2.js' +import { KinetixV3Provider } from '../liquidity-providers/KinetixV3.js' +import { KwikswapProvider } from '../liquidity-providers/Kwikswap.js' +import { LaserSwapV2Provider } from '../liquidity-providers/LaserSwap.js' +import { LiquidityProviders } from '../liquidity-providers/LiquidityProvider.js' +import { LynexV1Provider } from '../liquidity-providers/LynexV1.js' +import { LynexV2Provider } from '../liquidity-providers/LynexV2.js' +import { MMFinanceProvider } from '../liquidity-providers/MMFinance.js' +import { MSwapProvider } from '../liquidity-providers/MSwap.js' +import { MonoswapV2Provider } from '../liquidity-providers/MonoSwapV2.js' +import { MonoswapV3Provider } from '../liquidity-providers/MonoSwapV3.js' +import { NativeWrapProvider } from '../liquidity-providers/NativeWrapProvider.js' +import { NetSwapProvider } from '../liquidity-providers/NetSwap.js' +import { NineInchProvider } from '../liquidity-providers/NineInch.js' +import { PancakeSwapV2Provider } from '../liquidity-providers/PancakeSwapV2.js' +import { PancakeSwapV3Provider } from '../liquidity-providers/PancakeSwapV3.js' +import { PangolinProvider } from '../liquidity-providers/Pangolin.js' +import { QuickSwapV2Provider } from '../liquidity-providers/QuickSwapV2.js' +import { QuickSwapV3Provider } from '../liquidity-providers/QuickswapV3.js' +import { RingExchangeV2Provider } from '../liquidity-providers/RingExchangeV2.js' +import { RingExchangeV3Provider } from '../liquidity-providers/RingExchangeV3.js' +import { ScribeProvider } from '../liquidity-providers/Scribe.js' +import { ShibaSwapProvider } from '../liquidity-providers/ShibaSwap.js' +import { SolarbeamProvider } from '../liquidity-providers/Solarbeam.js' +import { SparkDexV2Provider } from '../liquidity-providers/SparkDexV2.js' +import { SparkDexV3Provider } from '../liquidity-providers/SparkDexV3.js' +import { SparkDexV3_1Provider } from '../liquidity-providers/SparkDexV3_1.js' +import { SpookySwapV2Provider } from '../liquidity-providers/SpookySwapV2.js' +import { SpookySwapV3Provider } from '../liquidity-providers/SpookySwapV3.js' +import { SquadSwapV2Provider } from '../liquidity-providers/SquadSwapV2.js' +import { SushiSwapV2Provider } from '../liquidity-providers/SushiSwapV2.js' +import { SushiSwapV3Provider } from '../liquidity-providers/SushiSwapV3.js' +import { SwapBlastProvider } from '../liquidity-providers/SwapBlast.js' +import { SwapsicleProvider } from '../liquidity-providers/Swapsicle.js' +import { + ThrusterV2_1Provider, + ThrusterV2_3Provider, +} from '../liquidity-providers/ThrusterV2.js' +import { ThrusterV3Provider } from '../liquidity-providers/ThrusterV3.js' +import { TraderJoeProvider } from '../liquidity-providers/TraderJoe.js' +import { UbeSwapProvider } from '../liquidity-providers/UbeSwap.js' +import { UniswapV2Provider } from '../liquidity-providers/UniswapV2.js' +import { UniswapV3Provider } from '../liquidity-providers/UniswapV3.js' +import { VVSFlawlessProvider } from '../liquidity-providers/VVSFlawless.js' +import { VVSStandardProvider } from '../liquidity-providers/VVSStandard.js' +import { VelodromeSlipstreamProvider } from '../liquidity-providers/VelodromeSlipstream.js' +import { WagmiProvider } from '../liquidity-providers/Wagmi.js' +import { WigoswapProvider } from '../liquidity-providers/Wigoswap.js' +import { ZebraV2Provider } from '../liquidity-providers/ZebraV2.js' +import { PoolCode } from '../pool-codes/PoolCode.js' +import { PoolFilter, Router } from '../router.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' +import { UniswapV3BaseProvider } from './UniswapV3Base.js' +import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' + +export class RainDataFetcher extends DataFetcher { + eventsAbi: ParseAbiItem[] = [] + + /** + * Creates an instance of RainDataFecther, constructor of this class should + * not generally be used, instead, use this method to create a new instance + * @param chainId - The chain id + * @param publicClient - (optional) The viem client + * @param liquidityProviders - (optional) List of liquidity providers, includes all if undefined + * @returns A new instance of RainDataFetcher + */ + static async init( + chainId: ChainId, + publicClient?: PublicClient, + liquidityProviders?: LiquidityProviders[], + ): Promise { + const dataFetcher = new RainDataFetcher(chainId, publicClient) + await dataFetcher.initProviders(liquidityProviders) + dataFetcher.startDataFetching(liquidityProviders) + return dataFetcher + } + + /** + * Initializes list of liquidity providers + * @param providers - (optional) List of liquidity providers, includes all if undefined + */ + async initProviders(providers?: LiquidityProviders[]) { + this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] + const allProviders = [ + AerodromeSlipstreamProvider, + AlienBaseV2Provider, + AlienBaseV3Provider, + ApeSwapProvider, + BakerySwapProvider, + BaseSwapProvider, + BaseSwapV3Provider, + BiswapProvider, + BladeSwapProvider, + BlastDEXProvider, + BlazeSwapProvider, + BSCSwapProvider, + // CamelotProvider, + CORExProvider, + CroDefiSwapProvider, + // CurveProvider, + DackieSwapV2Provider, + DackieSwapV3Provider, + DfynProvider, + DovishV3Provider, + DyorV2Provider, + EddyFinanceProvider, + ElkProvider, + EnosysProvider, + FenixProvider, + GlyphV4Provider, + GravityFinanceProvider, + HoneySwapProvider, + HorizonProvider, + HyperBlastProvider, + JetSwapProvider, + KimV4Provider, + KinetixV2Provider, + KinetixV3Provider, + KwikswapProvider, + LaserSwapV2Provider, + LynexV1Provider, + LynexV2Provider, + MMFinanceProvider, + MonoswapV2Provider, + MonoswapV3Provider, + MSwapProvider, + NetSwapProvider, + NineInchProvider, + PancakeSwapV2Provider, + PancakeSwapV3Provider, + PangolinProvider, + QuickSwapV2Provider, + QuickSwapV3Provider, + RingExchangeV2Provider, + RingExchangeV3Provider, + ScribeProvider, + ShibaSwapProvider, + SolarbeamProvider, + SparkDexV2Provider, + SparkDexV3Provider, + SparkDexV3_1Provider, + SpookySwapV2Provider, + SpookySwapV3Provider, + SquadSwapV2Provider, + SushiSwapV2Provider, + SushiSwapV3Provider, + SwapBlastProvider, + SwapsicleProvider, + ThrusterV2_1Provider, + ThrusterV2_3Provider, + ThrusterV3Provider, + TraderJoeProvider, + // TridentProvider, + UbeSwapProvider, + UniswapV2Provider, + UniswapV3Provider, + VelodromeSlipstreamProvider, + VVSStandardProvider, + VVSFlawlessProvider, + WagmiProvider, + WigoswapProvider, + ZebraV2Provider, + ] + + const _pendings = [] + const _providers = [] + const blockNumber = await this.web3Client.getBlockNumber() + for (const p of allProviders) { + try { + const provider = new p(this.chainId, this.web3Client) + if ( + // If none passed, include all + !providers || + this._providerIsIncluded(provider.getType(), providers) + ) { + _pendings.push(provider.init(blockNumber)) + _providers?.push(provider) + } + } catch (_e: unknown) {} + } + + for (let i = 0; i < _pendings.length; i++) { + const provider = _providers[i]! + await _pendings[i]?.catch(() => { + console.warn(`Failed to initialize ${provider.getPoolProviderName()}`) + }) + if (provider.initialized) { + this.providers.push(provider) + + // gather unique instances of liquidity provider events abi + if (provider?.eventsAbi?.length) { + ;(provider.eventsAbi as any[]).forEach((abi) => { + if (this.eventsAbi.every((v) => !isDeepStrictEqual(v, abi))) { + this.eventsAbi.push(abi) + } + }) + } + } + } + } + + /** + * Updates the pools data of all the liquidity providers until the given block number + * @param untilBlock - (optional) The block number to update to, if left undefined, + * pools data will be updated to latest block number + */ + async updatePools(untilBlock?: bigint) { + let fromBlock = -1n + const addresses: string[] = [] + if (typeof untilBlock !== 'bigint') { + untilBlock = await this.web3Client.getBlockNumber() + } + + // gather all provider factory and pools addresses + this.providers.forEach((provider: any) => { + if ( + provider instanceof UniswapV2BaseProvider || + provider instanceof UniswapV3BaseProvider + ) { + const factory = + provider.factory[ + this.chainId as keyof typeof provider.factory + ]!.toLowerCase() + if (!addresses.includes(factory)) { + addresses.push(factory) + } + const pools = provider.pools + pools.forEach((pool, address) => { + if (!addresses.includes(address)) { + addresses.push(address) + } + if (fromBlock === -1n) { + fromBlock = pool.blockNumber + } + if (pool.blockNumber < fromBlock) { + fromBlock = pool.blockNumber + } + }) + + if (provider instanceof VelodromeSlipstreamBaseProvider) { + const swapFeeModule = + provider.swapFeeModule[ + this.chainId as keyof typeof provider.swapFeeModule + ]!.toLowerCase() + if (!addresses.includes(swapFeeModule)) { + addresses.push(swapFeeModule) + } + } + } + }) + if (!addresses.length) return + if (fromBlock === untilBlock) return + if (fromBlock > untilBlock) { + throw [ + 'pools data are cached at higher block height than the given untilBlock', + 'if you wish to get pools data at untilBlock', + 'consider first resetting the cached data and then getting pools data at your desired block height', + ].join(', ') + } + + // get logs and sort them from earliest block to latest + const logs = await this.web3Client.getLogs({ + events: this.eventsAbi, + address: addresses as `0x${string}`[], + fromBlock, + toBlock: untilBlock, + }) + logs.sort((a, b) => { + const diff = a.blockNumber - b.blockNumber + if (diff === 0n) { + return a.logIndex - b.logIndex + } else { + return Number(diff) + } + }) + + // process each log for each provider + logs.forEach((log) => { + this.providers.forEach((p) => { + p.processLog(log) + }) + }) + const results = await Promise.allSettled( + this.providers.map((p) => p.afterProcessLog(untilBlock!)), + ) + results.forEach((res, i) => { + if (res.status === 'fulfilled') { + const provider = this.providers[i] + if ( + provider instanceof UniswapV2BaseProvider || + provider instanceof UniswapV3BaseProvider + ) { + provider.pools.forEach((pool) => { + pool.blockNumber = untilBlock! + }) + } + } + }) + } + + /** + * Resets this instance's liquidity providers cached pools data + */ + reset() { + this.providers.forEach((provider) => { + if ( + provider instanceof UniswapV2BaseProvider || + provider instanceof UniswapV3BaseProvider + ) { + provider.reset() + } + }) + } + + /** + * Get route and poolcode map for the given tokens and amount + * @param chainId - The network chain id + * @param fromToken - The from token + * @param toToken - The to token + * @param amountIn - The sell amount, of fromToken + * @param gasPrice - Gas price + * @param update - (optional) Whether or not pool should be updated before finding route, default is false + * @param options - (optional) options for fetching new pools data + * @param lps - (optional) List of liquidity providers, includes all if undefined + * @param poolFilter - (optional) A function to filter pools + * @param routeType - (optional) single (default) picks the best route with no breadth, multi + * picks the best route with breadth, set undefined for picking the better of the two + */ + async findBestRoute( + chainId: ChainId, + fromToken: Type, + toToken: Type, + amountIn: bigint, + gasPrice: bigint, + update = false, + options?: DataFetcherOptions, + lps?: LiquidityProviders[], + poolFilter?: PoolFilter, + routeType: 'single' | 'multi' = 'single', + ): Promise<{ + /** The route */ + route: MultiRoute + /** + * The PoolCode map, which is a map of all available pools + * with their details for the given token pair to route among + */ + pcMap: Map + }> { + const opts = { ...options } + if (typeof opts.blockNumber !== 'bigint') { + opts.blockNumber = await this.web3Client.getBlockNumber() + } + + if (update) await this.updatePools(opts.blockNumber) + await this.fetchPoolsForToken(fromToken, toToken, undefined, opts) + + const pcMap = this.getCurrentPoolCodeMap(fromToken, toToken) + const route = Router.findBestRoute( + pcMap, + chainId, + fromToken, + amountIn, + toToken, + Number(gasPrice), + lps, + poolFilter, + undefined, + routeType, + ) + return { pcMap: pcMap, route } + } + + static override onChain(chainId: ChainId): RainDataFetcher { + return new RainDataFetcher(chainId) + } + + override startDataFetching(_providers?: LiquidityProviders[]) { + this.providers.forEach((p) => p.startFetchPoolsData()) + this.stopDataFetching() + } + + override async fetchPoolsForToken( + currency0: Type, + currency1: Type, + excludePools?: Set, + options?: DataFetcherOptions, + ): Promise { + const opts = { ...options } + if (typeof opts.blockNumber !== 'bigint') { + opts.blockNumber = await this.web3Client.getBlockNumber() + } + await super.fetchPoolsForToken(currency0, currency1, excludePools, opts) + } +} diff --git a/packages/sushi/src/router/rain/RainUniswapV2Base.ts b/packages/sushi/src/router/rain/UniswapV2Base.ts similarity index 76% rename from packages/sushi/src/router/rain/RainUniswapV2Base.ts rename to packages/sushi/src/router/rain/UniswapV2Base.ts index 029195737f..19ccb7c413 100644 --- a/packages/sushi/src/router/rain/RainUniswapV2Base.ts +++ b/packages/sushi/src/router/rain/UniswapV2Base.ts @@ -5,7 +5,7 @@ import { DataFetcherOptions } from '../data-fetcher.js' import { filterOnDemandPools } from '../lib/api.js' import { StaticPool, - UniswapV2BaseProvider, + UniswapV2BaseProvider as _UniswapV2BaseProvider, } from '../liquidity-providers/UniswapV2Base.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' @@ -23,8 +23,8 @@ export const UniV2EventsAbi = [ ), ] -export abstract class RainUniswapV2BaseProvider extends UniswapV2BaseProvider { - nonExistentPools: Map = new Map() +export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { + nullPools: Map = new Map() pools: Map = new Map() eventsAbi = UniV2EventsAbi @@ -58,22 +58,20 @@ export abstract class RainUniswapV2BaseProvider extends UniswapV2BaseProvider { this.getTradeId(t0, t1), pools.map((pool) => pool.address.toLowerCase() as `0x${string}`), ) - const poolCodesToCreate: RainV2Pool[] = [] - pools.forEach((pool) => { - const existingPool = this.pools.get(pool.address.toLowerCase()) - const nonExistentPool = this.nonExistentPools.get( - pool.address.toLowerCase(), - ) - if ( - existingPool === undefined && - (!nonExistentPool || nonExistentPool < 2) - ) { - poolCodesToCreate.push({ + + // filter out cached pools + if (!options?.ignoreCache) { + pools = this.filterCachedPools(pools as StaticPool[]) + } + + const poolCodesToCreate = pools.map( + (pool) => + ({ ...pool, blockNumber: options?.blockNumber ?? 0n, - } as RainV2Pool) - } - }) + }) as RainV2Pool, + ) + if (!poolCodesToCreate.length) return const reserves = await this.getReserves( poolCodesToCreate.map((v) => v.address), @@ -121,7 +119,7 @@ export abstract class RainUniswapV2BaseProvider extends UniswapV2BaseProvider { abi: this.eventsAbi, eventName: 'PairCreated', })[0]! - this.nonExistentPools.delete(event.args[2].toLowerCase()) + this.nullPools.delete(event.args[2].toLowerCase()) } catch {} } else { const pool = this.pools.get(logAddress as `0x${string}`) @@ -144,28 +142,44 @@ export abstract class RainUniswapV2BaseProvider extends UniswapV2BaseProvider { setPool(poolCodesToCreate: RainV2Pool[], reserves: any[]) { poolCodesToCreate.forEach((pool, i) => { + const poolAddress = pool.address.toLowerCase() const res0 = reserves?.[i]?.result?.[0] const res1 = reserves?.[i]?.result?.[1] if (res0 !== undefined && res1 !== undefined) { - this.pools.set(pool.address.toLowerCase(), { + this.pools.set(poolAddress, { ...pool, reserve0: res0, reserve1: res1, }) } else { - const nonExistentPool = this.nonExistentPools.get( - pool.address.toLowerCase(), - ) - if (nonExistentPool) { - this.nonExistentPools.set( - pool.address.toLowerCase(), - nonExistentPool + 1, - ) - } else { - this.nonExistentPools.set(pool.address.toLowerCase(), 1) - } + this.handleNullPool(poolAddress) } }) } + + handleNullPool(poolAddress: string) { + const v = this.nullPools.get(poolAddress) + if (v) { + this.nullPools.set(poolAddress, v + 1) + } else { + this.nullPools.set(poolAddress, 1) + } + } + + filterCachedPools(pools: StaticPool[]) { + return pools.filter((pool) => { + const poolAddress = pool.address.toLowerCase() + if (this.pools.has(poolAddress)) return false + const nullPool = this.nullPools.get(poolAddress) + if (typeof nullPool === 'number' && nullPool > 1) return false + return true + }) + } + + reset() { + this.pools.clear() + this.poolsByTrade.clear() + this.nullPools.clear() + } } diff --git a/packages/sushi/src/router/rain/RainUniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts similarity index 87% rename from packages/sushi/src/router/rain/RainUniswapV3Base.ts rename to packages/sushi/src/router/rain/UniswapV3Base.ts index 862409329b..775b56e20b 100644 --- a/packages/sushi/src/router/rain/RainUniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -1,5 +1,5 @@ import { Address, Log, parseAbiItem, parseEventLogs } from 'viem' -import { erc20Abi, tickLensAbi } from '../../abi/index.js' +import { erc20Abi, slot0Abi, tickLensAbi } from '../../abi/index.js' import { Token } from '../../currency/index.js' import { CLTick, RToken, UniV3Pool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' @@ -7,7 +7,7 @@ import { NUMBER_OF_SURROUNDING_TICKS, PoolFilter, StaticPoolUniV3, - UniswapV3BaseProvider, + UniswapV3BaseProvider as _UniswapV3BaseProvider, V3Pool, bitmapIndex, } from '../liquidity-providers/UniswapV3Base.js' @@ -57,9 +57,9 @@ export const UniV3EventsAbi = [ ), ] -export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { +export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { pools: Map = new Map() - nonExistentPools: Map = new Map() + nullPools: Map = new Map() eventsAbi = UniV3EventsAbi newTicksQueue: [RainV3Pool, number[]][] = [] @@ -85,6 +85,11 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { staticPools.map((pool) => pool.address.toLowerCase()), ) + // filter out cached pools + if (!options?.ignoreCache) { + staticPools = this.filterCachedPools(staticPools) + } + const slot0 = await this.client .multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 @@ -96,43 +101,7 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { ({ address: pool.address as Address, chainId: this.chainId, - abi: [ - { - inputs: [], - name: 'slot0', - outputs: [ - { - internalType: 'uint160', - name: 'sqrtPriceX96', - type: 'uint160', - }, - { internalType: 'int24', name: 'tick', type: 'int24' }, - { - internalType: 'uint16', - name: 'observationIndex', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'observationCardinality', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'observationCardinalityNext', - type: 'uint16', - }, - { - internalType: 'uint8', - name: 'feeProtocol', - type: 'uint8', - }, - { internalType: 'bool', name: 'unlocked', type: 'bool' }, - ], - stateMutability: 'view', - type: 'function', - }, - ], + abi: slot0Abi, functionName: 'slot0', }) as const, ), @@ -146,38 +115,23 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { return undefined }) - const tickSpacings = await this.getTickSpacing(staticPools, options) - const existingPools: RainV3Pool[] = [] - staticPools.forEach((pool, i) => { const poolAddress = pool.address.toLowerCase() - if (this.pools.has(poolAddress)) return - if (this.nonExistentPools.get(poolAddress) ?? 0 > 1) return if (slot0 === undefined || !slot0[i]) { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } const sqrtPriceX96 = slot0[i]!.result?.[0] const tick = slot0[i]!.result?.[1] if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } - let tickSpacing = this.TICK_SPACINGS[pool.fee]! - if (typeof tickSpacings?.[i] !== 'undefined') { - const ts = tickSpacings[i] - if (typeof ts === 'number') { - tickSpacing = ts - } else { - if (ts?.status === 'success') { - tickSpacing = ts.result - } - } - } + const tickSpacing = this.TICK_SPACINGS[pool.fee]! const activeTick = this.getActiveTick(tick, tickSpacing) if (typeof activeTick !== 'number') { - this.handleNonExistentPool(poolAddress) + this.handleNullPool(poolAddress) return } existingPools.push({ @@ -455,32 +409,31 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { return poolTicks } - // fetches pool tickSpacing, this will be used - // instead of hardcoded TICK_SPACINGS values async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { - const calldata = { - multicallAddress: this.client.chain?.contracts?.multicall3 - ?.address as Address, - allowFailure: true, - blockNumber: options?.blockNumber, - contracts: pools.map( - (pool) => - ({ - address: pool.address as Address, - chainId: this.chainId, - abi: tickSpacingAbi, - functionName: 'tickSpacing', - }) as const, - ), - } - return await this.client.multicall(calldata).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + return await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3 + ?.address as Address, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: pools.map( + (pool) => + ({ + address: pool.address as Address, + chainId: this.chainId, + abi: tickSpacingAbi, + functionName: 'tickSpacing', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) } getMaxTickDiapason(tick: number, pool: RainV3Pool): CLTick[] { @@ -530,7 +483,7 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { abi: this.eventsAbi, eventName: 'PoolCreated', })[0]! - this.nonExistentPools.delete(event.args.pool.toLowerCase()) + this.nullPools.delete(event.args.pool.toLowerCase()) } catch {} } else { const pool = this.pools.get(logAddress) as RainV3Pool | undefined @@ -749,12 +702,28 @@ export abstract class RainUniswapV3BaseProvider extends UniswapV3BaseProvider { return positiveFirst ? res : -res } - handleNonExistentPool(poolAddress: string) { - const v = this.nonExistentPools.get(poolAddress) + handleNullPool(poolAddress: string) { + const v = this.nullPools.get(poolAddress) if (v) { - this.nonExistentPools.set(poolAddress, v + 1) + this.nullPools.set(poolAddress, v + 1) } else { - this.nonExistentPools.set(poolAddress, 1) + this.nullPools.set(poolAddress, 1) } } + + filterCachedPools(pools: StaticPoolUniV3[]) { + return pools.filter((pool) => { + const poolAddress = pool.address.toLowerCase() + if (this.pools.has(poolAddress)) return false + const nullPool = this.nullPools.get(poolAddress) + if (typeof nullPool === 'number' && nullPool > 1) return false + return true + }) + } + + reset() { + this.pools.clear() + this.poolsByTrade.clear() + this.nullPools.clear() + } } diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts new file mode 100644 index 0000000000..9eca8a84ba --- /dev/null +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -0,0 +1,619 @@ +import { + Address, + Hex, + Log, + PublicClient, + encodeAbiParameters, + getAddress, + keccak256, + parseAbiItem, + parseAbiParameters, + parseEventLogs, +} from 'viem' +import { ChainId } from '../../chain/index.js' +import { Token } from '../../currency/index.js' +import { DataFetcherOptions } from '../data-fetcher.js' +import { getCurrencyCombinations } from '../get-currency-combinations.js' +import { + PoolFilter, + StaticPoolUniV3, +} from '../liquidity-providers/UniswapV3Base.js' +import { + RainV3Pool, + UniV3EventsAbi, + UniswapV3BaseProvider, +} from './UniswapV3Base.js' + +export const ZERO_FEE_INDICATOR = 420 + +export enum FeeType { + Default = 0, + Dynamic = 1, + Zero = 2, +} + +export interface StaticSlipstreamPool extends StaticPoolUniV3 { + tickSpacing: number + feeType: FeeType +} + +export interface SlipstreamPool extends RainV3Pool { + feeType: FeeType +} + +const feeAbi = [ + { + inputs: [], + name: 'fee', + outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +const slot0Abi = [ + { + inputs: [], + name: 'slot0', + outputs: [ + { internalType: 'uint160', name: 'sqrtPriceX96', type: 'uint160' }, + { internalType: 'int24', name: 'tick', type: 'int24' }, + { internalType: 'uint16', name: 'observationIndex', type: 'uint16' }, + { + internalType: 'uint16', + name: 'observationCardinality', + type: 'uint16', + }, + { + internalType: 'uint16', + name: 'observationCardinalityNext', + type: 'uint16', + }, + { internalType: 'bool', name: 'unlocked', type: 'bool' }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const + +const SlipstreamEventsAbi = [ + ...UniV3EventsAbi.slice(0, -1), // univ3 shared events except PoolCreated + parseAbiItem( + 'event PoolCreated(address indexed token0, address indexed token1, int24 indexed tickSpacing, address pool)', + ), + parseAbiItem( + 'event TickSpacingEnabled(int24 indexed tickSpacing, uint24 indexed fee)', + ), + parseAbiItem('event CustomFeeSet(address indexed pool, uint24 indexed fee)'), + parseAbiItem( + 'event SwapFeeModuleChanged(address indexed oldFeeModule, address indexed newFeeModule)', + ), +] + +export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvider { + readonly BASE_FEE = 100 + DEFAULT_TICK_SPACINGS = [1, 50, 100, 200, 2000] as const + tickSpacings: number[] = [...this.DEFAULT_TICK_SPACINGS] + + feeSpacingMap: Record = {} // fee to tick spacing map + spacingFeeMap: Record = {} // tick spacing to fee map + + poolImplementation: Record = {} + swapFeeModule: Record = {} + + override eventsAbi = SlipstreamEventsAbi as any + + constructor( + chainId: ChainId, + web3Client: PublicClient, + factory: Record, + tickLens: Record, + isTest = false, + ) { + super( + chainId, + web3Client, + factory, + { [chainId]: `0x${'0'.repeat(64)}` }, + tickLens, + isTest, + ) + } + + override async init(blockNumber?: bigint) { + if (!this.initialized) { + if (!this.poolImplementation[this.chainId]) { + const poolImplementation = await this.client + .readContract({ + address: this.factory[this.chainId as keyof typeof this.factory]!, + blockNumber, + abi: [ + { + inputs: [], + name: 'poolImplementation', + outputs: [ + { internalType: 'address', name: '', type: 'address' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'poolImplementation', + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + if (!poolImplementation) return + this.poolImplementation[this.chainId] = poolImplementation + } + + if (!this.swapFeeModule[this.chainId]) { + const swapFeeModule = await this.client + .readContract({ + address: this.factory[this.chainId as keyof typeof this.factory]!, + blockNumber, + abi: [ + { + inputs: [], + name: 'swapFeeModule', + outputs: [ + { internalType: 'address', name: '', type: 'address' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'swapFeeModule', + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + if (!swapFeeModule) return + this.swapFeeModule[this.chainId] = swapFeeModule + } + + if (!this.tickSpacings) { + const tickSpacings = await this.client + .readContract({ + address: this.factory[this.chainId as keyof typeof this.factory]!, + blockNumber, + abi: [ + { + inputs: [], + name: 'tickSpacings', + outputs: [ + { internalType: 'int24[]', name: '', type: 'int24[]' }, + ], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'tickSpacings', + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + this.tickSpacings = (tickSpacings ?? + this.DEFAULT_TICK_SPACINGS) as number[] + } + + if (!Object.values(this.feeSpacingMap).length) { + const fees = await this.client + .multicall({ + multicallAddress: + this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber, + contracts: this.tickSpacings.map((spacing) => ({ + address: this.factory[this.chainId as keyof typeof this.factory]!, + chainId: this.chainId, + abi: [ + { + inputs: [{ internalType: 'int24', name: '', type: 'int24' }], + name: 'tickSpacingToFee', + outputs: [ + { internalType: 'uint24', name: '', type: 'uint24' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'tickSpacingToFee', + args: [spacing], + })), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + if (!fees) return + for (let i = 0; i < this.tickSpacings.length; i++) { + const fee = fees?.[i]?.result + const tickSpacing = this.tickSpacings[i] + if (typeof fee === 'number' && typeof tickSpacing === 'number') { + this.feeSpacingMap[fee] = tickSpacing + this.spacingFeeMap[tickSpacing] = fee + } + } + } + this.initialized = true + } + } + + override async fetchPoolData( + t0: Token, + t1: Token, + excludePools?: Set | PoolFilter, + options?: DataFetcherOptions, + ): Promise { + await this.init(options?.blockNumber) + + let staticPools = this.getStaticPools(t0, t1) + if (excludePools) + staticPools = staticPools.filter((p) => !excludePools.has(p.address)) + + const tradeId = this.getTradeId(t0, t1) + if (!this.poolsByTrade.has(tradeId)) + this.poolsByTrade.set( + tradeId, + staticPools.map((pool) => pool.address.toLowerCase()), + ) + + // filter out cached pools + if (!options?.ignoreCache) { + staticPools = this.filterCachedPools( + staticPools, + ) as StaticSlipstreamPool[] + } + + const slot0 = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map((pool) => ({ + address: pool.address, + chainId: this.chainId, + abi: slot0Abi, + functionName: 'slot0', + })), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const feeTypes = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools.map( + (pool) => + ({ + address: this.swapFeeModule[this.chainId]!, + chainId: this.chainId, + abi: [ + { + inputs: [ + { internalType: 'address', name: '_pool', type: 'address' }, + ], + name: 'customFee', + outputs: [ + { internalType: 'uint24', name: '', type: 'uint24' }, + ], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'customFee', + args: [pool.address], + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + staticPools.forEach((pool, i) => { + const result = feeTypes?.[i]?.result + if (typeof result === 'number') { + if (result === 0) pool.feeType = FeeType.Default + else if (result === ZERO_FEE_INDICATOR) pool.feeType = FeeType.Zero + else pool.feeType = FeeType.Dynamic + } + }) + + // get pool fees for dynamic fee type pools + const poolFees = await this.client + .multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: options?.blockNumber, + contracts: staticPools + .filter((pool) => pool.feeType === FeeType.Dynamic) + .map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: feeAbi, + functionName: 'fee', + }) as const, + ), + }) + .catch((e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) + + const existingPools: SlipstreamPool[] = [] + staticPools.forEach((pool, i) => { + const poolAddress = pool.address.toLowerCase() + if (slot0 === undefined || !slot0[i]) { + this.handleNullPool(poolAddress) + return + } + + if (slot0 === undefined || !slot0[i]) { + this.handleNullPool(poolAddress) + return + } + const sqrtPriceX96 = slot0[i]!.result?.[0] // price + const tick = slot0[i]!.result?.[1] // tick + if (!sqrtPriceX96 || sqrtPriceX96 === 0n || typeof tick !== 'number') { + this.handleNullPool(poolAddress) + return + } + + const activeTick = Math.floor(tick / pool.tickSpacing) * pool.tickSpacing + if (typeof activeTick !== 'number') { + this.handleNullPool(poolAddress) + return + } + + const fee = (() => { + if (pool.feeType === FeeType.Zero) { + return 0 + } else if (pool.feeType === FeeType.Default) { + return this.spacingFeeMap[pool.tickSpacing]! + } else if (pool.feeType === FeeType.Dynamic) { + const _fee = poolFees?.shift()?.result + if (typeof _fee === 'number') return _fee + else return undefined + } else { + return this.spacingFeeMap[pool.tickSpacing]! + } + })() + if (typeof fee !== 'number') { + this.handleNullPool(poolAddress) + return + } + + existingPools.push({ + ...pool, + fee, + sqrtPriceX96, + activeTick, + ticks: new Map(), + reserve0: 0n, + reserve1: 0n, + liquidity: 0n, + blockNumber: options?.blockNumber ?? 0n, + feeType: pool.feeType, + }) + }) + + return existingPools + } + + override processLog(log: Log) { + const logAddress = log.address.toLowerCase() + const factory = + this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() + const swapFeeModule = + this.swapFeeModule[ + this.chainId as keyof typeof this.swapFeeModule + ]!.toLowerCase() + if (logAddress === factory || logAddress === swapFeeModule) { + try { + const event = parseEventLogs({ + logs: [log], + abi: SlipstreamEventsAbi, + })[0]! + switch (event.eventName) { + case 'PoolCreated': { + this.nullPools.delete(event.args.pool.toLowerCase()) + break + } + case 'TickSpacingEnabled': { + // new tick spacing enabled + if (!this.tickSpacings.includes(event.args.tickSpacing)) { + this.tickSpacings.push(event.args.tickSpacing) + } + this.feeSpacingMap[event.args.fee] = event.args.tickSpacing + break + } + case 'CustomFeeSet': { + // pool fee update + const pool = this.pools.get( + event.args.pool.toLowerCase(), + ) as SlipstreamPool + if (pool) { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if (event.args.fee === ZERO_FEE_INDICATOR) { + pool.fee = 0 + pool.feeType = FeeType.Zero + } else if (event.args.fee !== 0) { + pool.fee = event.args.fee + pool.feeType = FeeType.Dynamic + } else { + pool.fee = this.spacingFeeMap[pool.tickSpacing]! + pool.feeType = FeeType.Default + } + } + } + break + } + case 'SwapFeeModuleChanged': { + // factory swapFeeMoulde address changed + if ( + this.swapFeeModule[this.chainId]?.toLowerCase() !== + event.args.newFeeModule.toLowerCase() + ) { + // currently sushi can't process it correctly, so we need to reset the cached + // pools as they might have wrong fees after swapFeeModule address is changed + // PS: this event is rare + this.swapFeeModule[this.chainId] = event.args.newFeeModule + this.reset() + } + break + } + default: + } + } catch {} + } else { + super.processLog(log) + } + } + + override async afterProcessLog(untilBlock: bigint) { + const pools: SlipstreamPool[] = [] + this.pools.forEach((pool) => { + if ((pool as SlipstreamPool).feeType === FeeType.Dynamic) { + pools.push(pool as SlipstreamPool) + } + }) + + const [_, poolFees] = await Promise.allSettled([ + // base process + super.afterProcessLog(untilBlock), + // get dynamic pool fees + this.client.multicall({ + multicallAddress: this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: untilBlock, + contracts: pools.map( + (pool) => + ({ + address: pool.address, + chainId: this.chainId, + abi: feeAbi, + functionName: 'fee', + }) as const, + ), + }), + ]) + + // set dynamic pool fees + if (poolFees.status === 'fulfilled') { + pools.forEach((pool, i) => { + const fee = poolFees.value?.[i]?.result + if (typeof fee === 'number') pool.fee = fee + }) + } + } + + override getStaticPools(t1: Token, t2: Token): StaticSlipstreamPool[] { + const allCombinations = getCurrencyCombinations(this.chainId, t1, t2) + const currencyCombinations: [Token, Token, number][] = [] + allCombinations.forEach(([currencyA, currencyB]) => { + if (currencyA && currencyB) { + const tokenA = currencyA.wrapped + const tokenB = currencyB.wrapped + if (tokenA.equals(tokenB)) return + const tokens = tokenA.sortsBefore(tokenB) + ? [tokenA, tokenB] + : [tokenB, tokenA] + currencyCombinations.push( + ...this.tickSpacings.map( + (t) => [...tokens, t] as [Token, Token, number], + ), + ) + } + }) + return currencyCombinations.map(([currencyA, currencyB, tickSpacing]) => ({ + address: this.getSlipstreamPoolAddress( + this.factory[this.chainId as keyof typeof this.factory]!, + currencyA.wrapped, + currencyB.wrapped, + tickSpacing, + ), + token0: currencyA, + token1: currencyB, + fee: this.BASE_FEE, + tickSpacing, + feeType: FeeType.Default, + })) + } + + // algebra doesnt have the fee/ticks setup the same way univ3 has + override async ensureFeeAndTicks(): Promise { + return true + } + + getSlipstreamPoolAddress( + factory: Address, + tokenA: Token, + tokenB: Token, + tickSpacing: number, + ): Address { + const [token0, token1] = tokenA.sortsBefore(tokenB) + ? [tokenA, tokenB] + : [tokenB, tokenA] + const constructorArgumentsEncoded = encodeAbiParameters( + parseAbiParameters('address, address, int24'), + [token0.address, token1.address, tickSpacing], + ) + const initCode = + `0x3d602d80600a3d3981f3363d3d373d3d3d363d73${this.poolImplementation[ + this.chainId as keyof typeof this.poolImplementation + ]!.replace('0x', '')}5af43d82803e903d91602b57fd5bf3` as Hex + const initCodeHash = keccak256(initCode) + + const create2Inputs = [ + '0xff', + factory, + // salt + keccak256(constructorArgumentsEncoded), + // init code hash + initCodeHash, + ] + const sanitizedInputs = `0x${create2Inputs + .map((i) => i.slice(2)) + .join('')}` as Hex + return getAddress(`0x${keccak256(sanitizedInputs).slice(-40)}`) + } +} diff --git a/packages/sushi/src/router/rain/rain-data-fetcher.ts b/packages/sushi/src/router/rain/rain-data-fetcher.ts deleted file mode 100644 index 8907342938..0000000000 --- a/packages/sushi/src/router/rain/rain-data-fetcher.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { isDeepStrictEqual } from 'util' -import { ParseAbiItem } from 'viem' -import { Type } from '../../currency/index.js' -import { DataFetcher, DataFetcherOptions } from '../data-fetcher.js' -import { ApeSwapProvider } from '../liquidity-providers/ApeSwap.js' -import { BaseSwapProvider } from '../liquidity-providers/BaseSwap.js' -import { BiswapProvider } from '../liquidity-providers/Biswap.js' -import { BlastDEXProvider } from '../liquidity-providers/BlastDEX.js' -import { BlazeSwapProvider } from '../liquidity-providers/BlazeSwap.js' -import { DfynProvider } from '../liquidity-providers/Dfyn.js' -import { DovishV3Provider } from '../liquidity-providers/DovishV3.js' -import { DyorV2Provider } from '../liquidity-providers/DyorV2.js' -import { ElkProvider } from '../liquidity-providers/Elk.js' -import { EnosysProvider } from '../liquidity-providers/Enosys.js' -import { GravityFinanceProvider } from '../liquidity-providers/GravityFinance.js' -import { HoneySwapProvider } from '../liquidity-providers/HoneySwap.js' -import { HyperBlastProvider } from '../liquidity-providers/HyperBlast.js' -import { JetSwapProvider } from '../liquidity-providers/JetSwap.js' -import { KinetixV2Provider } from '../liquidity-providers/KinetixV2.js' -import { KinetixV3Provider } from '../liquidity-providers/KinetixV3.js' -import { LaserSwapV2Provider } from '../liquidity-providers/LaserSwap.js' -import { LiquidityProviders } from '../liquidity-providers/LiquidityProvider.js' -import { LynexV1Provider } from '../liquidity-providers/LynexV1.js' -import { LynexV2Provider } from '../liquidity-providers/LynexV2.js' -import { MSwapProvider } from '../liquidity-providers/MSwap.js' -import { MonoswapV2Provider } from '../liquidity-providers/MonoSwapV2.js' -import { MonoswapV3Provider } from '../liquidity-providers/MonoSwapV3.js' -import { NativeWrapProvider } from '../liquidity-providers/NativeWrapProvider.js' -import { NetSwapProvider } from '../liquidity-providers/NetSwap.js' -import { PancakeSwapV2Provider } from '../liquidity-providers/PancakeSwapV2.js' -import { PancakeSwapV3Provider } from '../liquidity-providers/PancakeSwapV3.js' -import { QuickSwapV2Provider } from '../liquidity-providers/QuickSwapV2.js' -import { QuickSwapV3Provider } from '../liquidity-providers/QuickswapV3.js' -import { SolarbeamProvider } from '../liquidity-providers/Solarbeam.js' -import { SparkDexV2Provider } from '../liquidity-providers/SparkDexV2.js' -import { SparkDexV3Provider } from '../liquidity-providers/SparkDexV3.js' -import { SparkDexV3_1Provider } from '../liquidity-providers/SparkDexV3_1.js' -import { SpookySwapV2Provider } from '../liquidity-providers/SpookySwapV2.js' -import { SpookySwapV3Provider } from '../liquidity-providers/SpookySwapV3.js' -import { SushiSwapV2Provider } from '../liquidity-providers/SushiSwapV2.js' -import { SushiSwapV3Provider } from '../liquidity-providers/SushiSwapV3.js' -import { SwapBlastProvider } from '../liquidity-providers/SwapBlast.js' -import { - ThrusterV2_1Provider, - ThrusterV2_3Provider, -} from '../liquidity-providers/ThrusterV2.js' -import { ThrusterV3Provider } from '../liquidity-providers/ThrusterV3.js' -import { TraderJoeProvider } from '../liquidity-providers/TraderJoe.js' -import { UbeSwapProvider } from '../liquidity-providers/UbeSwap.js' -import { UniswapV2Provider } from '../liquidity-providers/UniswapV2.js' -import { UniswapV3Provider } from '../liquidity-providers/UniswapV3.js' -import { VVSStandardProvider } from '../liquidity-providers/VVSStandard.js' -import { WagmiProvider } from '../liquidity-providers/Wagmi.js' -import { RainUniswapV2BaseProvider } from './RainUniswapV2Base.js' -import { RainUniswapV3BaseProvider } from './RainUniswapV3Base.js' - -export class RainDataFetcher extends DataFetcher { - eventsAbi: ParseAbiItem[] = [] - - override _setProviders(providers?: LiquidityProviders[]) { - this.providers = [new NativeWrapProvider(this.chainId, this.web3Client)] - ;[ - ApeSwapProvider, - BaseSwapProvider, - BiswapProvider, - BlastDEXProvider, - BlazeSwapProvider, - DfynProvider, - DovishV3Provider, - DyorV2Provider, - ElkProvider, - EnosysProvider, - GravityFinanceProvider, - HoneySwapProvider, - HyperBlastProvider, - JetSwapProvider, - KinetixV2Provider, - KinetixV3Provider, - LaserSwapV2Provider, - LynexV1Provider, - LynexV2Provider, - MonoswapV2Provider, - MonoswapV3Provider, - MSwapProvider, - NetSwapProvider, - PancakeSwapV2Provider, - PancakeSwapV3Provider, - QuickSwapV2Provider, - QuickSwapV3Provider, - SolarbeamProvider, - SparkDexV2Provider, - SparkDexV3Provider, - SparkDexV3_1Provider, - SpookySwapV2Provider, - SpookySwapV3Provider, - SushiSwapV2Provider, - SushiSwapV3Provider, - SwapBlastProvider, - ThrusterV2_1Provider, - ThrusterV2_3Provider, - ThrusterV3Provider, - TraderJoeProvider, - UbeSwapProvider, - UniswapV2Provider, - UniswapV3Provider, - VVSStandardProvider, - WagmiProvider, - ].forEach((p) => { - try { - const provider = new p(this.chainId, this.web3Client) - if ( - // If none passed, include all - !providers || - this._providerIsIncluded(provider.getType(), providers) - ) { - this.providers.push(provider) - // gather eventsAbi unique instances - if (provider?.eventsAbi?.length) { - ;(provider.eventsAbi as any[]).forEach((v) => { - if (this.eventsAbi.every((e) => !isDeepStrictEqual(e, v))) { - this.eventsAbi.push(v) - } - }) - } - } - } catch (_e: unknown) {} - }) - } - - override async fetchPoolsForToken( - currency0: Type, - currency1: Type, - excludePools?: Set, - options?: DataFetcherOptions, - ): Promise { - let opts = options - if (!opts) { - opts = { - blockNumber: await this.web3Client.getBlockNumber(), - } - } - if (typeof opts.blockNumber !== 'bigint') { - opts.blockNumber = await this.web3Client.getBlockNumber() - } - await super.fetchPoolsForToken(currency0, currency1, excludePools, opts) - } - - // updates the pool data of all dexes by enevts until the given block - async updatePools(untilBlock?: bigint) { - let fromBlock = -1n - const addresses: string[] = [] - if (typeof untilBlock !== 'bigint') { - untilBlock = await this.web3Client.getBlockNumber() - } - - // gather all provider factory and pools addresses - this.providers.forEach((provider: any) => { - if ( - provider instanceof RainUniswapV2BaseProvider || - provider instanceof RainUniswapV3BaseProvider - ) { - const factory = - provider.factory[ - this.chainId as keyof typeof provider.factory - ]!.toLowerCase() - if (!addresses.includes(factory)) { - addresses.push(factory) - } - const pools = provider.pools - pools.forEach((pool, address) => { - if (!addresses.includes(address)) { - addresses.push(address) - } - if (fromBlock === -1n) { - fromBlock = pool.blockNumber - } - if (pool.blockNumber < fromBlock) { - fromBlock = pool.blockNumber - } - }) - } - }) - if (!addresses.length) return - if (fromBlock === untilBlock) return - - // get logs and sort them from earliest block to latest - const logs = await this.web3Client.getLogs({ - events: this.eventsAbi, - address: addresses as `0x${string}`[], - fromBlock, - toBlock: untilBlock, - }) - logs.sort((a, b) => { - const diff = a.blockNumber - b.blockNumber - if (diff === 0n) { - return a.logIndex - b.logIndex - } else { - return Number(diff) - } - }) - - // process each log for each provider - logs.forEach((log) => { - this.providers.forEach((p) => { - p.processLog(log) - }) - }) - const results = await Promise.allSettled( - this.providers.map((p) => p.afterProcessLog(untilBlock!)), - ) - results.forEach((res, i) => { - if (res.status === 'fulfilled') { - const provider = this.providers[i] - if ( - provider instanceof RainUniswapV2BaseProvider || - provider instanceof RainUniswapV3BaseProvider - ) { - provider.pools.forEach((pool) => { - pool.blockNumber = untilBlock! - }) - } - } - }) - } - - reset() { - this.providers.forEach((provider) => { - if ( - provider instanceof RainUniswapV2BaseProvider || - provider instanceof RainUniswapV3BaseProvider - ) { - provider.pools.clear() - provider.poolsByTrade.clear() - provider.nonExistentPools.clear() - } - }) - } -} diff --git a/packages/sushi/src/router/rain/rain.test.ts b/packages/sushi/src/router/rain/rain.test.ts deleted file mode 100644 index 4024d0fef1..0000000000 --- a/packages/sushi/src/router/rain/rain.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { ChainId } from '../../chain/constants.js' -import { ROUTE_PROCESSOR_4_ADDRESS } from '../../config/route-processor.js' -import { USDC, USDT } from '../../currency/tokens.js' -import { LiquidityProviders } from '../liquidity-providers/index.js' -import { Router } from '../router.js' -import { RainDataFetcher } from './rain-data-fetcher.js' - -describe('Rain fork tests', async () => { - it('should correctly update pools data by logs', async () => { - // 2000 blocks apart - const currentBlockNumber = 64818756n - const oldBlockNumber = 64816756n - const fromToken = USDT[ChainId.POLYGON] - const toToken = USDC[ChainId.POLYGON] - const amountIn = 10_000_000n // 10e6, ie 10 USDT - const gasPrice = 30_000_000 - // one of each type - const lps = [ - LiquidityProviders.UniswapV3, // univ3 - LiquidityProviders.QuickSwapV3, // algebra - LiquidityProviders.QuickSwapV2, // univ2 - ] - - // data fetcher without indexer (normal way ie raw pool data fecthed directly by contract calls) - const dataFectherFresh = new RainDataFetcher(ChainId.POLYGON) - dataFectherFresh.startDataFetching(lps) - dataFectherFresh.stopDataFetching() - - // data fetcher with indexer (pool data will be updated from older block to current block by contract logs) - const dataFectherIndexer = new RainDataFetcher(ChainId.POLYGON) - dataFectherIndexer.startDataFetching(lps) - dataFectherIndexer.stopDataFetching() - - // get token pools data for current block on fresh dataFetcher - await dataFectherFresh.fetchPoolsForToken(fromToken, toToken, undefined, { - blockNumber: currentBlockNumber, - }) - const freshPcMap = dataFectherFresh.getCurrentPoolCodeMap( - fromToken, - toToken, - ) - const freshRoute = Router.findBestRoute( - freshPcMap, - ChainId.POLYGON, - fromToken, - amountIn, - toToken, - gasPrice, - lps, - undefined, - undefined, - 'single', - ) - - // get token pools data for older block on indexer dataFetcher, then ensure the - // amount out it gives is different to fresh datafetcher amount out - // and then update the pools data with contract logs from between the blocks - await dataFectherIndexer.fetchPoolsForToken(fromToken, toToken, undefined, { - blockNumber: oldBlockNumber, - }) - const indexerPcMapOld = dataFectherIndexer.getCurrentPoolCodeMap( - fromToken, - toToken, - ) - const indexerRouteOld = Router.findBestRoute( - indexerPcMapOld, - ChainId.POLYGON, - fromToken, - amountIn, - toToken, - gasPrice, - lps, - undefined, - undefined, - 'single', - ) - // should not be equal (just to make sure) - expect(freshRoute.amountOutBI).not.equal(indexerRouteOld.amountOutBI) - - // now update the indexer pools data with logs - await dataFectherIndexer.updatePools(currentBlockNumber) - const indexerPcMap = dataFectherIndexer.getCurrentPoolCodeMap( - fromToken, - toToken, - ) - const indexerRoute = Router.findBestRoute( - indexerPcMap, - ChainId.POLYGON, - fromToken, - amountIn, - toToken, - gasPrice, - lps, - undefined, - undefined, - 'single', - ) - - // assert amount outs and status - expect(freshRoute.amountOutBI).toEqual(indexerRoute.amountOutBI) - expect(freshRoute.totalAmountOutBI).toEqual(indexerRoute.totalAmountOutBI) - expect(freshRoute.status).toEqual(indexerRoute.status) - - // assert produced route code - const freshRpParams = Router.routeProcessor4Params( - freshPcMap, - freshRoute, - fromToken, - toToken, - ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], - ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], - ) - const indexerRpParams = Router.routeProcessor4Params( - indexerPcMap, - indexerRoute, - fromToken, - toToken, - ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], - ROUTE_PROCESSOR_4_ADDRESS[ChainId.POLYGON], - ) - expect(freshRpParams.routeCode).toEqual(indexerRpParams.routeCode) - }) -}) diff --git a/packages/sushi/test/vitest.config.ts b/packages/sushi/test/vitest.config.ts index 2a9216887c..ee26b6560b 100644 --- a/packages/sushi/test/vitest.config.ts +++ b/packages/sushi/test/vitest.config.ts @@ -27,5 +27,6 @@ export default defineConfig({ setupFiles: [join(__dirname, './setupFiles.ts')], globalSetup: [join(__dirname, './globalSetup.ts')], testTimeout: 10_000, + hookTimeout: 70_000, }, }) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index bb5a3ea261..4bdc1a1190 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -12,8 +12,8 @@ import { WNATIVE, } from 'sushi/currency' import { - DataFetcher, LiquidityProviders, + RainDataFetcher, Router, UniV3LiquidityProviders, } from 'sushi/router' @@ -21,7 +21,7 @@ import { UniswapV3BaseProvider } from '../../../packages/sushi/dist/router/liqui async function testDF( _chainName: string, - dataFetcher: DataFetcher, + dataFetcher: RainDataFetcher, t0: Type | undefined, t1: Type | undefined, name0: string, @@ -77,7 +77,7 @@ function reportMissingDexes(reports: Record[]): { // tries to find a route for a token pair from current fetched pools function findRoute( - dataFetcher: DataFetcher, + dataFetcher: RainDataFetcher, fromToken: Type, toToken: Type, chainId: ChainId, @@ -128,14 +128,13 @@ const chainIds = Object.values(ChainId).filter((v) => { }) async function runTest() { - describe.only('DataFetcher Pools/Time check', async () => { + describe.only('RainDataFetcher Pools/Time check', async () => { chainIds.forEach((chainId) => { //if (chainId !== ChainId.OPTIMISM) return const chName = chainName[chainId] - const dataFetcher = DataFetcher.onChain(chainId) - it(`${chName}(${chainId})`, async () => { + const dataFetcher = await RainDataFetcher.init(chainId) dataFetcher.startDataFetching() console.log(chName) const allFoundPools = [] From 12811c23351931878a970aa2a913c90ee2cc3052 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 8 Apr 2025 21:35:03 +0000 Subject: [PATCH 128/140] update --- packages/sushi/package.json | 2 +- .../liquidity-providers/LiquidityProvider.ts | 15 +- .../liquidity-providers/PancakeSwapV3.ts | 26 +- .../sushi/src/router/rain/AlgebraV1Base.ts | 42 ++- .../src/router/rain/RainDataFetcher.test.ts | 10 +- .../sushi/src/router/rain/UniswapV2Base.ts | 56 +++- .../sushi/src/router/rain/UniswapV3Base.ts | 315 ++++++++++-------- .../router/rain/VelodromeSlipstreamBase.ts | 4 +- packages/sushi/test/vitest.config.ts | 2 +- .../route-processor/test/DataFetcher.test.ts | 10 +- 10 files changed, 276 insertions(+), 206 deletions(-) diff --git a/packages/sushi/package.json b/packages/sushi/package.json index ef513f64e7..ad65b48761 100644 --- a/packages/sushi/package.json +++ b/packages/sushi/package.json @@ -187,7 +187,7 @@ "dev": "tsc -w", "generate": "tsx ./scripts/generate.ts", "prepublishOnly": "pnpm build", - "test": "vitest run -c ./test/vitest.config.ts --test-timeout 600000", + "test": "vitest run -c ./test/vitest.config.ts", "test:debug": "vitest --inspect-brk --no-threads run -c ./test/vitest.config.ts", "test:watch": "vitest dev -c ./test/vitest.config.ts" }, diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 2c3853cd72..0dd7cb3d92 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -161,12 +161,25 @@ export abstract class LiquidityProvider { .sort((first, second) => (first > second ? -1 : 1)) .join(':') + /** + * Override this method to perform additional initialization tasks + * such as fetching initial data. + * @param _blockNumber - The block height at which should be initialized + */ async init(_blockNumber?: bigint) { this.initialized = true } - // methods interface for event log handling + /** + * Processes event logs to update pool data + * @param _log - The event log + */ processLog(_log: Log) {} + + /** + * Represents any process that needs to take place after event logs are processed + * @param _untilBlock - The block height that pool data are updated to at processLog + */ async afterProcessLog(_untilBlock: bigint) {} } diff --git a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts index 323565fc39..b36b27cb3d 100644 --- a/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts +++ b/packages/sushi/src/router/liquidity-providers/PancakeSwapV3.ts @@ -5,39 +5,21 @@ import { PANCAKESWAP_V3_FEE_SPACING_MAP, PancakeSwapV3FeeAmount, } from '../../config/index.js' -import { UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' +import { UniV3EventsAbi, UniswapV3BaseProvider } from '../rain/UniswapV3Base.js' import { LiquidityProviders } from './LiquidityProvider.js' export const PancakeV3EventsAbi = [ + ...UniV3EventsAbi.slice(1), // univ3 events except Swap parseAbiItem( - 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', - ), - parseAbiItem( - 'event Collect(address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1)', - ), - parseAbiItem( - 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', - ), - parseAbiItem( - // For PancakeV3 + // PancakeV3 specific Swap event 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint128 protocolFeesToken0, uint128 protocolFeesToken1)', ), - parseAbiItem( - 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', - ), - parseAbiItem( - 'event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1)', - ), - parseAbiItem( - 'event PoolCreated(address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool)', - ), ] export class PancakeSwapV3Provider extends UniswapV3BaseProvider { override FEE = PancakeSwapV3FeeAmount override TICK_SPACINGS = PANCAKESWAP_V3_FEE_SPACING_MAP - override eventsAbi = - PancakeV3EventsAbi as any as UniswapV3BaseProvider['eventsAbi'] + override eventsAbi = PancakeV3EventsAbi as any constructor(chainId: ChainId, web3Client: PublicClient) { const factory = { diff --git a/packages/sushi/src/router/rain/AlgebraV1Base.ts b/packages/sushi/src/router/rain/AlgebraV1Base.ts index 42f153a203..8f88dcc372 100644 --- a/packages/sushi/src/router/rain/AlgebraV1Base.ts +++ b/packages/sushi/src/router/rain/AlgebraV1Base.ts @@ -7,6 +7,7 @@ import { getAddress, keccak256, parseAbiItem, + parseEventLogs, } from 'viem' import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' @@ -16,27 +17,17 @@ import { PoolFilter, StaticPoolUniV3, } from '../liquidity-providers/UniswapV3Base.js' -import { RainV3Pool, UniswapV3BaseProvider } from './UniswapV3Base.js' +import { + RainV3Pool, + UniV3EventsAbi, + UniswapV3BaseProvider, +} from './UniswapV3Base.js' export const AlgebraEventsAbi = [ - parseAbiItem( - 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', - ), - parseAbiItem( - 'event Collect(address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1)', - ), - parseAbiItem( - 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', - ), - parseAbiItem( - 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)', - ), - parseAbiItem( - 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', - ), + ...UniV3EventsAbi.slice(0, 5), // same as univ3 Swap, Mint, Collect, Burn, Flash events + // algebra specific events parseAbiItem('event Fee(uint16 fee)'), parseAbiItem('event TickSpacing(int24 newTickSpacing)'), - // for algebra factory, new pool created parseAbiItem( 'event Pool(address indexed token0, address indexed token1, address pool)', ), @@ -226,6 +217,23 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { return true } + // handle algebra specific pool creation event + override handleFactoryEvents(log: Log) { + const factory = + this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() + const logAddress = log.address.toLowerCase() + if (logAddress === factory) { + try { + const event = parseEventLogs({ + logs: [log], + abi: AlgebraEventsAbi, + eventName: 'Pool', + })[0]! + this.nullPools.delete(event.args.pool.toLowerCase()) + } catch {} + } + } + // handle extra events that Algebra has override otherEventCases( log: Log, diff --git a/packages/sushi/src/router/rain/RainDataFetcher.test.ts b/packages/sushi/src/router/rain/RainDataFetcher.test.ts index 1e538797b5..b04b9f4f25 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.test.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.test.ts @@ -99,10 +99,10 @@ async function testRainDataFetcher( oldBlockNumber: bigint, ) { // data fetcher without indexer (normal way ie raw pool data fecthed directly by contract calls) - const dataFectherFresh = await RainDataFetcher.init(ChainId.BASE, client, lps) + const dataFetcherFresh = await RainDataFetcher.init(ChainId.BASE, client, lps) // data fetcher with indexer (pool data will be updated from older block to current block by event logs) - const dataFectherIndexer = await RainDataFetcher.init( + const dataFetcherIndexer = await RainDataFetcher.init( ChainId.BASE, client, lps, @@ -110,7 +110,7 @@ async function testRainDataFetcher( // get route at current block height for fresh dataFetcher const { pcMap: freshPcMap, route: freshRoute } = - await dataFectherFresh.findBestRoute( + await dataFetcherFresh.findBestRoute( ChainId.BASE, fromToken, toToken, @@ -126,7 +126,7 @@ async function testRainDataFetcher( // get route at older block height for indexer dataFetcher, then ensure the // amount out it gives is different to fresh datafetcher amount out // and then update the pools data with contract logs from between the blocks - const { route: indexerRouteOld } = await dataFectherIndexer.findBestRoute( + const { route: indexerRouteOld } = await dataFetcherIndexer.findBestRoute( ChainId.BASE, fromToken, toToken, @@ -145,7 +145,7 @@ async function testRainDataFetcher( // now get route at current block height for indexer dataFetcher with updating pool data const { pcMap: indexerPcMap, route: indexerRoute } = - await dataFectherIndexer.findBestRoute( + await dataFetcherIndexer.findBestRoute( ChainId.BASE, fromToken, toToken, diff --git a/packages/sushi/src/router/rain/UniswapV2Base.ts b/packages/sushi/src/router/rain/UniswapV2Base.ts index 19ccb7c413..af91b455f7 100644 --- a/packages/sushi/src/router/rain/UniswapV2Base.ts +++ b/packages/sushi/src/router/rain/UniswapV2Base.ts @@ -109,6 +109,14 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { } override processLog(log: Log) { + this.handleFactoryEvents(log) + this.handlePoolEvents(log) + } + + /** + * Hanldes factory events and updates the cache with the results + */ + handleFactoryEvents(log: Log) { const factory = this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() const logAddress = log.address.toLowerCase() @@ -121,25 +129,34 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { })[0]! this.nullPools.delete(event.args[2].toLowerCase()) } catch {} - } else { - const pool = this.pools.get(logAddress as `0x${string}`) - if (pool) { - if (log.blockNumber! >= pool.blockNumber) { - try { - const event = parseEventLogs({ - logs: [log], - abi: this.eventsAbi, - eventName: 'Sync', - })[0]! - pool.blockNumber = log.blockNumber! - pool.reserve0 = event.args.reserve0 - pool.reserve1 = event.args.reserve1 - } catch {} - } + } + } + + /** + * Hanldes pool events and updates the pool cache with the results + */ + handlePoolEvents(log: Log) { + const logAddress = log.address.toLowerCase() + const pool = this.pools.get(logAddress as `0x${string}`) + if (pool) { + if (log.blockNumber! >= pool.blockNumber) { + try { + const event = parseEventLogs({ + logs: [log], + abi: this.eventsAbi, + eventName: 'Sync', + })[0]! + pool.blockNumber = log.blockNumber! + pool.reserve0 = event.args.reserve0 + pool.reserve1 = event.args.reserve1 + } catch {} } } } + /** + * Updates reserves of the given pool in the cache + */ setPool(poolCodesToCreate: RainV2Pool[], reserves: any[]) { poolCodesToCreate.forEach((pool, i) => { const poolAddress = pool.address.toLowerCase() @@ -158,6 +175,9 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { }) } + /** + * Caches non existent pools + */ handleNullPool(poolAddress: string) { const v = this.nullPools.get(poolAddress) if (v) { @@ -167,6 +187,9 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { } } + /** + * Filters out already cached pools from the given list + */ filterCachedPools(pools: StaticPool[]) { return pools.filter((pool) => { const poolAddress = pool.address.toLowerCase() @@ -177,6 +200,9 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { }) } + /** + * Resets the cache + */ reset() { this.pools.clear() this.poolsByTrade.clear() diff --git a/packages/sushi/src/router/rain/UniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts index 775b56e20b..d8c13469df 100644 --- a/packages/sushi/src/router/rain/UniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -34,6 +34,9 @@ export const tickSpacingAbi = [ ] as const export const UniV3EventsAbi = [ + parseAbiItem( + 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)', + ), parseAbiItem( 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', ), @@ -43,9 +46,6 @@ export const UniV3EventsAbi = [ parseAbiItem( 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)', ), - parseAbiItem( - 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)', - ), parseAbiItem( 'event Flash(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1)', ), @@ -235,6 +235,33 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { }) } + override processLog(log: Log) { + this.handleFactoryEvents(log) + this.handlePoolEvents(log) + } + + override async afterProcessLog(untilBlock: bigint) { + const newTicksQueue = [...this.newTicksQueue.splice(0)] + if (newTicksQueue.length) { + const newTicks = await this.getTicksInner(newTicksQueue, { + blockNumber: untilBlock, + }) + if (newTicks) { + newTicksQueue.forEach(([pool], i) => { + newTicks?.[i]?.forEach((newTick, index) => { + pool.ticks.set(index, newTick) + }) + }) + } else { + // if unsuccessfull to get new ticks, put them back on queue for next try + this.newTicksQueue.push(...newTicksQueue) + } + } + } + + /** + * Fecthes reserves of the given list of pools + */ async getReserves( existingPools: RainV3Pool[], options?: DataFetcherOptions, @@ -287,6 +314,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return reserves } + /** + * Fecthes liquidity of the given list of pools + */ async getLiquidity( existingPools: RainV3Pool[], options?: DataFetcherOptions, @@ -338,6 +368,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return liquidities } + /** + * Fecthes ticks capped at pool boundries of the given list of pools + */ async getTicks( existingPools: RainV3Pool[], options?: DataFetcherOptions, @@ -355,6 +388,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return await this.getTicksInner(wordList, options) } + /** + * Fecthes ticks of the given list of pools + */ async getTicksInner( existingPools: [RainV3Pool, number[]][], options?: DataFetcherOptions, @@ -409,6 +445,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return poolTicks } + /** + * Fecthes tick spacing of the given list of pools + */ async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { return await this.client .multicall({ @@ -436,6 +475,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { }) } + /** + * Calculates and returns the list of current ticks for the given pool + */ getMaxTickDiapason(tick: number, pool: RainV3Pool): CLTick[] { const currentTickIndex = bitmapIndex(tick, pool.tickSpacing) if (!pool.ticks.has(currentTickIndex)) return [] @@ -472,7 +514,10 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return poolTicks } - override processLog(log: Log) { + /** + * Hanldes factory events and updates the cache with the results + */ + handleFactoryEvents(log: Log) { const factory = this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() const logAddress = log.address.toLowerCase() @@ -485,161 +530,139 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { })[0]! this.nullPools.delete(event.args.pool.toLowerCase()) } catch {} - } else { - const pool = this.pools.get(logAddress) as RainV3Pool | undefined - if (pool) { - try { - const event = parseEventLogs({ logs: [log], abi: this.eventsAbi })[0]! - switch (event.eventName) { - case 'Mint': { - const { amount, amount0, amount1 } = event.args - const { tickLower, tickUpper } = event.args - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount !== undefined - ) { - const tick = pool.activeTick - if (tickLower <= tick && tick < tickUpper) - pool.liquidity += amount - } - if (amount1 !== undefined && amount0 !== undefined) { - pool.reserve0 += amount0 - pool.reserve1 += amount1 - } - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount !== undefined - ) { - this.addTick(tickLower, amount, pool) - this.addTick(tickUpper, -amount, pool) - } + } + } + + /** + * Hanldes pool events and updates the pool cache with the results + */ + handlePoolEvents(log: Log) { + const logAddress = log.address.toLowerCase() + const pool = this.pools.get(logAddress) + if (pool) { + try { + const event = parseEventLogs({ logs: [log], abi: this.eventsAbi })[0]! + switch (event.eventName) { + case 'Mint': { + const { amount, amount0, amount1 } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity += amount + } + if (amount1 !== undefined && amount0 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + this.addTick(tickLower, amount, pool) + this.addTick(tickUpper, -amount, pool) } - break } - case 'Burn': { - const { amount } = event.args - const { tickLower, tickUpper } = event.args - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount !== undefined - ) { - const tick = pool.activeTick - if (tickLower <= tick && tick < tickUpper) - pool.liquidity -= amount - } - if ( - tickLower !== undefined && - tickUpper !== undefined && - amount !== undefined - ) { - this.addTick(tickLower, -amount, pool) - this.addTick(tickUpper, amount, pool) - } + break + } + case 'Burn': { + const { amount } = event.args + const { tickLower, tickUpper } = event.args + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + const tick = pool.activeTick + if (tickLower <= tick && tick < tickUpper) + pool.liquidity -= amount + } + if ( + tickLower !== undefined && + tickUpper !== undefined && + amount !== undefined + ) { + this.addTick(tickLower, -amount, pool) + this.addTick(tickUpper, amount, pool) } - break } - case 'Collect': - case 'CollectProtocol': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { amount0, amount1 } = event.args - if (amount0 !== undefined && amount1 !== undefined) { - pool.reserve0 -= amount0 - pool.reserve1 -= amount1 - } + break + } + case 'Collect': + case 'CollectProtocol': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1 } = event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 -= amount0 + pool.reserve1 -= amount1 } - break } - case 'Flash': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { paid0, paid1 } = event.args - if (paid0 !== undefined && paid1 !== undefined) { - pool.reserve0 += paid0 - pool.reserve1 += paid1 - } + break + } + case 'Flash': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { paid0, paid1 } = event.args + if (paid0 !== undefined && paid1 !== undefined) { + pool.reserve0 += paid0 + pool.reserve1 += paid1 } - break } - case 'Swap': { - if (log.blockNumber! >= pool.blockNumber) { - pool.blockNumber = log.blockNumber! - const { amount0, amount1, sqrtPriceX96, liquidity, tick } = - event.args - if (amount0 !== undefined && amount1 !== undefined) { - pool.reserve0 += amount0 - pool.reserve1 += amount1 - } - if (sqrtPriceX96 !== undefined) pool.sqrtPriceX96 = sqrtPriceX96 - if (liquidity !== undefined) pool.liquidity = liquidity - if (tick !== undefined) { - pool.activeTick = - Math.floor(tick / pool.tickSpacing) * pool.tickSpacing - const newTicks = this.onPoolTickChange(pool.activeTick, pool) - const queue = this.newTicksQueue.find( - (v) => v[0].address === pool.address, - ) - if (queue) { - for (const tick of newTicks) { - if (!queue[1].includes(tick)) queue[1].push(tick) - } - } else { - this.newTicksQueue.push([pool, newTicks]) + break + } + case 'Swap': { + if (log.blockNumber! >= pool.blockNumber) { + pool.blockNumber = log.blockNumber! + const { amount0, amount1, sqrtPriceX96, liquidity, tick } = + event.args + if (amount0 !== undefined && amount1 !== undefined) { + pool.reserve0 += amount0 + pool.reserve1 += amount1 + } + if (sqrtPriceX96 !== undefined) pool.sqrtPriceX96 = sqrtPriceX96 + if (liquidity !== undefined) pool.liquidity = liquidity + if (tick !== undefined) { + pool.activeTick = + Math.floor(tick / pool.tickSpacing) * pool.tickSpacing + const newTicks = this.onPoolTickChange(pool.activeTick, pool) + const queue = this.newTicksQueue.find( + (v) => v[0].address === pool.address, + ) + if (queue) { + for (const tick of newTicks) { + if (!queue[1].includes(tick)) queue[1].push(tick) } + } else { + this.newTicksQueue.push([pool, newTicks]) } } - break - } - default: { - this.otherEventCases(log, event, pool) } + break } - } catch {} - } + default: { + this.otherEventCases(log, event, pool) + } + } + } catch {} } } // for child classes if they have other events to handle such as AlgebraV1Base otherEventCases(_log: Log, _event: Log, _pool: RainV3Pool) {} - override async afterProcessLog(untilBlock: bigint) { - const newTicksQueue = [...this.newTicksQueue.splice(0)] - try { - if (newTicksQueue.length) { - const newTicks = await this.getTicksInner(newTicksQueue, { - blockNumber: untilBlock, - }) - newTicksQueue.forEach(([pool], i) => { - newTicks?.[i]?.forEach((newTick, index) => { - pool.ticks.set(index, newTick) - }) - }) - } - } catch { - // if unsuccessfull to get new ticks, put them back on queue for next try - newTicksQueue.forEach(([pool, newTicks]) => { - const queue = this.newTicksQueue.find( - (v) => v[0].address === pool.address, - ) - if (queue) { - for (const tick of newTicks) { - if (!queue[1].includes(tick)) queue[1].push(tick) - } - } else { - this.newTicksQueue.push([pool, newTicks]) - } - }) - throw '' - } - } - + /** + * Adds a new tick to the given pool's tick list + */ addTick(tick: number, amount: bigint, pool: RainV3Pool) { const tickWord = bitmapIndex(tick, pool.tickSpacing) const ticks = pool.ticks.get(tickWord) @@ -671,6 +694,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } } + /** + * Gets triggered if a pool's current tick get changed after processing event logs + */ onPoolTickChange(tick: number, pool: RainV3Pool): number[] { const currentTickWord = bitmapIndex(tick, pool.tickSpacing) const minWord = bitmapIndex( @@ -702,6 +728,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { return positiveFirst ? res : -res } + /** + * Caches non existent pools + */ handleNullPool(poolAddress: string) { const v = this.nullPools.get(poolAddress) if (v) { @@ -711,6 +740,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } } + /** + * Filters out already cached pools from the given list + */ filterCachedPools(pools: StaticPoolUniV3[]) { return pools.filter((pool) => { const poolAddress = pool.address.toLowerCase() @@ -721,6 +753,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { }) } + /** + * Resets the cache + */ reset() { this.pools.clear() this.poolsByTrade.clear() diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index 9eca8a84ba..ea71af2f53 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -438,7 +438,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi return existingPools } - override processLog(log: Log) { + override handleFactoryEvents(log: Log) { const logAddress = log.address.toLowerCase() const factory = this.factory[this.chainId as keyof typeof this.factory]!.toLowerCase() @@ -504,8 +504,6 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi default: } } catch {} - } else { - super.processLog(log) } } diff --git a/packages/sushi/test/vitest.config.ts b/packages/sushi/test/vitest.config.ts index ee26b6560b..f6174d3176 100644 --- a/packages/sushi/test/vitest.config.ts +++ b/packages/sushi/test/vitest.config.ts @@ -26,7 +26,7 @@ export default defineConfig({ include: ['src/**/*.test.ts', 'test/**/*.test.ts'], setupFiles: [join(__dirname, './setupFiles.ts')], globalSetup: [join(__dirname, './globalSetup.ts')], - testTimeout: 10_000, + testTimeout: 600_000, hookTimeout: 70_000, }, }) diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 4bdc1a1190..5140e92728 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -82,15 +82,20 @@ function findRoute( toToken: Type, chainId: ChainId, liquidityProviders?: LiquidityProviders[], + amountIn?: bigint, ): boolean { try { // find the best route map const pcMap = dataFetcher.getCurrentPoolCodeMap(fromToken, toToken) + amountIn = + typeof amountIn !== 'bigint' + ? BigInt(`1${'0'.repeat(fromToken.decimals)}`) + : amountIn const route = Router.findBestRoute( pcMap, chainId, fromToken, - BigInt(`1${'0'.repeat(fromToken.decimals)}`), + amountIn, toToken, 30e9, liquidityProviders, @@ -161,6 +166,9 @@ async function runTest() { WNATIVE[chainId], USDC[chainId as keyof typeof USDC], chainId, + undefined, + // BTTC price against USDC is low, we need more amountIn for a swap + chainId === ChainId.BTTC ? 10n ** 22n : undefined, ), ) await sleep(60_000) From 8ad1c3c91119e92272cb7e767d2a2f06ac190d93 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 8 Apr 2025 22:13:43 +0000 Subject: [PATCH 129/140] Update viem.ts [skip ci] --- .github/workflows/rain-ci.yml | 4 ++++ packages/sushi/src/config/viem.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/.github/workflows/rain-ci.yml b/.github/workflows/rain-ci.yml index 35042c5212..4af696cf4b 100644 --- a/.github/workflows/rain-ci.yml +++ b/.github/workflows/rain-ci.yml @@ -1,6 +1,10 @@ name: Rain CI on: [push] +concurrency: + group: ${{ github.ref }}-rainix + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + jobs: router-test: runs-on: ubuntu-latest diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 3377c38910..7fb0da0516 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -682,6 +682,7 @@ export const publicClientConfig = { chain: fantom as Chain, transport: fallback([ http('https://fantom.drpc.org'), + http('https://fantom-rpc.publicnode.com'), publicTransports[ChainId.FANTOM], // default that uses ankr rpc is now only available as paid account ]), }, From 114b61bdb305ba7a01e5d5421fbca755602d86d0 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Tue, 8 Apr 2025 22:14:21 +0000 Subject: [PATCH 130/140] update --- packages/sushi/src/config/viem.ts | 1 + .../sushi/src/router/rain/RainDataFetcher.ts | 26 ++++++++++++------- .../sushi/src/router/rain/UniswapV3Base.ts | 4 ++- .../router/rain/VelodromeSlipstreamBase.ts | 7 ----- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/sushi/src/config/viem.ts b/packages/sushi/src/config/viem.ts index 3377c38910..7fb0da0516 100644 --- a/packages/sushi/src/config/viem.ts +++ b/packages/sushi/src/config/viem.ts @@ -682,6 +682,7 @@ export const publicClientConfig = { chain: fantom as Chain, transport: fallback([ http('https://fantom.drpc.org'), + http('https://fantom-rpc.publicnode.com'), publicTransports[ChainId.FANTOM], // default that uses ankr rpc is now only available as paid account ]), }, diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index efad4f0b58..13319af358 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -91,6 +91,7 @@ import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' export class RainDataFetcher extends DataFetcher { eventsAbi: ParseAbiItem[] = [] + factories: string[] = [] /** * Creates an instance of RainDataFecther, constructor of this class should @@ -231,6 +232,19 @@ export class RainDataFetcher extends DataFetcher { } }) } + // gather factory addresses + if ( + provider instanceof UniswapV2BaseProvider || + provider instanceof UniswapV3BaseProvider + ) { + const factory = + provider.factory[ + this.chainId as keyof typeof provider.factory + ]!.toLowerCase() + if (!this.factories.includes(factory)) { + this.factories.push(factory) + } + } } } } @@ -242,24 +256,17 @@ export class RainDataFetcher extends DataFetcher { */ async updatePools(untilBlock?: bigint) { let fromBlock = -1n - const addresses: string[] = [] + const addresses: string[] = [...this.factories] if (typeof untilBlock !== 'bigint') { untilBlock = await this.web3Client.getBlockNumber() } - // gather all provider factory and pools addresses + // gather all provider pools addresses this.providers.forEach((provider: any) => { if ( provider instanceof UniswapV2BaseProvider || provider instanceof UniswapV3BaseProvider ) { - const factory = - provider.factory[ - this.chainId as keyof typeof provider.factory - ]!.toLowerCase() - if (!addresses.includes(factory)) { - addresses.push(factory) - } const pools = provider.pools pools.forEach((pool, address) => { if (!addresses.includes(address)) { @@ -273,6 +280,7 @@ export class RainDataFetcher extends DataFetcher { } }) + // slipstream has swapFeeModule address to be collected as well if (provider instanceof VelodromeSlipstreamBaseProvider) { const swapFeeModule = provider.swapFeeModule[ diff --git a/packages/sushi/src/router/rain/UniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts index d8c13469df..cdeab30d5a 100644 --- a/packages/sushi/src/router/rain/UniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -695,7 +695,9 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Gets triggered if a pool's current tick get changed after processing event logs + * Gets triggered if a pool's current tick get changed after processing event logs, + * this calculates the new tciks that need to be fetched from onchain which then + * takes place when afterProcessLog() is called */ onPoolTickChange(tick: number, pool: RainV3Pool): number[] { const currentTickWord = bitmapIndex(tick, pool.tickSpacing) diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index ea71af2f53..e4d8a06db1 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -381,11 +381,6 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi const existingPools: SlipstreamPool[] = [] staticPools.forEach((pool, i) => { const poolAddress = pool.address.toLowerCase() - if (slot0 === undefined || !slot0[i]) { - this.handleNullPool(poolAddress) - return - } - if (slot0 === undefined || !slot0[i]) { this.handleNullPool(poolAddress) return @@ -396,13 +391,11 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi this.handleNullPool(poolAddress) return } - const activeTick = Math.floor(tick / pool.tickSpacing) * pool.tickSpacing if (typeof activeTick !== 'number') { this.handleNullPool(poolAddress) return } - const fee = (() => { if (pool.feeType === FeeType.Zero) { return 0 From d9fd5933756309c3681901ce8ebc43676e4ffdcd Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 15:20:14 +0000 Subject: [PATCH 131/140] Update UniswapV2Base.ts --- packages/sushi/src/router/rain/UniswapV2Base.ts | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/sushi/src/router/rain/UniswapV2Base.ts b/packages/sushi/src/router/rain/UniswapV2Base.ts index af91b455f7..ffcb5373ae 100644 --- a/packages/sushi/src/router/rain/UniswapV2Base.ts +++ b/packages/sushi/src/router/rain/UniswapV2Base.ts @@ -2,7 +2,6 @@ import { Log, parseAbiItem, parseEventLogs } from 'viem' import { Token } from '../../currency/index.js' import { ConstantProductRPool, RToken } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' -import { filterOnDemandPools } from '../lib/api.js' import { StaticPool, UniswapV2BaseProvider as _UniswapV2BaseProvider, @@ -34,17 +33,7 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { excludePools?: Set, options?: DataFetcherOptions, ): Promise { - const topPoolAddresses = Array.from(this.topPools.keys()) - let pools = - topPoolAddresses.length > 0 - ? filterOnDemandPools( - Array.from(this.availablePools.values()), - t0.address, - t1.address, - topPoolAddresses, - this.ON_DEMAND_POOL_SIZE, - ) - : this.getStaticPools(t0, t1) + let pools = this.getStaticPools(t0, t1) if (excludePools) pools = (pools as RainV2Pool[]).filter( (p) => !excludePools.has(p.address), From fe5875e2cd9b42d53aa1901cabe398c96881213c Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 16:29:06 +0000 Subject: [PATCH 132/140] minor touch --- .../sushi/src/router/rain/RainDataFetcher.ts | 8 +- .../sushi/src/router/rain/UniswapV2Base.ts | 4 +- .../sushi/src/router/rain/UniswapV3Base.ts | 4 +- .../router/rain/VelodromeSlipstreamBase.ts | 137 ++++++++++++------ 4 files changed, 100 insertions(+), 53 deletions(-) diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 13319af358..3c3d192b40 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -269,9 +269,7 @@ export class RainDataFetcher extends DataFetcher { ) { const pools = provider.pools pools.forEach((pool, address) => { - if (!addresses.includes(address)) { - addresses.push(address) - } + addresses.push(address) if (fromBlock === -1n) { fromBlock = pool.blockNumber } @@ -286,9 +284,7 @@ export class RainDataFetcher extends DataFetcher { provider.swapFeeModule[ this.chainId as keyof typeof provider.swapFeeModule ]!.toLowerCase() - if (!addresses.includes(swapFeeModule)) { - addresses.push(swapFeeModule) - } + addresses.push(swapFeeModule) } } }) diff --git a/packages/sushi/src/router/rain/UniswapV2Base.ts b/packages/sushi/src/router/rain/UniswapV2Base.ts index ffcb5373ae..6bdae74475 100644 --- a/packages/sushi/src/router/rain/UniswapV2Base.ts +++ b/packages/sushi/src/router/rain/UniswapV2Base.ts @@ -103,7 +103,7 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { } /** - * Hanldes factory events and updates the cache with the results + * Handles factory events and updates the cache with the results */ handleFactoryEvents(log: Log) { const factory = @@ -122,7 +122,7 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { } /** - * Hanldes pool events and updates the pool cache with the results + * Handles pool events and updates the pool cache with the results */ handlePoolEvents(log: Log) { const logAddress = log.address.toLowerCase() diff --git a/packages/sushi/src/router/rain/UniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts index cdeab30d5a..df3560719d 100644 --- a/packages/sushi/src/router/rain/UniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -515,7 +515,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Hanldes factory events and updates the cache with the results + * Handles factory events and updates the cache with the results */ handleFactoryEvents(log: Log) { const factory = @@ -534,7 +534,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Hanldes pool events and updates the pool cache with the results + * Handles pool events and updates the pool cache with the results */ handlePoolEvents(log: Log) { const logAddress = log.address.toLowerCase() diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index e4d8a06db1..f86a4b5770 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -76,6 +76,16 @@ const slot0Abi = [ }, ] as const +export const customFeeAbi = [ + { + inputs: [{ internalType: 'address', name: '_pool', type: 'address' }], + name: 'customFee', + outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }], + stateMutability: 'view', + type: 'function', + }, +] as const + const SlipstreamEventsAbi = [ ...UniV3EventsAbi.slice(0, -1), // univ3 shared events except PoolCreated parseAbiItem( @@ -95,6 +105,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi DEFAULT_TICK_SPACINGS = [1, 50, 100, 200, 2000] as const tickSpacings: number[] = [...this.DEFAULT_TICK_SPACINGS] + shouldResetFees = false feeSpacingMap: Record = {} // fee to tick spacing map spacingFeeMap: Record = {} // tick spacing to fee map @@ -311,28 +322,13 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi multicallAddress: this.client.chain?.contracts?.multicall3?.address!, allowFailure: true, blockNumber: options?.blockNumber, - contracts: staticPools.map( - (pool) => - ({ - address: this.swapFeeModule[this.chainId]!, - chainId: this.chainId, - abi: [ - { - inputs: [ - { internalType: 'address', name: '_pool', type: 'address' }, - ], - name: 'customFee', - outputs: [ - { internalType: 'uint24', name: '', type: 'uint24' }, - ], - stateMutability: 'view', - type: 'function', - }, - ] as const, - functionName: 'customFee', - args: [pool.address], - }) as const, - ), + contracts: staticPools.map((pool) => ({ + address: this.swapFeeModule[this.chainId]!, + chainId: this.chainId, + abi: customFeeAbi, + functionName: 'customFee', + args: [pool.address], + })), }) .catch((e) => { console.warn( @@ -486,11 +482,11 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi this.swapFeeModule[this.chainId]?.toLowerCase() !== event.args.newFeeModule.toLowerCase() ) { - // currently sushi can't process it correctly, so we need to reset the cached - // pools as they might have wrong fees after swapFeeModule address is changed - // PS: this event is rare + // we need to reset the cached pools fees as they might + // have wrong fees after swapFeeModule address is changed + // PS: this event is very rare this.swapFeeModule[this.chainId] = event.args.newFeeModule - this.reset() + this.shouldResetFees = true } break } @@ -501,39 +497,94 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi } override async afterProcessLog(untilBlock: bigint) { - const pools: SlipstreamPool[] = [] + let pools: SlipstreamPool[] = [] + let shouldResetFees = false + if (this.shouldResetFees) { + shouldResetFees = true + this.shouldResetFees = false + } this.pools.forEach((pool) => { - if ((pool as SlipstreamPool).feeType === FeeType.Dynamic) { + if (shouldResetFees) { pools.push(pool as SlipstreamPool) + } else { + if ((pool as SlipstreamPool).feeType === FeeType.Dynamic) { + pools.push(pool as SlipstreamPool) + } } }) - const [_, poolFees] = await Promise.allSettled([ - // base process + let [_, poolFees] = await Promise.allSettled([ + // base after log process super.afterProcessLog(untilBlock), - // get dynamic pool fees - this.client.multicall({ - multicallAddress: this.client.chain?.contracts?.multicall3?.address!, - allowFailure: true, - blockNumber: untilBlock, - contracts: pools.map( - (pool) => - ({ + // get pool new fees + shouldResetFees + ? this.client.multicall({ + multicallAddress: + this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: untilBlock, + contracts: pools.map((pool) => ({ + address: this.swapFeeModule[this.chainId]!, + chainId: this.chainId, + abi: customFeeAbi, + functionName: 'customFee', + args: [pool.address], + })), + }) + : this.client.multicall({ + multicallAddress: + this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: untilBlock, + contracts: pools.map((pool) => ({ address: pool.address, chainId: this.chainId, abi: feeAbi, functionName: 'fee', - }) as const, - ), - }), + })), + }), ]) - // set dynamic pool fees + // handle pool fees + if (poolFees.status === 'fulfilled') { + if (shouldResetFees) { + const newDynamicPools: SlipstreamPool[] = [] + pools.forEach((pool, i) => { + const result = (poolFees as any).value?.[i]?.result + if (typeof result === 'number') { + if (result === 0) pool.feeType = FeeType.Default + else if (result === ZERO_FEE_INDICATOR) pool.feeType = FeeType.Zero + else { + pool.feeType = FeeType.Dynamic + newDynamicPools.push(pool) + } + } + }) + pools = newDynamicPools + ;[poolFees] = await Promise.allSettled([ + this.client.multicall({ + multicallAddress: + this.client.chain?.contracts?.multicall3?.address!, + allowFailure: true, + blockNumber: untilBlock, + contracts: pools.map((pool) => ({ + address: pool.address, + chainId: this.chainId, + abi: feeAbi, + functionName: 'fee', + })), + }), + ]) + } + } if (poolFees.status === 'fulfilled') { pools.forEach((pool, i) => { - const fee = poolFees.value?.[i]?.result + const fee = (poolFees as any).value?.[i]?.result if (typeof fee === 'number') pool.fee = fee }) + } else { + // if failed to update pool fees, we'll try again on next update + this.shouldResetFees = true } } From c2abb0770b93794f5f8e1f80f8eeecd441accd72 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 18:26:11 +0000 Subject: [PATCH 133/140] update --- .../liquidity-providers/LiquidityProvider.ts | 2 +- .../sushi/src/router/rain/RainDataFetcher.ts | 30 +++++++++++++++---- .../router/rain/VelodromeSlipstreamBase.ts | 4 +-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts index 0dd7cb3d92..79341747ec 100644 --- a/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/LiquidityProvider.ts @@ -166,7 +166,7 @@ export abstract class LiquidityProvider { * such as fetching initial data. * @param _blockNumber - The block height at which should be initialized */ - async init(_blockNumber?: bigint) { + async init(_blockNumber: bigint) { this.initialized = true } diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 3c3d192b40..9330bb40c2 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -90,23 +90,39 @@ import { UniswapV3BaseProvider } from './UniswapV3Base.js' import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' export class RainDataFetcher extends DataFetcher { + initBlockNumber = -1n eventsAbi: ParseAbiItem[] = [] factories: string[] = [] + // make constructor private, must use init() for instantiation + private constructor(chainId: ChainId, publicClient?: PublicClient) { + super(chainId, publicClient) + } + /** * Creates an instance of RainDataFecther, constructor of this class should - * not generally be used, instead, use this method to create a new instance + * not be used, instead, use this method to create a new instance * @param chainId - The chain id * @param publicClient - (optional) The viem client * @param liquidityProviders - (optional) List of liquidity providers, includes all if undefined + * @param initBlockNumber - (optional) Block height to initiailize at * @returns A new instance of RainDataFetcher */ static async init( chainId: ChainId, publicClient?: PublicClient, liquidityProviders?: LiquidityProviders[], + initBlockNumber?: bigint, ): Promise { const dataFetcher = new RainDataFetcher(chainId, publicClient) + if (typeof initBlockNumber === 'bigint') { + if (initBlockNumber < 0n) + throw 'expected block number greater than equal zero' + dataFetcher.initBlockNumber = initBlockNumber + } else { + dataFetcher.initBlockNumber = + await dataFetcher.web3Client.getBlockNumber() + } await dataFetcher.initProviders(liquidityProviders) dataFetcher.startDataFetching(liquidityProviders) return dataFetcher @@ -201,7 +217,6 @@ export class RainDataFetcher extends DataFetcher { const _pendings = [] const _providers = [] - const blockNumber = await this.web3Client.getBlockNumber() for (const p of allProviders) { try { const provider = new p(this.chainId, this.web3Client) @@ -210,7 +225,7 @@ export class RainDataFetcher extends DataFetcher { !providers || this._providerIsIncluded(provider.getType(), providers) ) { - _pendings.push(provider.init(blockNumber)) + _pendings.push(provider.init(this.initBlockNumber)) _providers?.push(provider) } } catch (_e: unknown) {} @@ -256,6 +271,7 @@ export class RainDataFetcher extends DataFetcher { */ async updatePools(untilBlock?: bigint) { let fromBlock = -1n + const poolAddresses: string[] = [] const addresses: string[] = [...this.factories] if (typeof untilBlock !== 'bigint') { untilBlock = await this.web3Client.getBlockNumber() @@ -269,7 +285,7 @@ export class RainDataFetcher extends DataFetcher { ) { const pools = provider.pools pools.forEach((pool, address) => { - addresses.push(address) + poolAddresses.push(address) if (fromBlock === -1n) { fromBlock = pool.blockNumber } @@ -288,15 +304,17 @@ export class RainDataFetcher extends DataFetcher { } } }) - if (!addresses.length) return + if (fromBlock === -1n) return if (fromBlock === untilBlock) return if (fromBlock > untilBlock) { throw [ 'pools data are cached at higher block height than the given untilBlock', 'if you wish to get pools data at untilBlock', - 'consider first resetting the cached data and then getting pools data at your desired block height', + 'consider calling fetchPoolsForToken() with "ignoreCache" option', ].join(', ') } + if (!poolAddresses.length) return + addresses.push(...poolAddresses) // get logs and sort them from earliest block to latest const logs = await this.web3Client.getLogs({ diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index f86a4b5770..c825f82cd4 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -131,7 +131,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi ) } - override async init(blockNumber?: bigint) { + override async init(blockNumber: bigint) { if (!this.initialized) { if (!this.poolImplementation[this.chainId]) { const poolImplementation = await this.client @@ -276,8 +276,6 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi excludePools?: Set | PoolFilter, options?: DataFetcherOptions, ): Promise { - await this.init(options?.blockNumber) - let staticPools = this.getStaticPools(t0, t1) if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) From 39608aaaadeb40f4011818d9f09aedf3f822bc0b Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 20:37:24 +0000 Subject: [PATCH 134/140] update --- packages/sushi/src/router/data-fetcher.ts | 4 ---- .../sushi/src/router/rain/AlgebraV1Base.ts | 7 +++--- .../sushi/src/router/rain/RainDataFetcher.ts | 18 +++++++++++++-- .../sushi/src/router/rain/UniswapV2Base.ts | 7 +++--- .../sushi/src/router/rain/UniswapV3Base.ts | 22 +++++++++++-------- .../router/rain/VelodromeSlipstreamBase.ts | 11 ++++++---- .../route-processor/test/DataFetcher.test.ts | 21 ++++++------------ 7 files changed, 51 insertions(+), 39 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index 39ee411a67..0a4db1ffb6 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -100,10 +100,6 @@ export type DataFetcherOptions = { blockNumber?: bigint /** Determines a timeout (in ms) for fetching pools for a token pair */ fetchPoolsTimeout?: number - /** - * Set to true for ignoring cached pools data and fetch them regardless - */ - ignoreCache?: boolean } // TODO: Should be a mode on the config for DataFetcher diff --git a/packages/sushi/src/router/rain/AlgebraV1Base.ts b/packages/sushi/src/router/rain/AlgebraV1Base.ts index 8f88dcc372..4fca09fed3 100644 --- a/packages/sushi/src/router/rain/AlgebraV1Base.ts +++ b/packages/sushi/src/router/rain/AlgebraV1Base.ts @@ -11,12 +11,12 @@ import { } from 'viem' import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { PoolFilter, StaticPoolUniV3, } from '../liquidity-providers/UniswapV3Base.js' +import { RainDataFetcherOptions } from './RainDataFetcher.js' import { RainV3Pool, UniV3EventsAbi, @@ -95,7 +95,7 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { t0: Token, t1: Token, excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { let staticPools = this.getStaticPools(t0, t1) if (excludePools) @@ -109,7 +109,8 @@ export abstract class AlgebraV1BaseProvider extends UniswapV3BaseProvider { ) // filter out cached pools - if (!options?.ignoreCache) { + // this ensures backward compatibility for original DataFetcher + if (typeof options?.ignoreCache === 'boolean' && !options.ignoreCache) { staticPools = this.filterCachedPools(staticPools) } diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 9330bb40c2..fe210d02ce 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -89,6 +89,14 @@ import { UniswapV2BaseProvider } from './UniswapV2Base.js' import { UniswapV3BaseProvider } from './UniswapV3Base.js' import { VelodromeSlipstreamBaseProvider } from './VelodromeSlipstreamBase.js' +// options for data fetching, such as pinning block number and memoize +export interface RainDataFetcherOptions extends DataFetcherOptions { + /** + * Set to true for ignoring cached pools data and fetch them regardless + */ + ignoreCache?: boolean +} + export class RainDataFetcher extends DataFetcher { initBlockNumber = -1n eventsAbi: ParseAbiItem[] = [] @@ -391,7 +399,7 @@ export class RainDataFetcher extends DataFetcher { amountIn: bigint, gasPrice: bigint, update = false, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, lps?: LiquidityProviders[], poolFilter?: PoolFilter, routeType: 'single' | 'multi' = 'single', @@ -408,6 +416,9 @@ export class RainDataFetcher extends DataFetcher { if (typeof opts.blockNumber !== 'bigint') { opts.blockNumber = await this.web3Client.getBlockNumber() } + if (typeof opts.ignoreCache !== 'boolean') { + opts.ignoreCache = false + } if (update) await this.updatePools(opts.blockNumber) await this.fetchPoolsForToken(fromToken, toToken, undefined, opts) @@ -441,12 +452,15 @@ export class RainDataFetcher extends DataFetcher { currency0: Type, currency1: Type, excludePools?: Set, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { const opts = { ...options } if (typeof opts.blockNumber !== 'bigint') { opts.blockNumber = await this.web3Client.getBlockNumber() } + if (typeof opts.ignoreCache !== 'boolean') { + opts.ignoreCache = false + } await super.fetchPoolsForToken(currency0, currency1, excludePools, opts) } } diff --git a/packages/sushi/src/router/rain/UniswapV2Base.ts b/packages/sushi/src/router/rain/UniswapV2Base.ts index 6bdae74475..a00732a0d5 100644 --- a/packages/sushi/src/router/rain/UniswapV2Base.ts +++ b/packages/sushi/src/router/rain/UniswapV2Base.ts @@ -1,12 +1,12 @@ import { Log, parseAbiItem, parseEventLogs } from 'viem' import { Token } from '../../currency/index.js' import { ConstantProductRPool, RToken } from '../../tines/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' import { StaticPool, UniswapV2BaseProvider as _UniswapV2BaseProvider, } from '../liquidity-providers/UniswapV2Base.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' +import { RainDataFetcherOptions } from './RainDataFetcher.js' // extends v2 static pool export interface RainV2Pool extends StaticPool { @@ -31,7 +31,7 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { t0: Token, t1: Token, excludePools?: Set, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { let pools = this.getStaticPools(t0, t1) if (excludePools) @@ -49,7 +49,8 @@ export abstract class UniswapV2BaseProvider extends _UniswapV2BaseProvider { ) // filter out cached pools - if (!options?.ignoreCache) { + // this ensures backward compatibility for original DataFetcher + if (typeof options?.ignoreCache === 'boolean' && !options.ignoreCache) { pools = this.filterCachedPools(pools as StaticPool[]) } diff --git a/packages/sushi/src/router/rain/UniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts index df3560719d..45c75f041a 100644 --- a/packages/sushi/src/router/rain/UniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -2,7 +2,6 @@ import { Address, Log, parseAbiItem, parseEventLogs } from 'viem' import { erc20Abi, slot0Abi, tickLensAbi } from '../../abi/index.js' import { Token } from '../../currency/index.js' import { CLTick, RToken, UniV3Pool } from '../../tines/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' import { NUMBER_OF_SURROUNDING_TICKS, PoolFilter, @@ -12,6 +11,7 @@ import { bitmapIndex, } from '../liquidity-providers/UniswapV3Base.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' +import { RainDataFetcherOptions } from './RainDataFetcher.js' // extends V3Pool from UniswapV3Base export interface RainV3Pool extends V3Pool { @@ -72,7 +72,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { t0: Token, t1: Token, excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { let staticPools = this.getStaticPools(t0, t1) if (excludePools) @@ -86,7 +86,8 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { ) // filter out cached pools - if (!options?.ignoreCache) { + // this ensures backward compatibility for original DataFetcher + if (typeof options?.ignoreCache === 'boolean' && !options.ignoreCache) { staticPools = this.filterCachedPools(staticPools) } @@ -170,7 +171,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { t0: Token, t1: Token, excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { const existingPools = await this.fetchPoolData( t0, @@ -264,7 +265,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { */ async getReserves( existingPools: RainV3Pool[], - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise<([bigint, bigint] | undefined)[]> { const results = await this.client .multicall({ @@ -319,7 +320,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { */ async getLiquidity( existingPools: RainV3Pool[], - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise<(bigint | undefined)[]> { const results = await this.client .multicall({ @@ -373,7 +374,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { */ async getTicks( existingPools: RainV3Pool[], - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise[] | undefined> { const [minIndexes, maxIndexes] = this.getIndexes(existingPools) const wordList = existingPools.map((pool, i) => { @@ -393,7 +394,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { */ async getTicksInner( existingPools: [RainV3Pool, number[]][], - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise[] | undefined> { const wordList = existingPools.flatMap(([pool, words], i) => { return words.flatMap((j) => ({ @@ -448,7 +449,10 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { /** * Fecthes tick spacing of the given list of pools */ - async getTickSpacing(pools: StaticPoolUniV3[], options?: DataFetcherOptions) { + async getTickSpacing( + pools: StaticPoolUniV3[], + options?: RainDataFetcherOptions, + ) { return await this.client .multicall({ multicallAddress: this.client.chain?.contracts?.multicall3 diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index c825f82cd4..06bfd1ea7f 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -12,12 +12,12 @@ import { } from 'viem' import { ChainId } from '../../chain/index.js' import { Token } from '../../currency/index.js' -import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' import { PoolFilter, StaticPoolUniV3, } from '../liquidity-providers/UniswapV3Base.js' +import { RainDataFetcherOptions } from './RainDataFetcher.js' import { RainV3Pool, UniV3EventsAbi, @@ -131,7 +131,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi ) } - override async init(blockNumber: bigint) { + override async init(blockNumber?: bigint) { if (!this.initialized) { if (!this.poolImplementation[this.chainId]) { const poolImplementation = await this.client @@ -274,8 +274,10 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi t0: Token, t1: Token, excludePools?: Set | PoolFilter, - options?: DataFetcherOptions, + options?: RainDataFetcherOptions, ): Promise { + await this.init(options?.blockNumber) + let staticPools = this.getStaticPools(t0, t1) if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) @@ -288,7 +290,8 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi ) // filter out cached pools - if (!options?.ignoreCache) { + // this ensures backward compatibility for original DataFetcher + if (typeof options?.ignoreCache === 'boolean' && !options.ignoreCache) { staticPools = this.filterCachedPools( staticPools, ) as StaticSlipstreamPool[] diff --git a/protocols/route-processor/test/DataFetcher.test.ts b/protocols/route-processor/test/DataFetcher.test.ts index 5140e92728..bb5a3ea261 100644 --- a/protocols/route-processor/test/DataFetcher.test.ts +++ b/protocols/route-processor/test/DataFetcher.test.ts @@ -12,8 +12,8 @@ import { WNATIVE, } from 'sushi/currency' import { + DataFetcher, LiquidityProviders, - RainDataFetcher, Router, UniV3LiquidityProviders, } from 'sushi/router' @@ -21,7 +21,7 @@ import { UniswapV3BaseProvider } from '../../../packages/sushi/dist/router/liqui async function testDF( _chainName: string, - dataFetcher: RainDataFetcher, + dataFetcher: DataFetcher, t0: Type | undefined, t1: Type | undefined, name0: string, @@ -77,25 +77,20 @@ function reportMissingDexes(reports: Record[]): { // tries to find a route for a token pair from current fetched pools function findRoute( - dataFetcher: RainDataFetcher, + dataFetcher: DataFetcher, fromToken: Type, toToken: Type, chainId: ChainId, liquidityProviders?: LiquidityProviders[], - amountIn?: bigint, ): boolean { try { // find the best route map const pcMap = dataFetcher.getCurrentPoolCodeMap(fromToken, toToken) - amountIn = - typeof amountIn !== 'bigint' - ? BigInt(`1${'0'.repeat(fromToken.decimals)}`) - : amountIn const route = Router.findBestRoute( pcMap, chainId, fromToken, - amountIn, + BigInt(`1${'0'.repeat(fromToken.decimals)}`), toToken, 30e9, liquidityProviders, @@ -133,13 +128,14 @@ const chainIds = Object.values(ChainId).filter((v) => { }) async function runTest() { - describe.only('RainDataFetcher Pools/Time check', async () => { + describe.only('DataFetcher Pools/Time check', async () => { chainIds.forEach((chainId) => { //if (chainId !== ChainId.OPTIMISM) return const chName = chainName[chainId] + const dataFetcher = DataFetcher.onChain(chainId) + it(`${chName}(${chainId})`, async () => { - const dataFetcher = await RainDataFetcher.init(chainId) dataFetcher.startDataFetching() console.log(chName) const allFoundPools = [] @@ -166,9 +162,6 @@ async function runTest() { WNATIVE[chainId], USDC[chainId as keyof typeof USDC], chainId, - undefined, - // BTTC price against USDC is low, we need more amountIn for a swap - chainId === ChainId.BTTC ? 10n ** 22n : undefined, ), ) await sleep(60_000) From 6f7e289da15fe735c7a640a356aa8ac0d01b12a4 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 21:02:37 +0000 Subject: [PATCH 135/140] typo and docs --- packages/sushi/src/router/rain/UniswapV3Base.ts | 10 +++++----- .../src/router/rain/VelodromeSlipstreamBase.ts | 14 ++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/sushi/src/router/rain/UniswapV3Base.ts b/packages/sushi/src/router/rain/UniswapV3Base.ts index 45c75f041a..e752425ed2 100644 --- a/packages/sushi/src/router/rain/UniswapV3Base.ts +++ b/packages/sushi/src/router/rain/UniswapV3Base.ts @@ -261,7 +261,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Fecthes reserves of the given list of pools + * Fetches reserves of the given list of pools */ async getReserves( existingPools: RainV3Pool[], @@ -316,7 +316,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Fecthes liquidity of the given list of pools + * Fetches liquidity of the given list of pools */ async getLiquidity( existingPools: RainV3Pool[], @@ -370,7 +370,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Fecthes ticks capped at pool boundries of the given list of pools + * Fetches ticks capped at pool boundries of the given list of pools */ async getTicks( existingPools: RainV3Pool[], @@ -390,7 +390,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Fecthes ticks of the given list of pools + * Fetches ticks of the given list of pools */ async getTicksInner( existingPools: [RainV3Pool, number[]][], @@ -447,7 +447,7 @@ export abstract class UniswapV3BaseProvider extends _UniswapV3BaseProvider { } /** - * Fecthes tick spacing of the given list of pools + * Fetches tick spacing of the given list of pools */ async getTickSpacing( pools: StaticPoolUniV3[], diff --git a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts index 06bfd1ea7f..72b38cdad8 100644 --- a/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts +++ b/packages/sushi/src/router/rain/VelodromeSlipstreamBase.ts @@ -109,6 +109,8 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi feeSpacingMap: Record = {} // fee to tick spacing map spacingFeeMap: Record = {} // tick spacing to fee map + // poolImplementation and swapFeeModule addresses, fetched at init() from + // factory since they can change over time and are not contract constants poolImplementation: Record = {} swapFeeModule: Record = {} @@ -125,7 +127,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi chainId, web3Client, factory, - { [chainId]: `0x${'0'.repeat(64)}` }, + { [chainId]: `0x${'0'.repeat(64)}` }, // dummy, since slipstream has no initCodeHash tickLens, isTest, ) @@ -153,7 +155,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi }) .catch((e) => { console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + `${this.getLogPrefix()} - INIT: failed to get poolImplementation address, message: ${ e.message }`, ) @@ -183,7 +185,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi }) .catch((e) => { console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + `${this.getLogPrefix()} - INIT: failed to get swapFeeModule address, message: ${ e.message }`, ) @@ -213,7 +215,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi }) .catch((e) => { console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + `${this.getLogPrefix()} - INIT: failed to get tickSpacings, message: ${ e.message }`, ) @@ -250,7 +252,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi }) .catch((e) => { console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + `${this.getLogPrefix()} - INIT: multicall failed to get tickSpacingToFee, message: ${ e.message }`, ) @@ -478,7 +480,7 @@ export abstract class VelodromeSlipstreamBaseProvider extends UniswapV3BaseProvi break } case 'SwapFeeModuleChanged': { - // factory swapFeeMoulde address changed + // factory swapFeeModule address changed if ( this.swapFeeModule[this.chainId]?.toLowerCase() !== event.args.newFeeModule.toLowerCase() From d49bfe2f9f29c84cd82dd2520a5a355be0afe6f0 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Wed, 9 Apr 2025 23:41:07 +0000 Subject: [PATCH 136/140] typo --- packages/sushi/src/router/liquidity-providers/Camelot.ts | 2 +- packages/sushi/src/router/rain/RainDataFetcher.ts | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/sushi/src/router/liquidity-providers/Camelot.ts b/packages/sushi/src/router/liquidity-providers/Camelot.ts index f2ceb97ed2..e2f61130d9 100644 --- a/packages/sushi/src/router/liquidity-providers/Camelot.ts +++ b/packages/sushi/src/router/liquidity-providers/Camelot.ts @@ -2,8 +2,8 @@ import { Address, PublicClient, parseAbi } from 'viem' import { ChainId } from '../../chain/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { type PoolCode } from '../pool-codes/index.js' -import { UniswapV2BaseProvider } from '../rain/UniswapV2Base.js' import { LiquidityProviders } from './LiquidityProvider.js' +import { UniswapV2BaseProvider } from './UniswapV2Base.js' type IsStableSwap = | ( diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index fe210d02ce..1735b86302 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -155,10 +155,8 @@ export class RainDataFetcher extends DataFetcher { BlastDEXProvider, BlazeSwapProvider, BSCSwapProvider, - // CamelotProvider, CORExProvider, CroDefiSwapProvider, - // CurveProvider, DackieSwapV2Provider, DackieSwapV3Provider, DfynProvider, @@ -211,7 +209,6 @@ export class RainDataFetcher extends DataFetcher { ThrusterV2_3Provider, ThrusterV3Provider, TraderJoeProvider, - // TridentProvider, UbeSwapProvider, UniswapV2Provider, UniswapV3Provider, From 23b90655eac5190402a321e5327432a0c9072bca Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Thu, 10 Apr 2025 00:01:10 +0000 Subject: [PATCH 137/140] typo --- packages/sushi/src/router/rain/RainDataFetcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 1735b86302..0cd4324d5a 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -108,7 +108,7 @@ export class RainDataFetcher extends DataFetcher { } /** - * Creates an instance of RainDataFecther, constructor of this class should + * Creates an instance of RainDataFetcher, constructor of this class should * not be used, instead, use this method to create a new instance * @param chainId - The chain id * @param publicClient - (optional) The viem client From 09fc43740c1f6517c577f72e98b9744b9e22b5fa Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Thu, 10 Apr 2025 00:24:46 +0000 Subject: [PATCH 138/140] typo --- packages/sushi/src/router/rain/RainDataFetcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 0cd4324d5a..5a937e622e 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -113,7 +113,7 @@ export class RainDataFetcher extends DataFetcher { * @param chainId - The chain id * @param publicClient - (optional) The viem client * @param liquidityProviders - (optional) List of liquidity providers, includes all if undefined - * @param initBlockNumber - (optional) Block height to initiailize at + * @param initBlockNumber - (optional) Block height to initialize at * @returns A new instance of RainDataFetcher */ static async init( From 05922fede2e3c3ce0d5cd2b8bc0f09b9f3d53f25 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 5 May 2025 17:45:15 +0000 Subject: [PATCH 139/140] Update RainDataFetcher.ts --- packages/sushi/src/router/rain/RainDataFetcher.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 5a937e622e..07f36251e5 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -313,9 +313,11 @@ export class RainDataFetcher extends DataFetcher { if (fromBlock === untilBlock) return if (fromBlock > untilBlock) { throw [ - 'pools data are cached at higher block height than the given untilBlock', + 'pools data are cached at higher block height than the requested block height', 'if you wish to get pools data at untilBlock', 'consider calling fetchPoolsForToken() with "ignoreCache" option', + `pools block: ${fromBlock}`, + `current block: ${untilBlock}`, ].join(', ') } if (!poolAddresses.length) return From 2ad5d30bd4b799c268e09d94a4317a7dd773bfa7 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 5 May 2025 17:51:06 +0000 Subject: [PATCH 140/140] Update RainDataFetcher.ts --- packages/sushi/src/router/rain/RainDataFetcher.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/sushi/src/router/rain/RainDataFetcher.ts b/packages/sushi/src/router/rain/RainDataFetcher.ts index 07f36251e5..3c6503443c 100644 --- a/packages/sushi/src/router/rain/RainDataFetcher.ts +++ b/packages/sushi/src/router/rain/RainDataFetcher.ts @@ -314,10 +314,11 @@ export class RainDataFetcher extends DataFetcher { if (fromBlock > untilBlock) { throw [ 'pools data are cached at higher block height than the requested block height', - 'if you wish to get pools data at untilBlock', + 'if you wish to get pools data at your requested block height', 'consider calling fetchPoolsForToken() with "ignoreCache" option', - `pools block: ${fromBlock}`, - `current block: ${untilBlock}`, + 'so that pools data can fetched for lower block height than what they are currently cached at', + `pools block height: ${fromBlock}`, + `requested block height: ${untilBlock}`, ].join(', ') } if (!poolAddresses.length) return