From 26b03a8bd0958292ace4dd87153eb3bdb2e47433 Mon Sep 17 00:00:00 2001 From: m-r-g-t Date: Mon, 28 Aug 2023 22:07:28 +0100 Subject: [PATCH 1/2] ci: update poetry source --- .github/workflows/github-actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index cd7e140e..311faaea 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -21,7 +21,7 @@ jobs: - name: Bootstrap poetry shell: bash run: | - curl -sL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py \ + curl -sSL https://install.python-poetry.org \ | python - -y - name: Update PATH From 85949339323b11895096d76c011ffc534f099d1b Mon Sep 17 00:00:00 2001 From: m-r-g-t Date: Fri, 6 Oct 2023 14:20:06 +0100 Subject: [PATCH 2/2] feat: update univ3 internal addresses + abis * feat: update abi schema * feat: update abis and addresses * chore: add 1inchrouters + reorg list --- mev_inspect/abis/uniswap_v3/Permit2.json | 901 ++++++++++++++++++ .../abis/uniswap_v3/UniversalRouter.json | 497 ++++++++++ mev_inspect/classifiers/specs/uniswap.py | 23 +- mev_inspect/sandwiches.py | 11 +- mev_inspect/schemas/abi.py | 2 + mev_inspect/tokenflow.py | 14 +- 6 files changed, 1438 insertions(+), 10 deletions(-) create mode 100644 mev_inspect/abis/uniswap_v3/Permit2.json create mode 100644 mev_inspect/abis/uniswap_v3/UniversalRouter.json diff --git a/mev_inspect/abis/uniswap_v3/Permit2.json b/mev_inspect/abis/uniswap_v3/Permit2.json new file mode 100644 index 00000000..41be1016 --- /dev/null +++ b/mev_inspect/abis/uniswap_v3/Permit2.json @@ -0,0 +1,901 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "AllowanceExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ExcessiveInvalidation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxAmount", + "type": "uint256" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractSignature", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidNonce", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSigner", + "type": "error" + }, + { + "inputs": [], + "name": "LengthMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "signatureDeadline", + "type": "uint256" + } + ], + "name": "SignatureExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "Lockdown", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "newNonce", + "type": "uint48" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "oldNonce", + "type": "uint48" + } + ], + "name": "NonceInvalidation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + }, + { + "indexed": false, + "internalType": "uint48", + "name": "nonce", + "type": "uint48" + } + ], + "name": "Permit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "word", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "mask", + "type": "uint256" + } + ], + "name": "UnorderedNonceInvalidation", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "nonce", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint48", + "name": "newNonce", + "type": "uint48" + } + ], + "name": "invalidateNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wordPos", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mask", + "type": "uint256" + } + ], + "name": "invalidateUnorderedNonces", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "internalType": "struct IAllowanceTransfer.TokenSpenderPair[]", + "name": "approvals", + "type": "tuple[]" + } + ], + "name": "lockdown", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nonceBitmap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "nonce", + "type": "uint48" + } + ], + "internalType": "struct IAllowanceTransfer.PermitDetails[]", + "name": "details", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sigDeadline", + "type": "uint256" + } + ], + "internalType": "struct IAllowanceTransfer.PermitBatch", + "name": "permitBatch", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "uint48", + "name": "expiration", + "type": "uint48" + }, + { + "internalType": "uint48", + "name": "nonce", + "type": "uint48" + } + ], + "internalType": "struct IAllowanceTransfer.PermitDetails", + "name": "details", + "type": "tuple" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sigDeadline", + "type": "uint256" + } + ], + "internalType": "struct IAllowanceTransfer.PermitSingle", + "name": "permitSingle", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.TokenPermissions", + "name": "permitted", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.PermitTransferFrom", + "name": "permit", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requestedAmount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.SignatureTransferDetails", + "name": "transferDetails", + "type": "tuple" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permitTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.TokenPermissions[]", + "name": "permitted", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.PermitBatchTransferFrom", + "name": "permit", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requestedAmount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.SignatureTransferDetails[]", + "name": "transferDetails", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permitTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.TokenPermissions", + "name": "permitted", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.PermitTransferFrom", + "name": "permit", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requestedAmount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.SignatureTransferDetails", + "name": "transferDetails", + "type": "tuple" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "witness", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "witnessTypeString", + "type": "string" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permitWitnessTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.TokenPermissions[]", + "name": "permitted", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.PermitBatchTransferFrom", + "name": "permit", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requestedAmount", + "type": "uint256" + } + ], + "internalType": "struct ISignatureTransfer.SignatureTransferDetails[]", + "name": "transferDetails", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "witness", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "witnessTypeString", + "type": "string" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "permitWitnessTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "internalType": "struct IAllowanceTransfer.AllowanceTransferDetails[]", + "name": "transferDetails", + "type": "tuple[]" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint160", + "name": "amount", + "type": "uint160" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/mev_inspect/abis/uniswap_v3/UniversalRouter.json b/mev_inspect/abis/uniswap_v3/UniversalRouter.json new file mode 100644 index 00000000..abd8ecea --- /dev/null +++ b/mev_inspect/abis/uniswap_v3/UniversalRouter.json @@ -0,0 +1,497 @@ +[ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "permit2", + "type": "address" + }, + { + "internalType": "address", + "name": "weth9", + "type": "address" + }, + { + "internalType": "address", + "name": "seaportV1_5", + "type": "address" + }, + { + "internalType": "address", + "name": "seaportV1_4", + "type": "address" + }, + { + "internalType": "address", + "name": "openseaConduit", + "type": "address" + }, + { + "internalType": "address", + "name": "nftxZap", + "type": "address" + }, + { + "internalType": "address", + "name": "x2y2", + "type": "address" + }, + { + "internalType": "address", + "name": "foundation", + "type": "address" + }, + { + "internalType": "address", + "name": "sudoswap", + "type": "address" + }, + { + "internalType": "address", + "name": "elementMarket", + "type": "address" + }, + { + "internalType": "address", + "name": "nft20Zap", + "type": "address" + }, + { + "internalType": "address", + "name": "cryptopunks", + "type": "address" + }, + { + "internalType": "address", + "name": "looksRareV2", + "type": "address" + }, + { + "internalType": "address", + "name": "routerRewardsDistributor", + "type": "address" + }, + { + "internalType": "address", + "name": "looksRareRewardsDistributor", + "type": "address" + }, + { + "internalType": "address", + "name": "looksRareToken", + "type": "address" + }, + { + "internalType": "address", + "name": "v2Factory", + "type": "address" + }, + { + "internalType": "address", + "name": "v3Factory", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "pairInitCodeHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "poolInitCodeHash", + "type": "bytes32" + } + ], + "internalType": "struct RouterParameters", + "name": "params", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BalanceTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "BuyPunkFailed", + "type": "error" + }, + { + "inputs": [], + "name": "ContractLocked", + "type": "error" + }, + { + "inputs": [], + "name": "ETHNotAccepted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "commandIndex", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + } + ], + "name": "ExecutionFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FromAddressIsNotOwner", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientETH", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientToken", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBips", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "commandType", + "type": "uint256" + } + ], + "name": "InvalidCommandType", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOwnerERC1155", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOwnerERC721", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidReserves", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "LengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "SliceOutOfBounds", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionDeadlinePassed", + "type": "error" + }, + { + "inputs": [], + "name": "UnableToClaim", + "type": "error" + }, + { + "inputs": [], + "name": "UnsafeCast", + "type": "error" + }, + { + "inputs": [], + "name": "V2InvalidPath", + "type": "error" + }, + { + "inputs": [], + "name": "V2TooLittleReceived", + "type": "error" + }, + { + "inputs": [], + "name": "V2TooMuchRequested", + "type": "error" + }, + { + "inputs": [], + "name": "V3InvalidAmountOut", + "type": "error" + }, + { + "inputs": [], + "name": "V3InvalidCaller", + "type": "error" + }, + { + "inputs": [], + "name": "V3InvalidSwap", + "type": "error" + }, + { + "inputs": [], + "name": "V3TooLittleReceived", + "type": "error" + }, + { + "inputs": [], + "name": "V3TooMuchRequested", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardsSent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "looksRareClaim", + "type": "bytes" + } + ], + "name": "collectRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "commands", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "inputs", + "type": "bytes[]" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "commands", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "inputs", + "type": "bytes[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "amount0Delta", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1Delta", + "type": "int256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "uniswapV3SwapCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 2ead4469..96a94ff9 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -66,12 +66,18 @@ def parse_swap( ClassifierSpec( abi_name="Quoter", protocol=Protocol.uniswap_v3, - valid_contract_addresses=["0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6"], + valid_contract_addresses=[ + "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + ], ), ClassifierSpec( abi_name="SwapRouter", protocol=Protocol.uniswap_v3, - valid_contract_addresses=["0xE592427A0AEce92De3Edee1F18E0157C05861564"], + valid_contract_addresses=[ + "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45", + ], ), ClassifierSpec( abi_name="NFTDescriptor", @@ -98,6 +104,19 @@ def parse_swap( protocol=Protocol.uniswap_v3, valid_contract_addresses=["0xA5644E29708357803b5A882D272c41cC0dF92B34"], ), + ClassifierSpec( + abi_name="Permit2", + protocol=Protocol.uniswap_v3, + valid_contract_addresses=["0x000000000022d473030f116ddee9f6b43ac78ba3"], + ), + ClassifierSpec( + abi_name="UniversalRouter", + protocol=Protocol.uniswap_v3, + valid_contract_addresses=[ + "0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b", + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad", + ], + ), ] UNISWAP_V3_GENERAL_SPECS = [ diff --git a/mev_inspect/sandwiches.py b/mev_inspect/sandwiches.py index 447f0576..ba37a35e 100644 --- a/mev_inspect/sandwiches.py +++ b/mev_inspect/sandwiches.py @@ -4,8 +4,12 @@ from mev_inspect.schemas.swaps import Swap UNISWAP_V2_ROUTER = "0x7a250d5630b4cf539739df2c5dacb4c659f2488d" -UNISWAP_V3_ROUTER = "0xe592427a0aece92de3edee1f18e0157c05861564" -UNISWAP_V3_ROUTER_2 = "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45" +UNISWAP_V3_ROUTERS = [ + "0xe592427a0aece92de3edee1f18e0157c05861564", # UniswapV3SwapRouter + "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45", # UniswapV3SwapRouter02 + "0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b", # UniswapV3UniversalRouter + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad", # UniswapV3UniversalRouter02 +] def get_sandwiches(swaps: List[Swap]) -> List[Sandwich]: @@ -37,8 +41,7 @@ def _get_sandwich_starting_with_swap( if sandwicher_address in [ UNISWAP_V2_ROUTER, - UNISWAP_V3_ROUTER, - UNISWAP_V3_ROUTER_2, + *UNISWAP_V3_ROUTERS, ]: return None diff --git a/mev_inspect/schemas/abi.py b/mev_inspect/schemas/abi.py index c3ec813c..a161e85c 100644 --- a/mev_inspect/schemas/abi.py +++ b/mev_inspect/schemas/abi.py @@ -13,6 +13,7 @@ class ABIDescriptionType(str, Enum): fallback = "fallback" event = "event" receive = "receive" + error = "error" NON_FUNCTION_DESCRIPTION_TYPES = Union[ @@ -20,6 +21,7 @@ class ABIDescriptionType(str, Enum): Literal[ABIDescriptionType.fallback], Literal[ABIDescriptionType.event], Literal[ABIDescriptionType.receive], + Literal[ABIDescriptionType.error], ] diff --git a/mev_inspect/tokenflow.py b/mev_inspect/tokenflow.py index d3b147e2..0389b183 100644 --- a/mev_inspect/tokenflow.py +++ b/mev_inspect/tokenflow.py @@ -34,6 +34,8 @@ def is_known_router_address(address): "0x11111254369792b2Ca5d084aB5eEA397cA8fa48B", # 1inch v1 router "0x111111125434b319222cdbf8c261674adb56f3ae", # 1inch v2 router "0x11111112542d85b3ef69ae05771c2dccff4faa26", # 1inch v3 router + "0x1111111254fb6c44bac0bed2854e76f90643097d" # 1inch v4 router + "0x1111111254eeb25477b68fb85ed929f73a960582" # 1inch v5 router "0xa356867fdcea8e71aeaf87805808803806231fdc", # DODO "0xdef1c0ded9bec7f1a1670819833240f027b25eff", # 0x proxy "0x90f765f63e7dc5ae97d6c576bf693fb6af41c129", # Set Trade @@ -41,17 +43,21 @@ def is_known_router_address(address): "0x9509665d015bfe3c77aa5ad6ca20c8afa1d98989", # Paraswap "0x86969d29F5fd327E1009bA66072BE22DB6017cC6", # Paraswap v2 "0xf90e98f3d8dce44632e5020abf2e122e0f99dfab", # Paraswap v3 + "0x1bD435F3C054b6e901B7b108a0ab7617C808677b", # Paraswap v4 "0x57805e5a227937bac2b0fdacaa30413ddac6b8e1", # Furucombo "0x17e8ca1b4798b97602895f63206afcd1fc90ca5f", # Furucombo proxy "0x881d40237659c251811cec9c364ef91dc08d300c", # Metamask swap "0x745daa146934b27e3f0b6bff1a6e36b9b90fb131", # DEX.ag "0xb2be281e8b11b47fec825973fc8bb95332022a54", # Zerion SDK - "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", # UniswapV2Router02 - "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", # SushiswapV2Router02 - "0xE592427A0AEce92De3Edee1F18E0157C05861564", # Uniswap v3 router "0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21", # Balance exchange proxy - "0x1bD435F3C054b6e901B7b108a0ab7617C808677b", # Paraswap v4 "0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F", # SNX proxy synth issuer + "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", # SushiswapV2Router02 + "0xf164fC0Ec4E93095b804a4795bBe1e041497b92a", # UniswapV2Router + "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", # UniswapV2Router02 + "0xE592427A0AEce92De3Edee1F18E0157C05861564", # UniswapV3SwapRouter + "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", # UniswapV3SwapRouter02 + "0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B", # UniswapV3UniversalRouter + "0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD", # UniswapV3UniversalRouter02 ] return address in known_router_addresses