-
Notifications
You must be signed in to change notification settings - Fork 199
feat: starknet implementation #11511
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Changes from 14 commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
403314e
fix: starknet implementation
NeOMakinG 20645a7
fix: bunch of things
NeOMakinG 449a871
feat: normalize addresses using validateAndParseAddress for comparison
gomesalexandre fede72f
feat: deduplicate STRK token following Sui pattern
gomesalexandre eb45377
chore: remove debug console.logs from StarknetChainAdapter
gomesalexandre 450dbfa
[skip ci] fix: replace 9 'as any' casts with proper type guards
gomesalexandre c2b7b91
[skip ci] fix: remove debug code and fix silent RPC error handling
gomesalexandre 611cb00
[skip ci] chore: remove test files from repository
gomesalexandre 3b2f3bb
[skip ci] fix: parseTx error handling and remove unused code
gomesalexandre 9c403d7
[skip ci] chore: restore asset generation to regenerate all chains
gomesalexandre e5bc429
[skip ci] refactor: move types to types.ts and fix nonce handling
gomesalexandre df38f02
feat: add Starknet assets and dependencies
gomesalexandre 3bbc359
[skip ci] style: lint formatting fix
gomesalexandre 5a29f24
[skip ci] fix: remove unused StarknetTxDetails import
gomesalexandre 4b1ec04
[skip ci] chore: revert config files and bump hdwallet packages to 1.…
gomesalexandre 764418f
[skip ci] feat: add Starknet to popular assets for discoverability
gomesalexandre d419043
chore: update hdwallet packages and fix lint issues
gomesalexandre d8a0b1b
Merge origin/develop into starknet
gomesalexandre c306926
fix: types
gomesalexandre fd5ddee
feat: cleanup starknet implementation
gomesalexandre 193a944
[skip ci] chore: add starknet.js v9 hashFeeFieldV3B3 reference comments
gomesalexandre 23fd3c0
fix: review feedbacks
NeOMakinG 6c00d2f
fix: remove modal and block flow
NeOMakinG d048189
Merge remote-tracking branch 'origin/develop' into starknet
NeOMakinG bf5e929
Merge remote-tracking branch 'origin/develop' into starknet
NeOMakinG 9b4ddbf
Merge origin/develop into starknet - resolve conflicts by accepting d…
gomesalexandre fc09eaa
feat: regen and stuff
gomesalexandre c63a6e2
fix: fee estimation fix
NeOMakinG 523e731
Merge branch 'develop' into starknet
NeOMakinG File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
NeOMakinG marked this conversation as resolved.
Outdated
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,136 @@ | ||
| # Starknet Swap Support Implementation | ||
|
|
||
| ## Overview | ||
| Starknet has been integrated as a second-class citizen chain with full NEAR Intents swap support (both buy and sell). | ||
|
|
||
| ## Key Implementation Files | ||
|
|
||
| ### 1. Trade Quote/Rate Input Builder | ||
| **File**: `src/components/MultiHopTrade/hooks/useGetTradeQuotes/getTradeQuoteOrRateInput.ts` | ||
|
|
||
| **Critical Implementation**: Lines 239-256 | ||
| ```typescript | ||
| case CHAIN_NAMESPACE.Starknet: { | ||
| const sellAssetChainAdapter = assertGetStarknetChainAdapter(sellAsset.chainId) | ||
|
|
||
| const sendAddress = | ||
| wallet && sellAccountNumber !== undefined | ||
| ? await sellAssetChainAdapter.getAddress({ | ||
| accountNumber: sellAccountNumber, | ||
| wallet, | ||
| pubKey, | ||
| }) | ||
| : undefined | ||
|
|
||
| return { | ||
| ...tradeQuoteInputCommonArgs, | ||
| chainId: sellAsset.chainId, | ||
| sendAddress, | ||
| } as GetTradeQuoteInput | ||
| } | ||
| ``` | ||
|
|
||
| **What This Does**: Enables the swap UI to build trade input objects for Starknet, allowing users to sell STRK and other Starknet tokens. | ||
|
|
||
| ### 2. NEAR Intents Swapper Integration | ||
|
|
||
| #### Supported Chains | ||
| **File**: `packages/swapper/src/swappers/NearIntentsSwapper/types.ts` | ||
| - Starknet added to `nearIntentsSupportedChainIds` (line 24) | ||
| - Chain mapping: `starknetChainId` → `'starknet'` (line 45) | ||
|
|
||
| #### Asset ID Resolution | ||
| **File**: `packages/swapper/src/swappers/NearIntentsSwapper/utils/helpers/helpers.ts` | ||
| - Starknet added to `TOKEN_LOOKUP_CHAINS` (line 43) | ||
| - Uses API token lookup due to hashed asset ID format (lines 52-93) | ||
|
|
||
| #### Fee Estimation | ||
| **File**: `packages/swapper/src/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.ts` | ||
| - Starknet fee handling (lines 254-260) | ||
| - Uses hardcoded fees from chain adapter (no dynamic estimation) | ||
|
|
||
| #### Transaction Building | ||
| **File**: `packages/swapper/src/swappers/NearIntentsSwapper/endpoints.ts` | ||
| - `getUnsignedStarknetTransaction` implementation | ||
| - `getStarknetTransactionFees` implementation | ||
|
|
||
| #### Transaction Execution | ||
| **File**: `packages/swapper/src/utils.ts` | ||
| - `executeStarknetTransaction` utility function (lines 198-203) | ||
|
|
||
| **File**: `packages/swapper/src/swappers/NearIntentsSwapper/NearIntentsSwapper.ts` | ||
| - Wired up `executeStarknetTransaction` to swapper | ||
|
|
||
| ### 3. Chain Adapter Utilities | ||
| **File**: `src/lib/utils/starknet.ts` (CREATED) | ||
| - `assertGetStarknetChainAdapter`: Type-safe accessor for Starknet chain adapter | ||
| - `isStarknetChainAdapter`: Type guard for Starknet adapter | ||
| - `getStarknetTransactionStatus`: Transaction status polling utility | ||
|
|
||
| ### 4. Type Definitions | ||
| **File**: `packages/swapper/src/types.ts` | ||
| - `StarknetSwapperDeps` (lines 304-306) | ||
| - `StarknetTransactionExecutionProps` (lines 458-460) | ||
| - `StarknetTransactionExecutionInput` (lines 795-797) | ||
| - `GetUnsignedStarknetTransactionArgs` (lines 495-497) | ||
| - `executeStarknetTransaction` in Swapper interface (lines 715-718) | ||
| - `getUnsignedStarknetTransaction` in SwapperApi (lines 606-608) | ||
| - `getStarknetTransactionFees` in SwapperApi (line 616) | ||
|
|
||
| ### 5. Swapper Dependencies Wiring | ||
| **File**: `src/state/apis/swapper/helpers/swapperApiHelpers.ts` | ||
| - Added `assertGetStarknetChainAdapter` to `createSwapperDeps` | ||
|
|
||
| **File**: `src/lib/tradeExecution.ts` | ||
| - Added `assertGetStarknetChainAdapter` to trade status checking | ||
|
|
||
| **File**: `src/pages/RFOX/components/Stake/Bridge/hooks/useRfoxBridge.ts` | ||
| - Added `assertGetStarknetChainAdapter` to swapper dependencies | ||
|
|
||
| ### 6. Transaction Status Polling | ||
| **File**: `src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx` | ||
| - Added Starknet case for transaction status polling (uses `getStarknetTransactionStatus`) | ||
|
|
||
| ## Second-Class Citizen Status | ||
|
|
||
| Starknet is configured as a "second-class citizen" chain in `src/constants/chains.ts` (line 14). | ||
|
|
||
| **What This Means**: | ||
| - Special transaction handling and polling | ||
| - Initially supported only as receive-only (buy-side) | ||
| - **Now fully supports both buy AND sell** via NEAR Intents | ||
|
|
||
| **Important**: Second-class chains CAN be used as source chains for swaps via NEAR Intents. The "second-class" designation refers to transaction handling, not swap capability. | ||
|
|
||
| ## Common Troubleshooting | ||
|
|
||
| ### Issue: "Starknet swaps are not yet supported" Error | ||
| **Location**: `src/components/MultiHopTrade/hooks/useGetTradeQuotes/getTradeQuoteOrRateInput.ts` | ||
|
|
||
| **Solution**: Implement the `CHAIN_NAMESPACE.Starknet` case in the switch statement (lines 239-256) as shown above. | ||
|
|
||
| ### Issue: No Quotes Appearing | ||
| **Potential Causes**: | ||
| 1. Missing Starknet case in `getTradeQuoteOrRateInput.ts` (most common) | ||
| 2. NEAR Intents API key not configured (`VITE_NEAR_INTENTS_API_KEY`) | ||
| 3. Feature flag disabled (`VITE_FEATURE_NEAR_INTENTS_SWAP`) | ||
| 4. Missing asset in NEAR Intents token list | ||
|
|
||
| ### Issue: Token Not Found in NEAR Intents | ||
| **Check**: `assetToNearIntentsAsset` function in `helpers.ts` - Starknet uses API token lookup | ||
| **Debug**: Add console logs to see token matching results | ||
|
|
||
| ## Testing | ||
|
|
||
| To test Starknet swap support: | ||
| 1. Enable feature flag: `VITE_FEATURE_NEAR_INTENTS_SWAP=true` | ||
| 2. Configure API key: `VITE_NEAR_INTENTS_API_KEY=<key>` | ||
| 3. Select STRK (Starknet) or any Starknet token as sell asset | ||
| 4. Select a destination asset on any supported chain | ||
| 5. Enter amount and verify quotes appear from NEAR Intents | ||
|
|
||
| ## References | ||
|
|
||
| - NEAR Intents Starknet Integration Announcement: December 2024 | ||
| - NEAR Intents supports 20+ chains including Starknet | ||
| - Starknet uses hashed asset IDs requiring API token lookup |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| import { loadEnv } from 'vite' | ||
|
|
||
| import type { Csp } from '../../types' | ||
|
|
||
| const mode = process.env.MODE ?? process.env.NODE_ENV ?? 'development' | ||
| const env = loadEnv(mode, process.cwd(), '') | ||
|
|
||
| export const csp: Csp = { | ||
| 'connect-src': [env.VITE_STARKNET_NODE_URL], | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| import type { Csp } from '../../types' | ||
|
|
||
| export const csp: Csp = { | ||
| 'img-src': ['https://assets.coingecko.com/coins/images/'], | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
packages/caip/src/adapters/coincap/generated/eip155_1/adapter.json
Large diffs are not rendered by default.
Oops, something went wrong.
2 changes: 1 addition & 1 deletion
2
packages/caip/src/adapters/coincap/generated/eip155_10/adapter.json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1 @@ | ||
| {"eip155:10/erc20:0x94b008aa00579c1307b0ef2c499ad98a8ce58e58":"tether","eip155:10/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85":"usd-coin","eip155:10/erc20:0x1f32b1c2345538c0c6f582fcb022739c4a194ebb":"lido-finance-wsteth","eip155:10/erc20:0x68f180fcce6836688e9084f035309e29bf0a2095":"wrapped-bitcoin","eip155:10/erc20:0x4200000000000000000000000000000000000006":"weth","eip155:10/erc20:0x5a7facb970d094b6c7ff1df0ea68d99e6e73cbff":"wrapped-eeth","eip155:10/erc20:0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6":"chainlink","eip155:10/erc20:0x6fd9d7ad17242c41f7131d257212c54a0e816691":"uniswap","eip155:10/erc20:0x9bcef72be871e61ed4fbbc7630889bee758eb81d":"rocket-pool-eth","eip155:10/erc20:0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1":"worldcoin-org","eip155:10/erc20:0x4200000000000000000000000000000000000042":"optimism-ethereum","eip155:10/erc20:0x0994206dfe8de6ec6920ff4d779b0d950605fb53":"curve-dao-token","eip155:10/erc20:0x6985884c4392d348587b19cb9eaaf157f13271cd":"layerzero","eip155:10/erc20:0x2e3d870790dc77a83dd1d18184acc7439a53f475":"frax","eip155:10/erc20:0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91":"wormhole","eip155:10/erc20:0x8700daec35af8ff88c16bdf0418774cb3d7599b4":"synthetix-network-token","eip155:10/erc20:0x3eaeb77b03dbc0f6321ae1b72b2e9adb0f60112b":"sushiswap","eip155:10/erc20:0xaeaeed23478c3a4b798e4ed40d8b7f41366ae861":"ankr","eip155:10/erc20:0xa00e3a3511aac35ca78530c85007afcd31753819":"kyber-network","eip155:10/erc20:0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9":"susd","eip155:10/erc20:0xec6adef5e1006bb305bb1975333e8fc4071295bf":"cartesi","eip155:10/erc20:0xe05a08226c49b636acf99c40da8dc6af83ce5bb3":"ankreth","eip155:10/erc20:0x5f8d72676e37197b5011afc64d8641af2fe41fdb":"measurable-data-token","eip155:10/erc20:0xaf9fe3b5ccdae78188b1f8b9a49da7ae9510f151":"dhedge-dao","eip155:10/erc20:0xc7edf7b7b3667a06992508e7b156eff794a9e1c8":"persistence","eip155:10/erc20:0xe453d6649643f1f460c371dc3d1da98f7922fe51":"fuse-network","eip155:10/erc20:0x1da650c3b2daa8aa9ff6f661d4156ce24d08a062":"dentacoin","eip155:10/erc20:0x6a661312938d22a2a0e27f585073e4406903990a":"mahadao","eip155:10/erc20:0x528cdc92eab044e1e39fe43b9514bfdab4412b98":"giveth"} | ||
| {"eip155:10/erc20:0x94b008aa00579c1307b0ef2c499ad98a8ce58e58":"tether","eip155:10/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85":"usd-coin","eip155:10/erc20:0x1f32b1c2345538c0c6f582fcb022739c4a194ebb":"lido-finance-wsteth","eip155:10/erc20:0x68f180fcce6836688e9084f035309e29bf0a2095":"wrapped-bitcoin","eip155:10/erc20:0x4200000000000000000000000000000000000006":"weth","eip155:10/erc20:0x5a7facb970d094b6c7ff1df0ea68d99e6e73cbff":"wrapped-eeth","eip155:10/erc20:0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6":"chainlink","eip155:10/erc20:0x6fd9d7ad17242c41f7131d257212c54a0e816691":"uniswap","eip155:10/erc20:0x9bcef72be871e61ed4fbbc7630889bee758eb81d":"rocket-pool-eth","eip155:10/erc20:0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1":"worldcoin-org","eip155:10/erc20:0x0994206dfe8de6ec6920ff4d779b0d950605fb53":"curve-dao-token","eip155:10/erc20:0x4200000000000000000000000000000000000042":"optimism-ethereum","eip155:10/erc20:0x6985884c4392d348587b19cb9eaaf157f13271cd":"layerzero","eip155:10/erc20:0x2e3d870790dc77a83dd1d18184acc7439a53f475":"frax","eip155:10/erc20:0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91":"wormhole","eip155:10/erc20:0x8700daec35af8ff88c16bdf0418774cb3d7599b4":"synthetix-network-token","eip155:10/erc20:0x3eaeb77b03dbc0f6321ae1b72b2e9adb0f60112b":"sushiswap","eip155:10/erc20:0xaeaeed23478c3a4b798e4ed40d8b7f41366ae861":"ankr","eip155:10/erc20:0xa00e3a3511aac35ca78530c85007afcd31753819":"kyber-network","eip155:10/erc20:0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9":"susd","eip155:10/erc20:0xec6adef5e1006bb305bb1975333e8fc4071295bf":"cartesi","eip155:10/erc20:0xe05a08226c49b636acf99c40da8dc6af83ce5bb3":"ankreth","eip155:10/erc20:0x5f8d72676e37197b5011afc64d8641af2fe41fdb":"measurable-data-token","eip155:10/erc20:0xaf9fe3b5ccdae78188b1f8b9a49da7ae9510f151":"dhedge-dao","eip155:10/erc20:0xe453d6649643f1f460c371dc3d1da98f7922fe51":"fuse-network","eip155:10/erc20:0xc7edf7b7b3667a06992508e7b156eff794a9e1c8":"persistence","eip155:10/erc20:0x1da650c3b2daa8aa9ff6f661d4156ce24d08a062":"dentacoin","eip155:10/erc20:0x528cdc92eab044e1e39fe43b9514bfdab4412b98":"giveth","eip155:10/erc20:0x6a661312938d22a2a0e27f585073e4406903990a":"mahadao"} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.