init
This commit is contained in:
commit
ed26d9335a
31
background.js
Normal file
31
background.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
chrome.runtime.onInstalled.addListener(() => {
|
||||
chrome.tabs.query({ url: "*://*.x.com/*" }, (tabs) => {
|
||||
for (let tab of tabs) {
|
||||
chrome.scripting.executeScript({
|
||||
target: {tabId: tab.id, allFrames: true},
|
||||
files: ['content.js']
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
||||
if (changeInfo.status === 'complete' && /^https:\/\/(www\.)?(x|twitter)\.com/.test(tab.url)) {
|
||||
chrome.scripting.executeScript({
|
||||
target: {tabId: tabId, allFrames: true},
|
||||
files: ['content.js']
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request.action === "fetchData") {
|
||||
fetch(request.url)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
sendResponse({ data: data });
|
||||
})
|
||||
.catch(error => console.error("Error fetching token data:", error));
|
||||
return true; // Will respond asynchronously
|
||||
}
|
||||
});
|
||||
56
content.js
Normal file
56
content.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
const DEXSCREENER_API_URL = "https://api.dexscreener.io/latest/dex/tokens/";
|
||||
|
||||
function isSmartContract(address) {
|
||||
return address.includes('0x');
|
||||
}
|
||||
|
||||
function fetchTokenData(contractAddress,x,y) {
|
||||
const url = `${DEXSCREENER_API_URL}${contractAddress}`;
|
||||
chrome.runtime.sendMessage({ action: "fetchData", url: url }, (response) => {
|
||||
const data = response.data.pairs[0]; // Assuming the first pair is what you want
|
||||
if (data) {
|
||||
//alert(data.baseToken.symbol);
|
||||
const tooltip = createTooltip(data.baseToken.symbol, data.priceUsd || data.priceNative, data.url,x,y);
|
||||
document.body.appendChild(tooltip);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function extractTicker(text){
|
||||
const index = text.indexOf('0x');
|
||||
if (index !== -1 && text.length >= index + 42) { // 2 characters for '0x' + 40 characters for the address
|
||||
return text.substring(index, index + 42); // Extract '0x' + 40 characters
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function createTooltip(ticker, price, chartUrl,x,y) {
|
||||
const tooltip = document.createElement('div');
|
||||
tooltip.style.position = 'absolute';
|
||||
tooltip.style.background = '#333';
|
||||
tooltip.style.color = '#fff';
|
||||
tooltip.style.padding = '5px';
|
||||
tooltip.style.borderRadius = '5px';
|
||||
tooltip.style.zIndex = '9999';
|
||||
tooltip.style.left = `${x}px`;
|
||||
tooltip.style.top = `${y}px`;
|
||||
tooltip.innerHTML = `Ticker: ${ticker}<br>Price: ${price}`;
|
||||
tooltip.addEventListener('click', () => window.open(chartUrl, '_blank'));
|
||||
return tooltip;
|
||||
}
|
||||
|
||||
function handleMouseOver(event) {
|
||||
const target = event.target;
|
||||
|
||||
if (target.nodeType === Node.TEXT_NODE || target.nodeType === Node.ELEMENT_NODE) {
|
||||
const text = target.textContent.trim();
|
||||
if (isSmartContract(text)) {
|
||||
const extractedTicker = extractTicker(text);
|
||||
const rect = target.getBoundingClientRect(); // Get the target's position relative to the viewport
|
||||
const x = rect.left + window.scrollX; // X-coordinate
|
||||
const y = rect.top + window.scrollY;
|
||||
fetchTokenData(extractedTicker,x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
document.addEventListener('mouseover', handleMouseOver);
|
||||
23
manifest.json
Normal file
23
manifest.json
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"manifest_version": 3,
|
||||
"name": "Dexscreener Smart Contract Detector",
|
||||
"version": "1.0",
|
||||
"description": "Detect smart contracts in tweets, show ticker and price, and redirect to Dexscreener chart.",
|
||||
"permissions": [
|
||||
"activeTab",
|
||||
"scripting",
|
||||
"storage"
|
||||
],
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["*://x.com/*", "*://twitter.com/*"],
|
||||
"js": ["content.js"]
|
||||
}
|
||||
],
|
||||
"host_permissions": [
|
||||
"https://api.dexscreener.io/*"
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user