feat: add support for ETH-BASE and derived assets#254
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughAdds support for a new Base chain coin subclass ( Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Visit the preview URL for this PR (updated for commit ba4f8b9): https://kdf-sdk--pr254-feat-eth-base-suppor-gypvy7mq.web.app (expires Sat, 01 Nov 2025 08:12:19 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: 9c1b6e6c010cf0b965c455ba7a69c4aedafa8a1d |
|
Visit the preview URL for this PR (updated for commit ba4f8b9): https://komodo-playground--pr254-feat-eth-base-suppor-9x617tev.web.app (expires Sat, 01 Nov 2025 08:13:24 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: 2bfedd77fdea45b25ba7c784416e81f177aa5c47 |
|
Thanks!
note that
|
|
We should also remove the endpoints for FTM and KCC - they are not currently on offer via etherscan https://docs.etherscan.io/supported-chains |
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
e9b5af8 to
ba4f8b9
Compare
Thanks, I added the URLs in a171d19.
Done in ba4f8b9. I also removed Huobi ECO (or Heco in the SDK) in accordance with #3127, seeing as it is also not listed in the supported chains list. |
There was a problem hiding this comment.
Pull Request Overview
This PR adds support for the Base blockchain protocol (ETH-BASE) and its derived assets to the Komodo DeFi framework. The changes enable Base chain integration across token activation flows and transaction history queries.
Key Changes:
- Added
CoinSubClass.baseenum value and associated metadata (color, name, token standard) - Integrated Base protocol into activation strategies for ETH-based tokens
- Added Base transaction history endpoints (
base_tx_historyandbase20_tx_history)
Reviewed Changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
coin_subclasses.dart |
Defines Base enum value and implements all required metadata methods |
protocol_class.dart |
Adds Base to the list of supported EVM protocols |
etherscan_transaction_history_strategy.dart |
Adds Base transaction history endpoints and removes deprecated FTM20/KRC20/HECO endpoints |
eth_with_tokens_activation_strategy.dart |
Includes Base in supported protocols for activation |
eth_task_activation_strategy.dart |
Includes Base in supported protocols for activation |
erc20_activation_strategy.dart |
Includes Base in supported protocols for activation |
custom_erc20_activation_strategy.dart |
Includes Base in supported protocols for activation |
build_config.json |
Updates bundled coins repository commit reference |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@cursor please review |
Review summary
Evidence
String? _getBaseEndpoint(AssetId id) {
final isParentChain = id.parentId == null;
return switch (id.subClass) {
CoinSubClass.bep20 when isParentChain => _bnbUrl,
CoinSubClass.bep20 => _bnbTokenUrl,
CoinSubClass.matic when isParentChain => _maticUrl,
CoinSubClass.matic => _maticTokenUrl,
CoinSubClass.avx20 when isParentChain => _avaxUrl,
CoinSubClass.avx20 => _avaxTokenUrl,
CoinSubClass.moonriver when isParentChain => _mvrUrl,
CoinSubClass.moonriver => _mvrTokenUrl,
CoinSubClass.erc20 when isParentChain => _ethUrl,
CoinSubClass.erc20 => _ethTokenUrl,
CoinSubClass.arbitrum when isParentChain => _arbUrl,
CoinSubClass.arbitrum => _arbTokenUrl,
CoinSubClass.base when isParentChain => _ethBaseUrl,
CoinSubClass.base => _ethBaseTokenUrl,
CoinSubClass.rskSmartBitcoin => _rskUrl,
CoinSubClass.moonbeam => _glmrUrl,
CoinSubClass.ethereumClassic => _etcUrl,
_ => null,
};
} String get _arbUrl => '$_baseUrl/v2/arb_tx_history';
String get _avaxUrl => '$_baseUrl/v2/avax_tx_history';
String get _ethBaseUrl => '$_baseUrl/v2/base_tx_history';
String get _bnbUrl => '$_baseUrl/v2/bnb_tx_history';
String get _ethUrl => '$_baseUrl/v2/eth_tx_history';
String get _maticUrl => '$_baseUrl/v2/matic_tx_history';
String get _mvrUrl => '$_baseUrl/v2/movr_tx_history';
String get _arbTokenUrl => '$_baseUrl/v2/arb20_tx_history';
String get _avaxTokenUrl => '$_baseUrl/v2/avx20_tx_history';
String get _ethBaseTokenUrl => '$_baseUrl/v2/base20_tx_history';
String get _bnbTokenUrl => '$_baseUrl/v2/bep20_tx_history';
String get _ethTokenUrl => '$_baseUrl/v2/erc20_tx_history';
String get _maticTokenUrl => '$_baseUrl/v2/plg20_tx_history';
String get _mvrTokenUrl => '$_baseUrl/v2/mvr20_tx_history';
enum CoinSubClass {
moonbeam,
ftm20,
arbitrum,
base,
@Deprecated('No longer active. Will be removed in the future.')
slp,
sia, String get ticker {
switch (this) {
case CoinSubClass.moonbeam:
return 'MOON';
case CoinSubClass.ftm20:
return 'FTM';
case CoinSubClass.arbitrum:
return 'ARB';
case CoinSubClass.base:
return 'BASE'; String get iconTicker {
switch (this) {
case CoinSubClass.moonbeam:
return 'GLMR';
case CoinSubClass.ftm20:
return 'FTM';
case CoinSubClass.arbitrum:
return 'ARB';
case CoinSubClass.base:
return 'BASE'; String get formatted {
switch (this) {
case CoinSubClass.moonbeam:
return 'Moonbeam';
case CoinSubClass.ftm20:
return 'Fantom';
case CoinSubClass.arbitrum:
return 'Arbitrum';
case CoinSubClass.base:
return 'Base'; Color? get color {
switch (this) {
case CoinSubClass.moonbeam:
return const Color(0xFFE4147C); // glmr: "#e4147c"
case CoinSubClass.ftm20:
return const Color(0xFF14B4EC); // ftm: "#14b4ec"
case CoinSubClass.arbitrum:
return const Color(0xFF28A0F0); // arb: "#28a0f0"
case CoinSubClass.base:
return const Color(0xFF0052FF); // base: "#0052ff"extension CoinSubClassTokenStandard on CoinSubClass {
/// Canonical short token/network standard suffix used for parent asset
/// disambiguation in display names. Returns null when no suffix should
/// be appended for the given subclass.
String? get tokenStandardSuffix {
switch (this) {
case CoinSubClass.erc20:
return 'ERC20';
case CoinSubClass.bep20:
return 'BEP20';
case CoinSubClass.qrc20:
return 'QRC20';
case CoinSubClass.ftm20:
return 'FTM20';
case CoinSubClass.arbitrum:
return 'ARB20';
case CoinSubClass.base:
return 'BASE';const Set<CoinSubClass> evmCoinSubClasses = {
CoinSubClass.avx20,
CoinSubClass.bep20,
CoinSubClass.ftm20,
CoinSubClass.matic,
CoinSubClass.hrc20,
CoinSubClass.arbitrum,
CoinSubClass.base,
return switch (primaryType) {
CoinSubClass.utxo || CoinSubClass.smartChain => UtxoProtocol.fromJson(
configToUse,
supportedProtocols: otherTypes,
),
// ...
CoinSubClass.avx20 ||
CoinSubClass.bep20 ||
CoinSubClass.ftm20 ||
CoinSubClass.matic ||
CoinSubClass.hrc20 ||
CoinSubClass.arbitrum ||
CoinSubClass.base ||
CoinSubClass.moonriver ||
CoinSubClass.moonbeam ||
CoinSubClass.ethereumClassic ||
CoinSubClass.ubiq ||
CoinSubClass.krc20 ||
CoinSubClass.ewt ||
CoinSubClass.hecoChain ||
CoinSubClass.rskSmartBitcoin ||
CoinSubClass.erc20 => Erc20Protocol.fromJson(json),
@override
Set<CoinSubClass> get supportedProtocols => {
CoinSubClass.erc20,
CoinSubClass.bep20,
CoinSubClass.ftm20,
CoinSubClass.matic,
CoinSubClass.avx20,
CoinSubClass.hrc20,
CoinSubClass.moonbeam,
CoinSubClass.moonriver,
CoinSubClass.ethereumClassic,
CoinSubClass.ubiq,
CoinSubClass.krc20,
CoinSubClass.ewt,
CoinSubClass.hecoChain,
CoinSubClass.rskSmartBitcoin,
CoinSubClass.arbitrum,
CoinSubClass.base,
};Nits / suggestions
String get _baseTokenInfoUrl => '$_baseUrl/v1/token_infos/base20';
Uri tokenInfoUrl(String contract) => Uri.parse('$_baseTokenInfoUrl/$contract');All else looks good to ship. Learn more about Cursor Agents |
smk762
left a comment
There was a problem hiding this comment.
Confirmed successful activation via https://kdf-sdk--pr254-feat-eth-base-suppor-gypvy7mq.web.app/
Summary by CodeRabbit
New Features
Chores