Complete Guide: Implementing Magic Eden Multichain Wallet Integration for Polygon Transactions
Executive Summary
This post chronicles the complete journey of integrating Magic Eden's multichain wallet functionality for executing NFT burn transactions on the Polygon network. The integration required understanding Magic Eden's novel wallet architecture, correctly distinguishing between their multiChain and ethereum providers, and resolving critical differences from traditional wallet providers like MetaMask or Coinbase Wallet.
Final Outcome: Successfully enabled Polygon transactions using Magic Eden Wallet, reducing gas costs from ~$0.20 on Ethereum to <$0.01 on Polygon.
Initial Problem Statement
Issue: While testing Magic Eden Wallet for NFT burns on Polygon, the wallet was defaulting to Ethereum mainnet. It prompted users to pay ETH gas fees (~0.0001 ETH), defeating the cost-saving purpose of Polygon.
Key Symptoms:
-
Magic Eden wallet UI showed "Ethereum Chain"
-
Transactions posted to Etherscan (not Polygonscan)
-
Backend reward logic failed to detect burns due to wrong network
Key Resources & Documentation
🔗 Sandbox Repository: https://github.com/Tcadle434/me-wallet-sandbox
Files of Interest:
-
src/components/App.tsx– Chain selection implementation -
src/components/MultichainMethods.tsx– Multichain connection/signing -
src/components/EvmMethods.tsx– EVM transaction patterns -
src/utils/multichain/signMessage.ts– Multichain signing utility -
src/utils/evm/sendTransaction.ts– Transaction submission utility
Key Learnings:
-
multiChainhandles address management and signing, not transactions -
Polygon transactions must use
window.magicEden.ethereum -
Chain switching is supported via
wallet_switchEthereumChain
Magic Eden Wallet Architecture
window.magicEden = {
bitcoin: {...}, // BTC
ethereum: {...}, // ETH, Polygon, Base (EVM)
solana: {...}, // Solana
multiChain: {...} // Address management, cross-chain features
};
Architecture Summary:
-
multiChain: Address abstraction layer -
ethereum: Used for all EVM transactions (ETH, Polygon, Base) -
multiChainis not a transaction provider
Journey of Challenges & Solutions
🚫 Challenge 1: Stack Overflow Error
Issue: Passing multiChain into BrowserProvider() caused infinite recursion.
provider = new BrowserProvider(window.magicEden.multiChain); // ❌
Fix: Use multiChain only to retrieve the wallet address. Use ethereum for all txs.
🚫 Challenge 2: Address Format
Issue: Magic Eden's multiChain returns Ethereum addresses as arrays.
['0x4796574fc34E02A98972dDFd073709FDcbBd8F73']
Fix: Extract first array element manually.
const ethAddresses = multichainResponse.addresses.ethereum;
const userAddress = Array.isArray(ethAddresses) ? ethAddresses[0] : ethAddresses;
🚫 Challenge 3: Wrong Transaction Provider
Issue: Tried using multiChain.sendTransaction() or .request() (doesn’t exist)
Fix:
-
Extract address from
multiChain -
Use
window.magicEden.ethereumas transaction provider
🚫 Challenge 4: Chain Switching Misunderstanding
Assumed: Magic Eden didn’t support chain switching
Fix: Found working wallet_switchEthereumChain call in EvmMethods.tsx
await ethereumProvider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x89' }], // Polygon
});
✅ Final Working Implementation
1. Address Extraction
const multiChain = window.magicEden?.multiChain;
if (multiChain && multiChain.isConnected) {
const multichainResponse = multiChain.currentMultiChainResponse;
const ethAddresses = multichainResponse.addresses.ethereum;
userAddress = Array.isArray(ethAddresses) ? ethAddresses[0] : ethAddresses;
provider = new BrowserProvider(window.magicEden.ethereum);
signer = await provider.getSigner();
}
2. Network Switching
await window.magicEden.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x89' }],
});
3. EVM Transaction
const nftContract = new Contract(
contractAddress,
['function safeTransferFrom(address from, address to, uint256 tokenId)'],
signer
);
await nftContract.safeTransferFrom(userAddress, burnAddress, BigInt(tokenId), {
gasLimit: 300_000,
chainId: 137,
});
⚠️ Gotchas & Lessons Learned
-
Provider Roles Are Distinct
-
multiChainis not a transaction provider -
ethereumhandles all EVM chains (ETH, Polygon, Base)
-
-
Array-Based Address Responses
-
Always extract with
Array.isArray(addresses) ? addresses[0] : addresses
-
-
Chain Switching Is Supported
-
Use
wallet_switchEthereumChainfor Polygon (chainId:0x89)
-
-
Follow the Sandbox Examples
-
Avoid assumptions; reference real-world implementations
-
✅ Implementation Verified
Success Criteria:
-
✅ Wallet prompts for Polygon switch
-
✅ Transactions appear on Polygonscan
-
✅ Gas costs are ~$0.005 POL
-
✅ Backend correctly detects Polygon burns
-
✅ NFT upgrade rewards issued
Resolved Errors:
-
❌
Maximum call stack size exceeded→ Fixed by using correct provider -
❌
toLowerCase is not a function→ Fixed by array extraction -
❌
sendTransaction is not a function→ Resolved by not misusingmultiChain
Recommended Dev Approach
-
Start with Magic Eden's sandbox repo
-
Separate provider responsibilities:
-
multiChain: For address retrieval only -
ethereum: For all EVM-compatible txs
-
-
Always switch network before tx execution
-
Follow standard
ethers.jstransaction patterns -
Verify on correct network explorer (Polygonscan, not Etherscan)
Technical Specs Summary
-
Polygon chainId:
0x89(hex) /137(dec) -
ME Wallet providers:
window.magicEden.ethereum,multiChain -
Supported EVM chains: Ethereum (0x1), Polygon (0x89), Base (0x2105)
-
Tools Used:
-
Magic Eden sandbox
-
ethers.js v6
-
React app
-
Polygonscan
-
Conclusion
Magic Eden Wallet’s multichain architecture requires a nuanced approach: use multiChain for address resolution, and ethereum for EVM transactions. Chain switching is fully supported and must be explicitly invoked. Developers who rely on real-world code (not assumptions) and correctly extract array-based addresses will find integration straightforward.
This guide demystifies Magic Eden’s multichain setup and enables efficient NFT workflows on Polygon. With these tools, developers can offer seamless multichain support with low gas costs and reliable UX.