Smart Rewarder Contracts
This guide explains how to work with Smart Rewarder contracts and fetch contract addresses across different chains.
Prerequisites
Make sure you have the SDK initialized as shown in the Implementing Reward Claims guide.
Fetching Contract Addresses
To get the Smart Rewarder contract addresses for all supported chains:
const contracts = await steerClient.rewards.getSmartRewarderContracts();
if (contracts.success) {
contracts.data.forEach(contract => {
console.log(`Chain ID ${contract.chainId}: ${contract.address}`);
});
}
Finding a Specific Chain's Contract
To get the contract address for a specific chain:
async function getContractForChain(chainId: number) {
const contracts = await steerClient.rewards.getSmartRewarderContracts();
if (!contracts.success) {
throw new Error('Failed to fetch contracts');
}
const contract = contracts.data.find(c => c.chainId === chainId);
if (!contract) {
throw new Error(`No contract found for chain ${chainId}`);
}
return contract.address;
}
Type Definitions
The contract data follows this structure:
interface SmartRewarderContract {
chainId: number;
address: string;
}
Error Handling
Implement proper error handling when working with contracts:
try {
const contracts = await steerClient.rewards.getSmartRewarderContracts();
if (!contracts.success) {
console.error('Failed to fetch contracts:', contracts.error);
return;
}
if (!contracts.data || contracts.data.length === 0) {
console.log('No contracts found');
return;
}
// Work with contract data...
} catch (error) {
console.error('Unexpected error fetching contracts:', error);
}
Best Practices
- Cache Contract Addresses
const CONTRACT_CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours
let contractCache = {
data: null,
timestamp: 0
};
async function getCachedContracts() {
const now = Date.now();
if (!contractCache.data || now - contractCache.timestamp > CONTRACT_CACHE_DURATION) {
const contracts = await steerClient.rewards.getSmartRewarderContracts();
if (contracts.success) {
contractCache = {
data: contracts.data,
timestamp: now
};
}
}
return contractCache.data;
}
- Validate Chain Support
async function isChainSupported(chainId: number) {
const contracts = await steerClient.rewards.getSmartRewarderContracts();
return contracts.success && contracts.data.some(c => c.chainId === chainId);
}
- Contract Address Validation
function isValidContractAddress(address: string) {
return /^0x[a-fA-F0-9]{40}$/.test(address);
}
Common Use Cases
Setting Up Contract Interaction
async function setupContractInteraction(chainId: number) {
// Get the contract address
const contracts = await steerClient.rewards.getSmartRewarderContracts();
const contract = contracts.data?.find(c => c.chainId === chainId);
if (!contract) {
throw new Error(`No contract found for chain ${chainId}`);
}
// Now you can use the contract address for interactions
return contract.address;
}
Multi-Chain Support
async function getSupportedChains() {
const contracts = await steerClient.rewards.getSmartRewarderContracts();
if (!contracts.success) {
return [];
}
return contracts.data.map(contract => contract.chainId);
}
Next Steps
- Learn about Implementing Reward Claims
- Explore Creating Campaigns
- Set up contract monitoring and analytics