@@ -4,20 +4,18 @@ import { AbiCoder } from "ethers"
44import { BridgeFaucet__factory , TransferFaucet__factory } from "~/abis/types"
55import { contractAddresses , stargateNetworksMapping } from "~/config"
66import { PriceStorageExtension } from "~/extensions"
7- import SdkCore from "~/sdk/sdk-core"
7+ import SdkCore , { SdkConfig } from "~/sdk/sdk-core"
88import SdkException , { SdkExceptionCode } from "~/sdk/sdk-exception"
99import { AggregationModuleRequestParams , AggregationModuleResponse } from "~/types"
1010import messageQuoter from "~/utils/message-quoter"
1111
1212export default async function stargateAggregationModule (
1313 sdk : SdkCore ,
14+ sdkConfig : SdkConfig ,
1415 params : AggregationModuleRequestParams
1516) : Promise < SdkException | AggregationModuleResponse > {
1617 const priceStorage = sdk . extension ( PriceStorageExtension )
1718
18- if ( params . outputTokens . length !== 1 )
19- return new SdkException ( "Invalid number of output tokens" , SdkExceptionCode . InvalidRequest )
20-
2119 const bridgeIface = BridgeFaucet__factory . createInterface ( )
2220
2321 const dstNet = Array . from ( networksList ) . find ( n => n . chainId . toString ( ) === params . destinationChainId . toString ( ) )
@@ -54,22 +52,31 @@ export default async function stargateAggregationModule(
5452
5553 const transferFacetIface = TransferFaucet__factory . createInterface ( )
5654
57- let extraData : string
58-
59- if ( params . outputTokens [ 0 ] . address . equalTo ( Address . zeroAddress ) ) {
60- extraData = AbiCoder . defaultAbiCoder ( ) . encode ( [ "bytes[]" ] , [
61- transferFacetIface . encodeFunctionData ( "unwrapNativeAndTransferTo" , [ params . receiverAddress ] )
62- ] )
55+ const dataToEncode : string [ ] = [ ]
56+
57+ if ( params . outputTokens . some ( a => a . address . equalTo ( Address . zeroAddress ) ) ) {
58+ dataToEncode . push ( transferFacetIface . encodeFunctionData ( "unwrapNativeAndTransferTo" , [ params . receiverAddress ] ) )
59+ if ( params . outputTokens . length > 1 ) {
60+ dataToEncode . push (
61+ transferFacetIface . encodeFunctionData ( "transferToken" , [
62+ params . receiverAddress ,
63+ params . outputTokens . map ( t => t . address . toString ( ) )
64+ . filter ( a => ! Address . equal ( a , Address . zeroAddress ) )
65+ ] )
66+ )
67+ }
6368 }
6469 else {
65- extraData = AbiCoder . defaultAbiCoder ( ) . encode ( [ "bytes[]" ] , [
70+ dataToEncode . push (
6671 transferFacetIface . encodeFunctionData ( "transferToken" , [
6772 params . receiverAddress ,
6873 params . outputTokens . map ( t => t . address . toString ( ) )
6974 ] )
70- ] )
75+ )
7176 }
7277
78+ const extraData = AbiCoder . defaultAbiCoder ( ) . encode ( [ "bytes[]" ] , [ dataToEncode ] )
79+
7380 const callData = bridgeIface . encodeFunctionData ( "sendStargate" , [
7481 contractAddresses . stargateUSDCPool ( srcNet ) ,
7582 stargateNetworksMapping ( dstNet ) ,
@@ -101,12 +108,16 @@ export default async function stargateAggregationModule(
101108 const totalInputUSD = inputAmountUSD . plus ( inputNativeAmountUSD )
102109 const priceImpact = new BigNumber ( 100 ) . minus ( outputAmountUSD . dividedBy ( totalInputUSD ) . multipliedBy ( 100 ) ) . dp ( 5 ) . toNumber ( )
103110
111+
104112 const extraNative = await messageQuoter (
105113 srcNet ,
114+ sdkConfig ,
106115 stargateNetworksMapping ( dstNet ) ,
107116 extraData
108117 )
109118
119+ if ( extraNative instanceof SdkException ) return extraNative
120+
110121 return {
111122 callData,
112123 valueToSend : Amount . from ( new BigNumber ( valueToSend . toString ( ) ) . plus ( extraNative . toString ( ) ) . toString ( ) , 18 , false ) ,
0 commit comments