An iframe component that allows to open dapps with any Ethereum address impersonated.
Wrap your App in the ImpersonatorIframeProvider
as follows:
import { ImpersonatorIframeProvider } from "@impersonator/iframe";
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<ImpersonatorIframeProvider>
<App />
</ImpersonatorIframeProvider>
</React.StrictMode>
);
Then use the ImpersonatorIframe
component to open the dapp you want to impersonate:
import {
ImpersonatorIframe,
useImpersonatorIframe,
} from "@impersonator/iframe";
function App() {
return (
<ImpersonatorIframe
width={"1000px"}
height={"500px"}
src="https://app.uniswap.org"
address="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" // vitalik.eth
rpcUrl="https://eth.llamarpc.com"
/>
);
}
To handle transactions and message signing from the dapp, pass callback functions to the provider:
import { ImpersonatorIframeProvider } from "@impersonator/iframe";
function AppWithHandlers() {
const handleTransaction = async (tx) => {
console.log("Transaction request:", tx);
// Process the transaction and return the transaction hash
return "0x..."; // Return the tx hash
};
const handleSignMessage = async (message) => {
console.log("Sign message request:", message);
// Sign the message and return the signature
return "0x..."; // Return the signature
};
const handleSignTypedData = async (typedData) => {
console.log("Sign typed data request:", typedData);
// Sign the typed data and return the signature
return "0x..."; // Return the signature
};
return (
<ImpersonatorIframeProvider
sendTransaction={handleTransaction}
signMessage={handleSignMessage}
signTypedData={handleSignTypedData}
>
<App />
</ImpersonatorIframeProvider>
);
}
The ImpersonatorIframeProvider
accepts the following optional props:
address
: Initial address to impersonateappUrl
: Initial dapp URLrpcUrl
: Initial RPC URLsendTransaction
: Callback function to handle transaction requestssignMessage
: Callback function to handle message signingsignTypedData
: Callback function to handle typed data signing
You can set initial values directly on the provider:
<ImpersonatorIframeProvider
address="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
appUrl="https://app.uniswap.org"
rpcUrl="https://eth.llamarpc.com"
>
<App />
</ImpersonatorIframeProvider>
The useImpersonatorIframe
hook provides:
const {
// Reference to the iframe element
iframeRef,
// Whether the iframe is ready to receive messages
isReady,
// Modify address to impersonate
setAddress,
// Modify the current dapp URL
setAppUrl,
// Modify the RPC URL
setRpcUrl,
} = useImpersonatorIframe();
import React, { useState } from "react";
import {
ImpersonatorIframe,
useImpersonatorIframe,
} from "@impersonator/iframe";
function DynamicImpersonator() {
const { setAddress, setRpcUrl, isReady } = useImpersonatorIframe();
const [currentAddress, setCurrentAddress] = useState(
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
);
const handleAddressChange = (newAddress) => {
setCurrentAddress(newAddress);
setAddress(newAddress);
};
return (
<div>
<input
type="text"
value={currentAddress}
onChange={(e) => handleAddressChange(e.target.value)}
placeholder="Enter address to impersonate"
/>
{isReady && (
<ImpersonatorIframe
width={"1000px"}
height={"500px"}
src="https://app.uniswap.org"
address={currentAddress}
rpcUrl="https://eth.llamarpc.com"
/>
)}
</div>
);
}
This package uses viem for Ethereum interactions.