From 04478648cd1ca1a60bbeba73296d2aaa40f77c81 Mon Sep 17 00:00:00 2001 From: Artur Sapek Date: Sun, 30 Jun 2024 20:02:40 -0400 Subject: [PATCH] solana signing working, getting rid of SendResult --- wormhole-connect/src/config/converter.ts | 27 +++++++++--- wormhole-connect/src/routes/sdkv2/route.ts | 9 ++-- wormhole-connect/src/routes/sdkv2/signer.ts | 3 ++ wormhole-connect/src/utils/wallet/evm.ts | 12 +++--- wormhole-connect/src/utils/wallet/index.ts | 48 +++++++++++---------- wormhole-connect/src/utils/wallet/solana.ts | 25 ++++++----- 6 files changed, 73 insertions(+), 51 deletions(-) diff --git a/wormhole-connect/src/config/converter.ts b/wormhole-connect/src/config/converter.ts index 9f97057b6..73970436f 100644 --- a/wormhole-connect/src/config/converter.ts +++ b/wormhole-connect/src/config/converter.ts @@ -64,12 +64,29 @@ export class SDKConverter { } } - toTokenIdV2(token: v1.TokenId | TokenConfigV1): v2.TokenId { + toTokenIdV2( + token: v1.TokenId | TokenConfigV1, + chain?: v1.ChainName, + ): v2.TokenId { if (this.isTokenConfigV1(token)) { - return v2.Wormhole.tokenId( - this.toChainV2(token.nativeChain), - token.tokenId?.address ?? 'native', - ); + if (chain && chain != token.nativeChain) { + // Getting foreign address + let foreignAsset = token.foreignAssets?.[chain]; + if (foreignAsset) { + return v2.Wormhole.tokenId( + this.toChainV2(chain), + foreignAsset.address, + ); + } else { + throw new Error('no foreign asset'); + } + } else { + // Getting native address + return v2.Wormhole.tokenId( + this.toChainV2(token.nativeChain), + token.tokenId?.address ?? 'native', + ); + } } else { return v2.Wormhole.tokenId(this.toChainV2(token.chain), token.address); } diff --git a/wormhole-connect/src/routes/sdkv2/route.ts b/wormhole-connect/src/routes/sdkv2/route.ts index 20c8c2969..cd79e564a 100644 --- a/wormhole-connect/src/routes/sdkv2/route.ts +++ b/wormhole-connect/src/routes/sdkv2/route.ts @@ -394,7 +394,7 @@ export class SDKv2Route extends RouteAbstract { async send( sourceToken: TokenConfig, amount: string, - fromChainV1: ChainName | ChainId, + fromChainV1: ChainName, senderAddress: string, toChainV1: ChainName | ChainId, recipientAddress: string, @@ -406,7 +406,10 @@ export class SDKv2Route extends RouteAbstract { const fromChainV2 = await this.getV2ChainContext(fromChainV1); const toChainV2 = await this.getV2ChainContext(toChainV1); - const sourceTokenV2 = config.sdkConverter.toTokenIdV2(sourceToken); + const sourceTokenV2 = config.sdkConverter.toTokenIdV2( + sourceToken, + fromChainV1, + ); const destTokenV2 = config.sdkConverter.getTokenIdV2ForKey( destToken, @@ -414,7 +417,7 @@ export class SDKv2Route extends RouteAbstract { config.tokens, ); - console.log(sourceTokenV2, destTokenV2); + console.log(sourceToken, sourceTokenV2, destTokenV2); if (!destTokenV2) throw new Error(`Couldn't find destToken`); diff --git a/wormhole-connect/src/routes/sdkv2/signer.ts b/wormhole-connect/src/routes/sdkv2/signer.ts index 964e5bfea..412a822db 100644 --- a/wormhole-connect/src/routes/sdkv2/signer.ts +++ b/wormhole-connect/src/routes/sdkv2/signer.ts @@ -77,6 +77,7 @@ export class SDKv2Signer switch (platform) { case 'Evm': // TODO switch multi-provider to ethers 6 + // and remove this ethers5-to-6 conversion let serialized = ethers6.Transaction.from({ to: tx.transaction.to, data: tx.transaction.data, @@ -90,6 +91,8 @@ export class SDKv2Signer data: tx5.data, }; return unsignedTx as SendResult; + case 'Solana': + return tx.transaction.transaction; default: console.warn(`toSendResult is unimplemented for platform ${platform}`); return tx as SendResult; diff --git a/wormhole-connect/src/utils/wallet/evm.ts b/wormhole-connect/src/utils/wallet/evm.ts index dea465cd9..6279f0f32 100644 --- a/wormhole-connect/src/utils/wallet/evm.ts +++ b/wormhole-connect/src/utils/wallet/evm.ts @@ -1,12 +1,12 @@ import { Wallet } from '@xlabs-libs/wallet-aggregator-core'; -import { SendResult } from 'sdklegacy'; -import { TransactionRequest } from '@ethersproject/abstract-provider'; -import { Deferrable } from '@ethersproject/properties'; import { EVMWallet, InjectedWallet, WalletConnectWallet, } from '@kev1n-peters/wallet-aggregator-evm'; + +import { SignRequestEvm } from 'utils/wallet/types'; + import config from 'config'; export const wallets = { @@ -44,7 +44,7 @@ export async function switchChain(w: Wallet, chainId: number | string) { } export async function signAndSendTransaction( - transaction: SendResult, + request: SignRequestEvm, w: Wallet, chainName: string, options: any, // TODO ?!?!!?!? @@ -53,9 +53,7 @@ export async function signAndSendTransaction( const signer = config.wh.getSigner(chainName); if (!signer) throw new Error('No signer found for chain' + chainName); - const tx = await signer.sendTransaction( - transaction as Deferrable, - ); + const tx = await signer.sendTransaction(request.transaction); let result = await tx.wait(); // TODO move all this to ethers 6 diff --git a/wormhole-connect/src/utils/wallet/index.ts b/wormhole-connect/src/utils/wallet/index.ts index d1a27d9e2..b93892ede 100644 --- a/wormhole-connect/src/utils/wallet/index.ts +++ b/wormhole-connect/src/utils/wallet/index.ts @@ -1,10 +1,4 @@ -import { - ChainId, - ChainName, - Context, - SendResult, - ChainConfig, -} from 'sdklegacy'; +import { ChainId, ChainName, Context, ChainConfig } from 'sdklegacy'; import { NotSupported, Wallet, @@ -25,6 +19,8 @@ import { Dispatch } from 'redux'; import { useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; +import { SignRequest } from './types'; + export enum TransferWallet { SENDING = 'sending', RECEIVING = 'receiving', @@ -208,7 +204,7 @@ export const watchAsset = async (asset: AssetInfo, type: TransferWallet) => { export const signAndSendTransaction = async ( chain: ChainName, - transaction: SendResult, + request: SignRequest, walletType: TransferWallet, options: any = {}, ): Promise => { @@ -219,45 +215,51 @@ export const signAndSendTransaction = async ( throw new Error('wallet is undefined'); } + if (chainConfig.context === Context.ETH && request.platform === 'Evm') { + const { signAndSendTransaction } = await import('utils/wallet/evm'); + const tx = await signAndSendTransaction(request, wallet, chain, options); + return tx; + } else if ( + chainConfig.context === Context.SOLANA && + request.platform === 'Solana' + ) { + const { signAndSendTransaction } = await import('utils/wallet/solana'); + const tx = await signAndSendTransaction(request, wallet, options); + return tx.id; + } else { + throw new Error('unimplemented'); + } + + /* switch (chainConfig.context) { case Context.ETH: { - const { signAndSendTransaction } = await import('utils/wallet/evm'); - const tx = await signAndSendTransaction( - transaction, - wallet, - chain, - options, - ); - return tx; } case Context.SOLANA: { - const { signAndSendTransaction } = await import('utils/wallet/solana'); - const tx = await signAndSendTransaction(transaction, wallet, options); - return tx.id; } case Context.SUI: { const { signAndSendTransaction } = await import('utils/wallet/sui'); - const tx = await signAndSendTransaction(transaction, wallet); + const tx = await signAndSendTransaction(request, wallet); return tx.id; } case Context.APTOS: { const { signAndSendTransaction } = await import('utils/wallet/aptos'); - const tx = await signAndSendTransaction(transaction, wallet); + const tx = await signAndSendTransaction(request, wallet); return tx.id; } case Context.SEI: { const { signAndSendTransaction } = await import('utils/wallet/sei'); - const tx = await signAndSendTransaction(transaction, wallet); + const tx = await signAndSendTransaction(request, wallet); return tx.id; } case Context.COSMOS: { const { signAndSendTransaction } = await import('utils/wallet/cosmos'); - const tx = await signAndSendTransaction(transaction, wallet); + const tx = await signAndSendTransaction(request, wallet); return tx.id; } default: throw new Error(`Invalid context ${chainConfig.context}`); } + */ }; export const postVaa = async ( diff --git a/wormhole-connect/src/utils/wallet/solana.ts b/wormhole-connect/src/utils/wallet/solana.ts index bc1536895..74f83f001 100644 --- a/wormhole-connect/src/utils/wallet/solana.ts +++ b/wormhole-connect/src/utils/wallet/solana.ts @@ -1,4 +1,3 @@ -import { SendResult } from 'sdklegacy'; import { WalletAdapterNetwork as SolanaNetwork } from '@solana/wallet-adapter-base'; import { Wallet } from '@xlabs-libs/wallet-aggregator-core'; @@ -12,12 +11,9 @@ import { WalletConnectWalletAdapter, } from '@solana/wallet-adapter-wallets'; -import { - clusterApiUrl, - ConfirmOptions, - Connection, - Transaction, -} from '@solana/web3.js'; +import { clusterApiUrl, ConfirmOptions, Connection } from '@solana/web3.js'; + +import { SignRequestSolana } from 'utils/wallet/types'; import { SolanaWallet, @@ -34,10 +30,13 @@ export function fetchOptions() { const connection = new Connection(config.rpcs.solana || clusterApiUrl(tag)); return { - ...getSolanaStandardWallets(connection).reduce((acc, w) => { - acc[getWalletName(w)] = w; - return acc; - }, {} as Record), + ...getSolanaStandardWallets(connection).reduce( + (acc, w) => { + acc[getWalletName(w)] = w; + return acc; + }, + {} as Record, + ), bitget: new SolanaWallet(new BitgetWalletAdapter(), connection), clover: new SolanaWallet(new CloverWalletAdapter(), connection), coin98: new SolanaWallet(new Coin98WalletAdapter(), connection), @@ -63,7 +62,7 @@ export function fetchOptions() { } export async function signAndSendTransaction( - transaction: SendResult, + request: SignRequestSolana, wallet: Wallet | undefined, options?: ConfirmOptions, ) { @@ -72,7 +71,7 @@ export async function signAndSendTransaction( } return await (wallet as SolanaWallet).signAndSendTransaction({ - transaction: transaction as Transaction, + transaction: request.transaction, options, }); }