diff --git a/.changeset/large-onions-walk.md b/.changeset/large-onions-walk.md new file mode 100644 index 000000000..38fc693c1 --- /dev/null +++ b/.changeset/large-onions-walk.md @@ -0,0 +1,6 @@ +--- +'@xchainjs/xchain-mayachain-amm': patch +'@xchainjs/xchain-thorchain-amm': patch +--- + +Bug fix on swap validation with synth and erc-20 assets diff --git a/packages/xchain-mayachain-amm/src/mayachain-amm.ts b/packages/xchain-mayachain-amm/src/mayachain-amm.ts index fecdc755c..6849ebfae 100644 --- a/packages/xchain-mayachain-amm/src/mayachain-amm.ts +++ b/packages/xchain-mayachain-amm/src/mayachain-amm.ts @@ -10,7 +10,7 @@ import { Client as KujiraClient, defaultKujiParams } from '@xchainjs/xchain-kuji import { Client as MayaClient, MAYAChain } from '@xchainjs/xchain-mayachain' import { MayachainQuery, QuoteSwap, QuoteSwapParams } from '@xchainjs/xchain-mayachain-query' import { Client as ThorClient } from '@xchainjs/xchain-thorchain' -import { Asset, CryptoAmount, baseAmount, getContractAddressFromAsset } from '@xchainjs/xchain-util' +import { Asset, CryptoAmount, baseAmount, eqAsset, getContractAddressFromAsset } from '@xchainjs/xchain-util' import { Wallet } from '@xchainjs/xchain-wallet' import { ethers } from 'ethers' @@ -127,7 +127,10 @@ export class MayachainAMM { const errors: string[] = [] // Validate destination address if provided - if (destinationAddress && !this.wallet.validateAddress(destinationAsset.chain, destinationAddress)) { + if ( + destinationAddress && + !this.wallet.validateAddress(destinationAsset.synth ? MAYAChain : destinationAsset.chain, destinationAddress) + ) { errors.push(`destinationAddress ${destinationAddress} is not a valid address`) } // Validate affiliate address if provided @@ -315,7 +318,9 @@ export class MayachainAMM { */ private isERC20Asset(asset: Asset): boolean { // Check if the asset's chain is an EVM chain and if the symbol matches AssetETH.symbol - return this.isEVMChain(asset.chain) ? [AssetETH.symbol].includes(asset.symbol) : false + return this.isEVMChain(asset.chain) + ? [AssetETH].findIndex((nativeEVMAsset) => eqAsset(nativeEVMAsset, asset)) === -1 + : false } /** diff --git a/packages/xchain-thorchain-amm/__e2e__/thorchain-swap-e2e.ts b/packages/xchain-thorchain-amm/__e2e__/thorchain-swap-e2e.ts index e61a07135..fa24cb146 100644 --- a/packages/xchain-thorchain-amm/__e2e__/thorchain-swap-e2e.ts +++ b/packages/xchain-thorchain-amm/__e2e__/thorchain-swap-e2e.ts @@ -9,7 +9,7 @@ import { import { Client as BchClient, defaultBchParams } from '@xchainjs/xchain-bitcoincash' import { Client as BscClient, defaultBscParams } from '@xchainjs/xchain-bsc' import { Network } from '@xchainjs/xchain-client' -import { AssetATOM, Client as GaiaClient } from '@xchainjs/xchain-cosmos' +import { AssetATOM, Client as GaiaClient, GAIAChain } from '@xchainjs/xchain-cosmos' import { Client as DogeClient, defaultDogeParams } from '@xchainjs/xchain-doge' import { AssetETH, Client as EthClient, defaultEthParams } from '@xchainjs/xchain-ethereum' import { Client as LtcClient, defaultLtcParams } from '@xchainjs/xchain-litecoin' @@ -132,6 +132,42 @@ describe('ThorchainAmm e2e tests', () => { console.log(errors) }) + it(`Should validate swap from ATOM to synth ATOM without errors`, async () => { + const errors = await thorchainAmm.validateSwap({ + fromAsset: AssetATOM, + amount: new CryptoAmount(assetToBase(assetAmount('10')), AssetATOM), + destinationAddress: await wallet.getAddress(THORChain), + destinationAsset: assetFromStringEx('GAIA/ATOM'), + }) + + console.log(errors) + }) + + it(`Should validate swap from ATOM to synth ATOM with destination address error`, async () => { + const errors = await thorchainAmm.validateSwap({ + fromAsset: AssetATOM, + amount: new CryptoAmount(assetToBase(assetAmount('10')), AssetATOM), + destinationAddress: await wallet.getAddress(GAIAChain), + destinationAsset: assetFromStringEx('GAIA/ATOM'), + }) + + console.log(errors) + }) + + it(`Should validate swap from AVAX.USDC to synth ATOM`, async () => { + const asset = assetFromStringEx('AVAX.USDC-0XB97EF9EF8734C71904D8002F8B6BC66DD9C48A6E') + + const errors = await thorchainAmm.validateSwap({ + fromAsset: asset, + fromAddress: await wallet.getAddress(asset.chain), + amount: new CryptoAmount(assetToBase(assetAmount('10')), asset), + destinationAddress: await wallet.getAddress(AssetATOM.chain), + destinationAsset: AssetATOM, + }) + + console.log(errors) + }) + it(`Should estimate swap from BTC to ETH`, async () => { const quoteSwap = await thorchainAmm.estimateSwap({ fromAsset: AssetBTC, diff --git a/packages/xchain-thorchain-amm/src/thorchain-amm.ts b/packages/xchain-thorchain-amm/src/thorchain-amm.ts index 7aa56ac64..efd63e02c 100644 --- a/packages/xchain-thorchain-amm/src/thorchain-amm.ts +++ b/packages/xchain-thorchain-amm/src/thorchain-amm.ts @@ -125,7 +125,10 @@ export class ThorchainAMM { }: QuoteSwapParams): Promise { const errors: string[] = [] - if (destinationAddress && !this.wallet.validateAddress(destinationAsset.chain, destinationAddress)) { + if ( + destinationAddress && + !this.wallet.validateAddress(destinationAsset.synth ? THORChain : destinationAsset.chain, destinationAddress) + ) { errors.push(`destinationAddress ${destinationAddress} is not a valid address`) } diff --git a/packages/xchain-thorchain-amm/src/utils.ts b/packages/xchain-thorchain-amm/src/utils.ts index 47e6936f1..d143777d4 100644 --- a/packages/xchain-thorchain-amm/src/utils.ts +++ b/packages/xchain-thorchain-amm/src/utils.ts @@ -3,7 +3,7 @@ import { AssetBNB } from '@xchainjs/xchain-binance' import { AssetBSC } from '@xchainjs/xchain-bsc' import { AssetATOM } from '@xchainjs/xchain-cosmos' import { AssetETH } from '@xchainjs/xchain-ethereum' -import { Asset, Chain } from '@xchainjs/xchain-util' +import { Asset, Chain, eqAsset } from '@xchainjs/xchain-util' /** * Check if a chain is EVM and supported by the protocol @@ -21,7 +21,7 @@ export const isProtocolEVMChain = (chain: Chain): boolean => { */ export const isProtocolERC20Asset = (asset: Asset): boolean => { return isProtocolEVMChain(asset.chain) - ? ![AssetETH.symbol, AssetAVAX.symbol, AssetBSC.symbol].includes(asset.symbol) + ? [AssetETH, AssetAVAX, AssetBSC].findIndex((nativeEVMAsset) => eqAsset(nativeEVMAsset, asset)) === -1 : false }