Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ahmedali8/detect-evm-proxy
Detect proxy contracts and their target addresses using an EIP-1193 compatible JSON-RPC request function
https://github.com/ahmedali8/detect-evm-proxy
data-science ethereum evm gnosis multisig proxy
Last synced: 2 days ago
JSON representation
Detect proxy contracts and their target addresses using an EIP-1193 compatible JSON-RPC request function
- Host: GitHub
- URL: https://github.com/ahmedali8/detect-evm-proxy
- Owner: ahmedali8
- License: mit
- Created: 2022-12-26T10:24:38.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2022-12-26T14:02:11.000Z (almost 2 years ago)
- Last Synced: 2024-10-13T16:07:45.928Z (about 1 month ago)
- Topics: data-science, ethereum, evm, gnosis, multisig, proxy
- Language: TypeScript
- Homepage:
- Size: 96.7 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# detect-evm-proxy
Detect proxy contracts and their target addresses using an
[EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compatible JSON-RPC
`request` functionThis package offers a utility function for checking if a smart contract at a
given address implements one of the known proxy patterns. It detects the
following kinds of proxies:- [EIP-1167](https://eips.ethereum.org/EIPS/eip-1167) Minimal Proxy Contract
- [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967) Transparent Proxy Pattern
- [EIP-897](https://eips.ethereum.org/EIPS/eip-897) Delegate Proxy Pattern
- [EIP-1822](https://eips.ethereum.org/EIPS/eip-1822) Universal Upgradeable
Proxy Standard
- OpenZeppelin Proxy Pattern
- Gnosis Safe Proxy Contract## Installation
This module is distributed via npm. For adding it to your project, run:
```
npm install --save detect-evm-proxy
```To install it using yarn, run:
```
yarn add detect-evm-proxy
```## How to use
The function requires an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193)
compatible `request` function that it uses to make JSON-RPC requests to run a
set of checks against the given address. It returns a promise that resolves to
the proxy target address, i.e., the address of the contract implementing the
logic. The promise resolves to `null` if no proxy can be detected.### Ethers with an adapter function
Using Infura:
```ts
import { InfuraProvider } from "@ethersproject/providers";
import detectProxyTarget from "detect-evm-proxy";const infuraProvider = new InfuraProvider(1, process.env.INFURA_API_KEY);
const requestFunc = ({ method, params }) => infuraProvider.send(method, params);const target = await detectProxyTarget(
"0xA7AeFeaD2F25972D80516628417ac46b3F2604Af",
requestFunc
);// logs {contractAddress: "0x4bd844F72A8edD323056130A86FC624D0dbcF5b0", kind: "EIP-1967 Transparent Proxy Pattern"}
console.log(target);
```Using ankr:
```ts
import { JsonRpcProvider } from "@ethersproject/providers";
import detectProxyTarget from "detect-evm-proxy";const jsonRpcProvider = new JsonRpcProvider("https://rpc.ankr.com/eth");
const requestFunc: EIP1193ProviderRequestFunc = ({ method, params }) =>
jsonRpcProvider.send(method, params);const target = await detectProxyTarget(
"0xA7AeFeaD2F25972D80516628417ac46b3F2604Af",
requestFunc
);// logs {contractAddress: "0x4bd844F72A8edD323056130A86FC624D0dbcF5b0", kind: "EIP-1967 Transparent Proxy Pattern"}
console.log(target);
```### Web3 with an EIP1193 provider
Web3.js doesn't have a way to export an EIP1193 provider, so you need to ensure
that the underlying provider you use is EIP1193 compatible. Most
Ethereum-supported browsers like MetaMask and TrustWallet have an
[EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant provider.
Otherwise, you can use providers like
[eip1193-provider](https://www.npmjs.com/package/eip1193-provider).```ts
import detectProxyTarget from "detect-evm-proxy";
import Web3 from "web3";const web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
const target = await detectProxyTarget(
"0xA7AeFeaD2F25972D80516628417ac46b3F2604Af",
web3.currentProvider.request
);// logs {contractAddress: "0x4bd844F72A8edD323056130A86FC624D0dbcF5b0", kind: "EIP-1967 Transparent Proxy Pattern"}
console.log(target);
```## API
```ts
detectProxyTarget(
address: string,
jsonRpcRequest: EIP1193ProviderRequestFunc,
blockTag?: BlockTag
): Promise// where
DetectProxyTarget: {
contractAddress: string,
kind: ProxyKind, // ProxyKind: string
}```
**Arguments**
- `address` (string): The address of the proxy contract
- `jsonRpcRequest` (EIP1193ProviderRequestFunc): A JSON-RPC request function,
compatible with [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193)
(`(method: string, params: any[]) => Promise`)
- `blockTag` (optional: BlockTag): `"earliest"`, `"latest"`, `"pending"` or hex
block number, default is `"latest"`**Returns**
The function returns a promise that will generally resolve to either
`DetectProxyTarget`(the detected target contract address (checksummed) and its
kind) or `null` if it couldn't detect one.## Note
Directly modified from
[evm-proxy-detection](https://github.com/gnosis/evm-proxy-detection)