- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control. - Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities. - Created .gitmodules to include OpenZeppelin contracts as a submodule. - Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment. - Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks. - Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring. - Created scripts for resource import and usage validation across non-US regions. - Added tests for CCIP error handling and integration to ensure robust functionality. - Included various new files and directories for the orchestration portal and deployment scripts.
58 lines
1.2 KiB
TypeScript
58 lines
1.2 KiB
TypeScript
import React, { useState } from 'react';
|
|
|
|
interface AddTokenButtonProps {
|
|
address: string;
|
|
symbol: string;
|
|
decimals: number;
|
|
image?: string;
|
|
}
|
|
|
|
export function AddTokenButton({
|
|
address,
|
|
symbol,
|
|
decimals,
|
|
image,
|
|
}: AddTokenButtonProps) {
|
|
const [isAdding, setIsAdding] = useState(false);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
const addToken = async () => {
|
|
if (typeof window === 'undefined' || !window.ethereum) {
|
|
setError('MetaMask is not installed');
|
|
return;
|
|
}
|
|
|
|
setIsAdding(true);
|
|
setError(null);
|
|
|
|
try {
|
|
await window.ethereum.request({
|
|
method: 'wallet_watchAsset',
|
|
params: {
|
|
type: 'ERC20',
|
|
options: {
|
|
address,
|
|
symbol,
|
|
decimals,
|
|
...(image && { image }),
|
|
},
|
|
},
|
|
});
|
|
} catch (err: any) {
|
|
setError(err.message || 'Failed to add token');
|
|
} finally {
|
|
setIsAdding(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<button onClick={addToken} disabled={isAdding}>
|
|
{isAdding ? 'Adding...' : `Add ${symbol}`}
|
|
</button>
|
|
{error && <div style={{ color: 'red' }}>{error}</div>}
|
|
</div>
|
|
);
|
|
}
|
|
|