Skip to content

Commit

Permalink
fallback to initial contract creator for room owner
Browse files Browse the repository at this point in the history
  • Loading branch information
willyogo committed Jan 15, 2025
1 parent 4028cd9 commit 8e084b0
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 87 deletions.
Binary file modified .DS_Store
Binary file not shown.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

94 changes: 47 additions & 47 deletions dist/assets/index-BujsN_vQ.js → dist/assets/index-CYeWWSTo.js

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<link rel="icon" type="image/png" href="https://images.emojiterra.com/google/android-11/256px/1f4ac.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Chat Fidget</title>
<script type="module" crossorigin src="/assets/index-BujsN_vQ.js"></script>
<script type="module" crossorigin src="/assets/index-CYeWWSTo.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-C4wSE-Z4.css">
</head>
<body>
Expand Down
Binary file modified src/.DS_Store
Binary file not shown.
Binary file modified src/components/.DS_Store
Binary file not shown.
Binary file modified src/lib/.DS_Store
Binary file not shown.
83 changes: 51 additions & 32 deletions src/lib/contracts/owner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,74 +10,93 @@ const publicClient = createPublicClient({

async function tryDeployer(address: string): Promise<string | null> {
try {
console.log('Attempting to read deployer() for:', address);
const result = await publicClient.readContract({
address: address as `0x${string}`,
abi: parseAbi(['function deployer() view returns (address)']),
functionName: 'deployer',
});
return (result as string).toLowerCase();
} catch {
const deployerAddress = (result as string).toLowerCase();
console.log('Found deployer address:', deployerAddress);
return deployerAddress;
} catch (error) {
console.log('No deployer function found:', error);
return null;
}
}

async function tryOwner(address: string): Promise<string | null> {
try {
console.log('Attempting to read owner() for:', address);
const result = await publicClient.readContract({
address: address as `0x${string}`,
abi: parseAbi(['function owner() view returns (address)']),
functionName: 'owner',
});
return (result as string).toLowerCase();
} catch {
const ownerAddress = (result as string).toLowerCase();
console.log('Found owner address:', ownerAddress);
return ownerAddress;
} catch (error) {
console.log('No owner function found:', error);
return null;
}
}

async function tryCreator(address: string): Promise<string | null> {
try {
console.log('Attempting to read creator() for:', address);
const result = await publicClient.readContract({
address: address as `0x${string}`,
abi: parseAbi(['function creator() view returns (address)']),
functionName: 'creator',
});
return (result as string).toLowerCase();
} catch {
const creatorAddress = (result as string).toLowerCase();
console.log('Found creator address:', creatorAddress);
return creatorAddress;
} catch (error) {
console.log('No creator function found:', error);
return null;
}
}

export async function getTokenOwner(tokenAddress: string): Promise<string | null> {
const address = tokenAddress.toLowerCase();
console.log('Getting token owner for address:', address);

// Try deployer() first
const deployer = await tryDeployer(address);
if (deployer) {
console.log('Found deployer:', deployer);
return deployer;
}
try {
// 1. Try deployer()
const deployer = await tryDeployer(address);
if (deployer) {
console.log('Using deployer address:', deployer);
return deployer;
}

// Then try owner()
const owner = await tryOwner(address);
if (owner) {
console.log('Found owner:', owner);
return owner;
}
// 2. Try owner()
const owner = await tryOwner(address);
if (owner) {
console.log('Using owner address:', owner);
return owner;
}

// Then try creator()
const creator = await tryCreator(address);
if (creator) {
console.log('Found creator:', creator);
return creator;
}
// 3. Try creator()
const creator = await tryCreator(address);
if (creator) {
console.log('Using creator address:', creator);
return creator;
}

// Finally try Etherscan API as fallback
const etherscanCreator = await getContractCreator(address);
if (etherscanCreator) {
console.log('Found creator from Etherscan:', etherscanCreator);
return etherscanCreator;
}
// 4. Fallback to Etherscan API
console.log('Attempting to get creator from Etherscan');
const etherscanCreator = await getContractCreator(address);
if (etherscanCreator) {
console.log('Using Etherscan creator address:', etherscanCreator);
return etherscanCreator;
}

console.log('No owner found for token:', address);
return null;
console.log('No owner found for token:', address);
return null;
} catch (error) {
console.error('Error getting token owner:', error);
throw new Error(`Failed to determine token owner: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
17 changes: 15 additions & 2 deletions src/lib/etherscan/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,36 @@ type EtherscanResponse = {

export async function getContractCreator(contractAddress: string): Promise<string | null> {
try {
console.log('Fetching contract creator from Etherscan for:', contractAddress);

const response = await fetch(
`${ETHERSCAN_API_URL}?module=contract&action=getcontractcreation&contractaddresses=${contractAddress}&apikey=${config.etherscanApiKey}`
);

if (!response.ok) {
throw new Error(`Etherscan API request failed: ${response.statusText}`);
const errorText = await response.text();
console.error('Etherscan API error:', errorText);
throw new Error(`Etherscan API request failed: ${response.status} ${response.statusText}`);
}

const data: EtherscanResponse = await response.json();
console.log('Etherscan API response:', data);

if (data.status === '1' && data.result.length > 0) {
return data.result[0].contractCreator.toLowerCase();
const creatorAddress = data.result[0].contractCreator.toLowerCase();
console.log('Found contract creator:', creatorAddress);
return creatorAddress;
}

if (data.status === '0') {
console.warn('Etherscan API returned error:', data.message);
}

console.log('No contract creator found');
return null;
} catch (error) {
console.error('Error fetching contract creator from Etherscan:', error);
// Don't throw, return null to allow the calling code to handle the failure
return null;
}
}

0 comments on commit 8e084b0

Please sign in to comment.