Chain Specific Settings
The Titan Kit already manages the necessary configuration for the Titan chain. You can skip this section if you only want to support the Titan chain.
1. Configuring Chain and Asset Lists
Basic Configuration
import { assetLists, chains } from '@chain-registry/v2';
// Define supported chain names
const chainNames: string[] = ['titantestnet', 'titan'];
// Filter chains and asset lists based on chain names
const _chains = chains.filter(c => chainNames.includes(c.chainName));
const _assetLists = assetLists.filter(a => chainNames.includes(a.chainName));
Custom Chain Configuration
You can also add custom chains by extending the filtered chains:
const _chains = [
...chains.filter(c => chainNames.includes(c.chainName)),
// Add custom chains here
];
const _assetLists = [
...assetLists.filter(a => chainNames.includes(a.chainName)),
// Add custom asset lists here
];
2. Configuring Signer Options
Basic Signer Configuration
<TitanKitProvider
chains={_chains}
wallets={_wallets}
assetLists={_assetLists}
signerOptions={{
// Chain-specific signing configuration
signing: (chain) => {
if (chain === 'titantestnet') {
return {
signerOptions: {
// Custom signer options
}
};
}
},
// Chain-specific preferred sign type
preferredSignType: (chain) => {
if (chain === 'titantestnet') {
return 'direct';
}
return 'amino';
}
}}
>
<YourApp />
</TitanKitProvider>
Advanced Signer Configuration Example
Here's an example of advanced signer configuration for Ethereum-compatible chains:
signerOptions={{
signing: (chain) => {
if (chain === 'chainName') {
return {
signerOptions: {
// Custom account parsing for Ethereum-compatible accounts
parseAccount: (encodedAccount: EncodedMessage) => {
if (encodedAccount.typeUrl === '/ethermint.types.v1.EthAccount') {
const decoder = toDecoder(EthAccount);
const account = decoder.fromPartial(
decoder.decode(encodedAccount.value)
);
const baseAccount =
account.baseVestingAccount?.baseAccount ||
account.baseAccount ||
account;
return baseAccount;
}
},
// Custom public key encoding for Ethereum-compatible accounts
encodePublicKey: (key: IKey): EncodedMessage => {
return {
typeUrl: '/ethermint.crypto.v1.ethsecp256k1.PubKey',
value: Secp256k1PubKey.encode(
Secp256k1PubKey.fromPartial({ key: key.value })
).finish(),
};
},
},
};
}
},
preferredSignType: (chain) => {
if (chain === 'chainName') {
return 'direct';
}
return 'amino';
}
}}
3. Best Practices
Chain Selection
Only include chains that your application needs
Consider using environment variables for chain configuration
Keep chain names consistent across your application
Signer Configuration
Configure chain-specific signing options when needed
Use appropriate sign types for each chain
Handle edge cases in account parsing
Asset Lists
Keep asset lists in sync with chain configuration
Consider caching asset lists for better performance
Update asset lists when adding new chains
4. Troubleshooting
Chain Connection Issues
Verify chain IDs and names
Check RPC endpoints
Ensure proper chain configuration
Signing Issues
Verify signer options
Check preferred sign types
Ensure proper account parsing
Asset List Issues
Verify asset list format
Check chain compatibility
Ensure proper asset configuration