feat: integrate Tempo chain as second-class EVM citizen#12194
feat: integrate Tempo chain as second-class EVM citizen#12194gomesalexandre wants to merge 5 commits intoshapeshift:developfrom
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis PR adds Tempo (chain ID 4217) as a feature‑gated second‑class EVM chain across environment/config, CSP, CAIP constants, viem/ethers clients, a Tempo chain adapter, wallet capability flags, asset generation, swapper mappings, plugin registration, and UI/state gating. Changes
Sequence Diagram(s)sequenceDiagram
participant App as App (Plugin loader)
participant Plugin as Tempo Plugin
participant Adapter as Tempo ChainAdapter
participant Viem as viemTempoClient
participant AssetSvc as AssetService
App->>Plugin: register() (feature-flagged)
Plugin->>Adapter: create ChainAdapter(rpcUrl, getKnownTokens)
Adapter->>Viem: use viemTempoClient (RPC/fallbacks)
Plugin->>AssetSvc: getKnownTokens() -> assets
AssetSvc-->>Plugin: filtered tempo ERC20 tokens
Plugin-->>App: plugin with tempo ChainAdapter
App->>Adapter: wallet action -> adapter asserts supportsTempo(wallet)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
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 |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/state/slices/portfolioSlice/utils/index.ts (1)
136-179:⚠️ Potential issue | 🟡 MinorMissing
tempoChainIdinaccountIdToLabelswitch statement.The
accountIdToLabelfunction handles most EVM chains (including other second-class chains likesoneiumChainId,celoChainId,monadChainId,plasmaChainId) to returnmiddleEllipsis(pubkey), buttempoChainIdis not included. This will cause Tempo accounts to fall through to the default case returning an empty string.Proposed fix
case soneiumChainId: + case tempoChainId: case thorchainChainId:🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/state/slices/portfolioSlice/utils/index.ts` around lines 136 - 179, The switch in accountIdToLabel is missing tempoChainId so Tempo accounts fall through to the default; add a case for tempoChainId alongside the other chainId cases (the same block that returns middleEllipsis(pubkey)) so tempoChainId triggers return middleEllipsis(pubkey); locate accountIdToLabel and add the tempoChainId case near the other EVM/second-class chainId cases.
🧹 Nitpick comments (2)
headers/csps/chains/tempo.ts (1)
1-9: Pattern inconsistency with other CSP chain files.Based on learnings, CSP files in
headers/csps/chains/typically use Vite'sloadEnv()pattern directly (likeplasma.ts,monad.ts) rather thangetConfig()fromsrc/config.ts. While this implementation is functionally correct, it deviates from the established convention for consistency.♻️ Suggested refactor to match other CSP chain files
import { FALLBACK_RPC_URLS } from '../../../packages/contracts/src/fallbackRpcUrls' +import { loadEnv } from 'vite' -import { getConfig } from '@/config' - -const env = getConfig() +const env = loadEnv(process.env.NODE_ENV ?? 'development', process.cwd(), '') export const csp = { 'connect-src': [env.VITE_TEMPO_NODE_URL, ...FALLBACK_RPC_URLS.tempo], } as constBased on learnings: "For CSP files in headers/csps/chains/, gomesalexandre prefers using Vite's loadEnv() pattern directly to load environment variables... for consistency with existing second-class chain CSP files."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@headers/csps/chains/tempo.ts` around lines 1 - 9, The CSP module csp currently imports getConfig() and uses env.VITE_TEMPO_NODE_URL (getConfig) which is inconsistent with other chain CSP files; replace getConfig() usage by loading Vite env directly with loadEnv() and use the VITE_TEMPO_NODE_URL value from that env (keep FALLBACK_RPC_URLS.tempo and the exported csp object intact) so the file follows the same loadEnv pattern as plasma.ts/monad.ts; update imports accordingly and ensure the exported csp still uses the resulting VITE_TEMPO_NODE_URL and FALLBACK_RPC_URLS.tempo.src/plugins/tempo/index.tsx (1)
25-35: Parse each asset ID once ingetKnownTokens.
fromAssetId(asset.assetId)is called twice per matching asset. You can parse once and reuse the parsed fields for clarity and less repeated work.♻️ Optional refactor
return assetService.assets - .filter(asset => { - const { chainId, assetNamespace } = fromAssetId(asset.assetId) - return chainId === tempoChainId && assetNamespace === 'erc20' - }) - .map(asset => ({ - assetId: asset.assetId, - contractAddress: fromAssetId(asset.assetId).assetReference, - symbol: asset.symbol, - name: asset.name, - precision: asset.precision, - })) + .map(asset => ({ asset, parsed: fromAssetId(asset.assetId) })) + .filter( + ({ parsed }) => parsed.chainId === tempoChainId && parsed.assetNamespace === 'erc20', + ) + .map(({ asset, parsed }) => ({ + assetId: asset.assetId, + contractAddress: parsed.assetReference, + symbol: asset.symbol, + name: asset.name, + precision: asset.precision, + }))🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/plugins/tempo/index.tsx` around lines 25 - 35, In getKnownTokens, avoid parsing the same assetId twice: inside the .filter/.map chain call fromAssetId(asset.assetId) once per asset, e.g., store the result (const { chainId, assetNamespace, assetReference } = fromAssetId(asset.assetId)) and use those variables for both the filter check (chainId === tempoChainId && assetNamespace === 'erc20') and when building the mapped object (use assetReference for contractAddress); update the .filter/.map so each assetId is parsed only once and reused.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/vite-env.d.ts`:
- Around line 67-68: The interface ImportMetaEnv contains a duplicated member
VITE_TEMPO_NODE_URL; remove the redundant VITE_TEMPO_NODE_URL declaration so the
ImportMetaEnv interface only declares that env var once (matching other chain
node URL entries), then run TypeScript checks to verify no remaining duplicate
declarations or regressions.
---
Outside diff comments:
In `@src/state/slices/portfolioSlice/utils/index.ts`:
- Around line 136-179: The switch in accountIdToLabel is missing tempoChainId so
Tempo accounts fall through to the default; add a case for tempoChainId
alongside the other chainId cases (the same block that returns
middleEllipsis(pubkey)) so tempoChainId triggers return middleEllipsis(pubkey);
locate accountIdToLabel and add the tempoChainId case near the other
EVM/second-class chainId cases.
---
Nitpick comments:
In `@headers/csps/chains/tempo.ts`:
- Around line 1-9: The CSP module csp currently imports getConfig() and uses
env.VITE_TEMPO_NODE_URL (getConfig) which is inconsistent with other chain CSP
files; replace getConfig() usage by loading Vite env directly with loadEnv() and
use the VITE_TEMPO_NODE_URL value from that env (keep FALLBACK_RPC_URLS.tempo
and the exported csp object intact) so the file follows the same loadEnv pattern
as plasma.ts/monad.ts; update imports accordingly and ensure the exported csp
still uses the resulting VITE_TEMPO_NODE_URL and FALLBACK_RPC_URLS.tempo.
In `@src/plugins/tempo/index.tsx`:
- Around line 25-35: In getKnownTokens, avoid parsing the same assetId twice:
inside the .filter/.map chain call fromAssetId(asset.assetId) once per asset,
e.g., store the result (const { chainId, assetNamespace, assetReference } =
fromAssetId(asset.assetId)) and use those variables for both the filter check
(chainId === tempoChainId && assetNamespace === 'erc20') and when building the
mapped object (use assetReference for contractAddress); update the .filter/.map
so each assetId is parsed only once and reused.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 8433a0ba-145a-433a-9676-17ad26773af3
⛔ Files ignored due to path filters (48)
packages/caip/src/adapters/coincap/generated/eip155_1/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_10/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_137/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_42161/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_43114/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_56/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_8453/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/solana_5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_1/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_10/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_100/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_130/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_137/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_143/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_146/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_25/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_324/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_34443/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_42161/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_4217/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_42220/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_43114/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_480/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_5000/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_534352/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_56/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_59144/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_747/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_747474/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_80094/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_81457/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_8453/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_98866/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_999/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/index.tsis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/near_mainnet/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/solana_5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/starknet_SN_MAIN/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/sui_35834a8a/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/ton_mainnet/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/tron_0x2b6653dc/adapter.jsonis excluded by!**/generated/**pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlpublic/generated/asset-manifest.jsonis excluded by!**/generated/**public/generated/asset-manifest.json.bris excluded by!**/generated/**public/generated/asset-manifest.json.gzis excluded by!**/*.gz,!**/generated/**public/generated/generatedAssetData.jsonis excluded by!**/generated/**public/generated/generatedAssetData.json.bris excluded by!**/generated/**public/generated/generatedAssetData.json.gzis excluded by!**/*.gz,!**/generated/**
📒 Files selected for processing (69)
.env.env.developmentheaders/csps/chains/tempo.tsheaders/csps/index.tspackage.jsonpackages/caip/src/adapters/coingecko/index.test.tspackages/caip/src/adapters/coingecko/index.tspackages/caip/src/adapters/coingecko/utils.test.tspackages/caip/src/adapters/coingecko/utils.tspackages/caip/src/constants.tspackages/chain-adapters/package.jsonpackages/chain-adapters/src/evm/EvmBaseAdapter.tspackages/chain-adapters/src/evm/index.tspackages/chain-adapters/src/evm/tempo/TempoChainAdapter.tspackages/chain-adapters/src/evm/tempo/index.tspackages/chain-adapters/src/types.tspackages/contracts/package.jsonpackages/contracts/src/ethersProviderSingleton.tspackages/contracts/src/fallbackRpcUrls.tspackages/contracts/src/viemClient.tspackages/hdwallet-coinbase/src/coinbase.tspackages/hdwallet-core/src/ethereum.tspackages/hdwallet-core/src/utils.tspackages/hdwallet-core/src/wallet.tspackages/hdwallet-gridplus/src/gridplus.tspackages/hdwallet-keepkey/src/keepkey.tspackages/hdwallet-ledger/src/ledger.tspackages/hdwallet-metamask-multichain/src/native-multichain.tspackages/hdwallet-metamask-multichain/src/shapeshift-multichain.tspackages/hdwallet-native/src/ethereum.tspackages/hdwallet-phantom/src/phantom.tspackages/hdwallet-trezor/src/trezor.tspackages/hdwallet-vultisig/src/vultisig.tspackages/hdwallet-walletconnectv2/src/walletconnectV2.tspackages/swapper/package.jsonpackages/swapper/src/swappers/RelaySwapper/constant.tspackages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.tspackages/types/package.jsonpackages/types/src/base.tspackages/types/src/zerion.tspackages/unchained-client/package.jsonpackages/utils/src/assetData/baseAssets.tspackages/utils/src/assetData/getBaseAsset.tspackages/utils/src/chainIdToFeeAssetId.tspackages/utils/src/getAssetNamespaceFromChainId.tspackages/utils/src/getChainShortName.tspackages/utils/src/getNativeFeeAssetReference.tsscripts/generateAssetData/coingecko.tsscripts/generateAssetData/generateAssetData.tsscripts/generateAssetData/tempo/index.tssrc/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsxsrc/config.tssrc/constants/chains.tssrc/context/PluginProvider/PluginProvider.tsxsrc/context/WalletProvider/WalletConnectV2/config.tssrc/hooks/useWalletSupportsChain/checkWalletHasRuntimeSupport.test.tssrc/hooks/useWalletSupportsChain/useWalletSupportsChain.tssrc/lib/account/evm.tssrc/lib/asset-service/service/AssetService.tssrc/lib/coingecko/utils.tssrc/pages/Markets/components/MarketsRow.tsxsrc/plugins/activePlugins.tssrc/plugins/tempo/index.tsxsrc/state/migrations/index.tssrc/state/slices/opportunitiesSlice/mappings.tssrc/state/slices/portfolioSlice/utils/index.tssrc/state/slices/preferencesSlice/preferencesSlice.tssrc/test/mocks/store.tssrc/vite-env.d.ts
NeOMakinG
left a comment
There was a problem hiding this comment.
CI passing ✅
Code review notes:
- Chain integration follows standard second-class EVM pattern
- Feature flag (VITE_FEATURE_TEMPO) properly configured
- HDWallet support flags added correctly
- CAIP constants and chain adapters look correct
Note: Unable to complete full browser testing due to dev server dependency issues when switching branches, but CI validates the implementation. Recommend manual QA verification before merge.
qabot — Tempo Chain Integration ✅5/5 steps passed | Dashboard
Tested with |
- Chain ID 4217, native currency USD (stablecoin-native L1) - RPC: https://rpc.tempo.xyz, Explorer: https://explore.tempo.xyz - HDWallet support flags across all wallet implementations - SecondClassEvmAdapter chain adapter - Relay swapper integration (relayChainId 4217) - CoinGecko platform adapter (tempo) - Plugin with feature flag VITE_FEATURE_TEMPO - CSP headers, viem client (defineChain), ethers provider - State migration clearAssets - Generated assets via generate:chain - Fix addChain scaffolder: allow null relatedAssetKey, fix codemod template Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
043d6c2 to
dc368c6
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
packages/chain-adapters/src/evm/tempo/TempoChainAdapter.ts (1)
40-45: Add explicit return types togetDisplayName()andgetName().Line 40 and Line 44 currently rely on inference; this file’s TS guideline requires explicit return types.
Suggested fix
- getDisplayName() { + getDisplayName(): ChainAdapterDisplayName { return ChainAdapterDisplayName.Tempo } - getName() { + getName(): string { return 'Tempo' }As per coding guidelines, "ALWAYS use explicit types for function parameters and return values in TypeScript."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/chain-adapters/src/evm/tempo/TempoChainAdapter.ts` around lines 40 - 45, Both getDisplayName() and getName() lack explicit return types; update their signatures to include explicit returns: set getDisplayName(): ChainAdapterDisplayName and getName(): string, adjusting the method declarations in TempoChainAdapter to use these return types so they conform to the project's TypeScript guideline requiring explicit function return types.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.env:
- Line 357: The base .env leaves VITE_TEMPO_NODE_URL empty which causes
src/config.ts's unconditional config validation (the required URL for
VITE_TEMPO_NODE_URL) to fail in environments that don't override it; set a
sensible default URL in the base .env (e.g., a stable public or internal tempo
node URL or a safe noop/localhost URL) so VITE_TEMPO_NODE_URL contains a valid
URL by default and validation in src/config.ts passes when VITE_FEATURE_TEMPO is
false or when environment-specific .env files are missing.
In `@packages/utils/src/getAssetNamespaceFromChainId.ts`:
- Around line 65-66: The switch branch for KnownChainIds.TempoMainnet currently
throws an error causing runtime failures; update the case in
getAssetNamespaceFromChainId to return ASSET_NAMESPACE.erc20 (same as other EVM
chains) instead of throwing, ensuring Tempo resolves to the ERC-20 asset
namespace; locate the switch that handles KnownChainIds (including TempoMainnet)
and replace the throw Error(...) branch with a return ASSET_NAMESPACE.erc20.
---
Nitpick comments:
In `@packages/chain-adapters/src/evm/tempo/TempoChainAdapter.ts`:
- Around line 40-45: Both getDisplayName() and getName() lack explicit return
types; update their signatures to include explicit returns: set
getDisplayName(): ChainAdapterDisplayName and getName(): string, adjusting the
method declarations in TempoChainAdapter to use these return types so they
conform to the project's TypeScript guideline requiring explicit function return
types.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 2931fd93-34de-4de5-8d8f-e681b6b07b3f
⛔ Files ignored due to path filters (22)
packages/caip/src/adapters/coincap/generated/eip155_1/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_10/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_137/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_42161/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_43114/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_56/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/eip155_8453/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coincap/generated/solana_5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_1/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_137/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_4217/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_43114/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_56/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/eip155_8453/adapter.jsonis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/index.tsis excluded by!**/generated/**packages/caip/src/adapters/coingecko/generated/solana_5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/adapter.jsonis excluded by!**/generated/**public/generated/asset-manifest.jsonis excluded by!**/generated/**public/generated/asset-manifest.json.bris excluded by!**/generated/**public/generated/asset-manifest.json.gzis excluded by!**/*.gz,!**/generated/**public/generated/generatedAssetData.jsonis excluded by!**/generated/**public/generated/generatedAssetData.json.bris excluded by!**/generated/**public/generated/generatedAssetData.json.gzis excluded by!**/*.gz,!**/generated/**
📒 Files selected for processing (62)
.env.env.developmentchains/tempo.jsonheaders/csps/chains/tempo.tsheaders/csps/index.tspackages/caip/src/adapters/coingecko/index.tspackages/caip/src/adapters/coingecko/utils.test.tspackages/caip/src/adapters/coingecko/utils.tspackages/caip/src/constants.tspackages/chain-adapters/src/evm/EvmBaseAdapter.tspackages/chain-adapters/src/evm/index.tspackages/chain-adapters/src/evm/tempo/TempoChainAdapter.tspackages/chain-adapters/src/evm/tempo/index.tspackages/chain-adapters/src/types.tspackages/contracts/src/ethersProviderSingleton.tspackages/contracts/src/fallbackRpcUrls.tspackages/contracts/src/viemClient.tspackages/hdwallet-coinbase/src/coinbase.tspackages/hdwallet-core/src/ethereum.tspackages/hdwallet-core/src/wallet.tspackages/hdwallet-gridplus/src/gridplus.tspackages/hdwallet-keepkey/src/keepkey.tspackages/hdwallet-ledger/src/ledger.tspackages/hdwallet-metamask-multichain/src/native-multichain.tspackages/hdwallet-metamask-multichain/src/shapeshift-multichain.tspackages/hdwallet-native/src/ethereum.tspackages/hdwallet-phantom/src/phantom.tspackages/hdwallet-trezor/src/trezor.tspackages/hdwallet-vultisig/src/vultisig.tspackages/hdwallet-walletconnectv2/src/walletconnectV2.tspackages/swapper/src/swappers/RelaySwapper/constant.tspackages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.tspackages/types/src/base.tspackages/utils/src/assetData/baseAssets.tspackages/utils/src/assetData/getBaseAsset.tspackages/utils/src/chainIdToFeeAssetId.tspackages/utils/src/getAssetNamespaceFromChainId.tspackages/utils/src/getChainShortName.tspackages/utils/src/getNativeFeeAssetReference.tsscripts/addChain/codemods.tsscripts/addChain/schema.tsscripts/generateAssetData/coingecko.tsscripts/generateAssetData/generateAssetData.tsscripts/generateAssetData/tempo/index.tssrc/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsxsrc/config.tssrc/constants/chains.tssrc/context/PluginProvider/PluginProvider.tsxsrc/context/WalletProvider/WalletConnectV2/config.tssrc/hooks/useWalletSupportsChain/useWalletSupportsChain.tssrc/lib/account/evm.tssrc/lib/asset-service/service/AssetService.tssrc/lib/coingecko/utils.tssrc/pages/Markets/components/MarketsRow.tsxsrc/plugins/activePlugins.tssrc/plugins/tempo/index.tsxsrc/state/migrations/index.tssrc/state/slices/opportunitiesSlice/mappings.tssrc/state/slices/portfolioSlice/utils/index.tssrc/state/slices/preferencesSlice/preferencesSlice.tssrc/test/mocks/store.tssrc/vite-env.d.ts
✅ Files skipped from review due to trivial changes (23)
- packages/caip/src/adapters/coingecko/utils.test.ts
- src/pages/Markets/components/MarketsRow.tsx
- src/state/slices/preferencesSlice/preferencesSlice.ts
- packages/chain-adapters/src/evm/index.ts
- packages/contracts/src/fallbackRpcUrls.ts
- src/lib/account/evm.ts
- src/constants/chains.ts
- src/test/mocks/store.ts
- packages/types/src/base.ts
- packages/hdwallet-trezor/src/trezor.ts
- scripts/generateAssetData/generateAssetData.ts
- packages/hdwallet-vultisig/src/vultisig.ts
- packages/hdwallet-ledger/src/ledger.ts
- headers/csps/chains/tempo.ts
- packages/hdwallet-core/src/wallet.ts
- src/config.ts
- packages/contracts/src/ethersProviderSingleton.ts
- packages/hdwallet-native/src/ethereum.ts
- src/state/slices/portfolioSlice/utils/index.ts
- chains/tempo.json
- src/lib/asset-service/service/AssetService.ts
- packages/contracts/src/viemClient.ts
- packages/swapper/src/swappers/RelaySwapper/constant.ts
🚧 Files skipped from review as they are similar to previous changes (26)
- src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx
- src/context/PluginProvider/PluginProvider.tsx
- packages/utils/src/getNativeFeeAssetReference.ts
- headers/csps/index.ts
- packages/utils/src/getChainShortName.ts
- src/state/migrations/index.ts
- scripts/generateAssetData/tempo/index.ts
- packages/chain-adapters/src/evm/tempo/index.ts
- packages/hdwallet-phantom/src/phantom.ts
- packages/hdwallet-core/src/ethereum.ts
- src/state/slices/opportunitiesSlice/mappings.ts
- packages/hdwallet-gridplus/src/gridplus.ts
- packages/hdwallet-coinbase/src/coinbase.ts
- src/lib/coingecko/utils.ts
- src/plugins/activePlugins.ts
- packages/hdwallet-walletconnectv2/src/walletconnectV2.ts
- packages/hdwallet-keepkey/src/keepkey.ts
- packages/chain-adapters/src/evm/EvmBaseAdapter.ts
- packages/utils/src/assetData/baseAssets.ts
- packages/hdwallet-metamask-multichain/src/native-multichain.ts
- packages/utils/src/assetData/getBaseAsset.ts
- packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts
- src/context/WalletProvider/WalletConnectV2/config.ts
- src/plugins/tempo/index.tsx
- packages/chain-adapters/src/types.ts
- packages/caip/src/constants.ts
|
qabot rerun with a less derp Tempo fixture: https://qabot-kappa.vercel.app/runs/3a63967e-92ec-4208-9455-0d343015b20c What this fixture now checks:
Result: failed, and not for fake reasons this time around. Findings:
Pushed the improved qabot fixture here too:
So yeah, PR is not gucci for trade QA yet - Tempo path still looks borked. |
Tempo was crashing because native fee asset resolution still treated Tempo as Ton. Fix that, hide the bogus placeholder native from trade selection, and surface pathUSD as the practical swappable/gas asset instead. Also update the Tempo qabot regression fixture so it validates the real user flow we can actually support: Tempo discoverability, pathUSD visibility, Tempo account connect, and a small cross-chain swap into pathUSD.
|
@NeOMakinG all working now ser. qabot: https://qabot-kappa.vercel.app/runs/d99911a8-8b36-4385-9375-440bc060a681 Tackled the actual Tempo shenanigans in the loop:
Local manual + agent-browser pass was gucci after that, then reran/reportified via qabot ☝🏽 |
Does what it says on the box. - add real Tempo tradeable asset generation for usdc/pathusd - plumb Tempo fee-token semantics through swapper + send flows - support Tempo tx execution payloads across wallet providers - add qabot regression coverage for cross-chain, same-chain, and self-send Very hacky still, but at least she worky now. Co-Authored-By: Claude <noreply@openai.com>
|
@NeOMakinG moving dis back to draft for now. Why draft:
So yeah, not opening this up as “simple evm chain PR is ready to merge” cap just yet. What is gucci now:
qabot pass: Also updated the PR body to call out that this is still pretty hacky and not reviewed enough code-wise yet, even though the functional pass is there now. |
Description
Pretty much what it says on the box, but not quite a normal second-class evm chain PR.
Tempo is weirdy boi:
USDUSDCandpathUSDSo this PR now does a bunch more than the original crate predicates:
USDC+pathUSDasset generation / related asset data / manifest outputsETH -> Tempo USDCUSDC -> pathUSDpathUSD -> USDCThis is still pretty hacky and absolutely not code-reviewed enough yet. Functionally though, she worky now.
qabot evidence:
Issue (if applicable)
closes #
Risk
Medium-ish.
Behind
VITE_FEATURE_TEMPO, yes, but this stopped being a tiny isolated chain PR the moment Tempo's fee semantics turned out not to be normal native-gas evm semantics.eth_sendTransactionpayload handling for Tempo txsTesting
Engineering
pnpm run build:packagespnpm run type-checkOperations
VITE_FEATURE_TEMPO=trueUSDCandpathUSDare selectable and icons look saneUSDCUSDC <-> pathUSDScreenshots (if applicable)
qabot run above has the actual evidence trail