Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/ISSUE_TEMPLATE/2-addImageForm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,18 @@ body:
id: address
attributes:
label: Address
description: "Must be a valid 0x-prefixed address (40 hexadecimal characters). Example: 0x1234...abcd"
placeholder: 0x...
validations:
required: true
pattern: "^0x[a-fA-F0-9]{40}$"

- type: input
id: imageUrl
attributes:
label: Image URL
description: Ideally a 256x256 PNG or SVG file. But we'll take care of optimizing it later.
placeholder: https://gateway.pinata.cloud/ipfs/Qme9B6jRpGtZsRFcPjHvA5T4ugFuL4c3SzWfxyMPa59AMo
description: "Ideally a 256x256 PNG or SVG file. But we'll take care of optimizing it later."
placeholder: "https://gateway.pinata.cloud/ipfs/Qme9B6jRpGtZsRFcPjHvA5T4ugFuL4c3SzWfxyMPa59AMo"
validations:
required: true
pattern: "^(https?://[\\w.-]+(?:/[\\w\\-.~!$&'()*+,;=:@%]*)*)$"
135 changes: 135 additions & 0 deletions .github/workflows/validate-token-address.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
name: Validate Token Address

on:
issues:
types: [opened, edited]

permissions:
contents: read
issues: write

jobs:
validate-address:
if: ${{ contains(join(github.event.issue.labels.*.name, ','), 'addImage') }}
runs-on: ubuntu-latest

steps:
- name: Checkout repo
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8

- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: 20

- name: Install ethers.js
run: npm install ethers

- name: Extract address and network
id: extract
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
with:
script: |
const body = context.payload.issue.body;

// Extract Network
const networkMatch = body.match(/Network\s*\n\s*(.*)/);
const network = networkMatch ? networkMatch[1].trim() : null;

// Extract Address
const addressMatch = body.match(/Address\s*\n\s*(0x[a-fA-F0-9]{40})/);
const address = addressMatch ? addressMatch[1].trim() : null;

core.setOutput('network', network || '');
core.setOutput('address', address || '');

- name: Validate on-chain address
id: validate
timeout-minutes: 2
env:
NETWORK: ${{ steps.extract.outputs.network }}
ADDRESS: ${{ steps.extract.outputs.address }}
run: |
node -e "
(() => {
const {ethers} = import('ethers')
const network = process.env.NETWORK;
const address = process.env.ADDRESS;

if (!address) {
console.log("No address provided.");
process.exit(1);
}

if (!ethers.isAddress(address)) {
console.log("Address is not valid");
process.exit(1);
}

const rpcMap = {
MAINNET: "https://rpc.mevblocker.io",
GNOSIS_CHAIN: "https://gnosis.oat.farm",
ARBITRUM_ONE: "https://arbitrum-one.public.blastapi.io",
BASE: "https://base.drpc.org",
POLYGON: "https://polygon-bor-rpc.publicnode.com",
AVALANCHE: "https://api.avax.network/ext/bc/C/rpc",
BNB: "https://public-bsc-mainnet.fastnode.io",
LENS: "https://lens.drpc.org",
};

const rpcUrl = rpcMap[network];
if (!rpcUrl) {
console.log("No RPC for network, skipping check.");
process.exit(0);
}

const provider = new ethers.JsonRpcProvider(rpcUrl);

provider
.getCode(address)
.then((code) => {
if (code === "0x") {
console.log("Address not found on chain.");
process.exit(1);
} else {
console.log("Address exists on chain.");
}
})
.catch((err) => {
if (
err &&
(err.code === "INVALID_ARGUMENT" || /invalid address/i.test(String(err)))
) {
console.log("Address not found on chain.");
process.exit(1);
}
console.error("Error checking address:", err);
process.exit(1);
});
})()
"

- name: Add comment and label if invalid
if: failure()
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
with:
script: |
const issue_number = context.issue.number;
const address = '${{ steps.extract.outputs.address }}';
const network = '${{ steps.extract.outputs.network }}';

// Add comment
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
body: `⚠️ The address \`${address || 'N/A'}\` does not exist or is invalid on network \`${network || 'N/A'}\`. Please verify.`
});

// Add label
await github.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
labels: ['invalid-address']
});