Skip to content

Commit b19824c

Browse files
committed
Fix issue with more than one output tokens
1 parent a9eec71 commit b19824c

File tree

8 files changed

+42
-24
lines changed

8 files changed

+42
-24
lines changed

src/__specs__/cross-chain.simulation.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe("Single chain simulation", async () => {
3131
const createRequest = async (tokensOut: BasicToken[], percents: number[]) => {
3232
const request: ExchangeRequest = {
3333
exactInput: true,
34-
amountIn: new Amount(1, 18, true),
34+
amountIn: new Amount(0.1, 18, true),
3535
amountsOut: Array(tokensOut.length).fill(amountOutInitial),
3636
amountOutReadablePercentages: percents,
3737
tokenIn: bnbBNB,

src/__specs__/utils/sdk-test-config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ const sdkConfig: SdkConfig = {
119119
backend: {
120120
url: "https://api.safeblock.cc"
121121
},
122+
contractAddresses: {
123+
entryPoint: {
124+
default: "0x27d6b06f29802a19c6c1216D540758f32ebD8dE6"
125+
}
126+
},
122127
extensions: env => [
123128
new TokensListExtension(env.sdk, env.eventBus, tokensListExtensionConfig),
124129
new PriceStorageExtension(env.sdk, env.eventBus, {

src/sdk/bridge-aggregation/aggregate-bridges.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface BridgingDetails {
1616
sdkConfig: SdkConfig
1717
}
1818

19-
export default async function aggregateBridges(sdk: SdkCore, options: BridgingDetails): Promise<AggregationResponse | SdkException> {
19+
export default async function aggregateBridges(sdk: SdkCore, sdkConfig: SdkConfig, options: BridgingDetails): Promise<AggregationResponse | SdkException> {
2020
const fromNetworkUSDC = contractAddresses.usdcParams(options.request.tokenIn.network)
2121

2222
const amountLD = !Address.equal(options.request.tokenIn.address, fromNetworkUSDC.address) ? "0" : Amount
@@ -31,7 +31,7 @@ export default async function aggregateBridges(sdk: SdkCore, options: BridgingDe
3131

3232
options.sdkConfig.debugLogListener?.("BridgeAggregation: Sending request to bridge aggregator...")
3333

34-
const aggregationResult = await aggregate(sdk, {
34+
const aggregationResult = await aggregate(sdk, sdkConfig, {
3535
destinationAddress: (options.request.destinationAddress ?? options.senderAddress),
3636
userAddress: options.senderAddress,
3737
inputAmountRaw: Amount.select(options.sourceChainRoute?.amountsOut?.[0], options.sourceNetworkSendAmount)!.toString(),
@@ -100,12 +100,12 @@ export default async function aggregateBridges(sdk: SdkCore, options: BridgingDe
100100
}
101101
}
102102

103-
async function aggregate(sdk: SdkCore, options: AggregationModuleRequestParams) {
103+
async function aggregate(sdk: SdkCore, sdkConfig: SdkConfig, options: AggregationModuleRequestParams) {
104104
const [stargate] = await Promise.all([
105105
//acrossAggregationModule(sdk, options).catch((e: any) => {
106106
// return new SdkException(e?.message || "Failed to process across bridge", SdkExceptionCode.InternalError)
107107
//}),
108-
stargateAggregationModule(sdk, options).catch((e: any) => {
108+
stargateAggregationModule(sdk, sdkConfig, options).catch((e: any) => {
109109
return new SdkException(e?.message || "Failed to process stargate bridge", SdkExceptionCode.InternalError)
110110
})
111111
])

src/sdk/bridge-aggregation/modules/cross-curve.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import SdkException, { SdkExceptionCode } from "~/sdk/sdk-exception"
33
import { AggregationModuleRequestParams } from "~/types"
44

55
export default async function crossCurveAggregationModule(sdk: SdkCore, params: AggregationModuleRequestParams) {
6-
console.log(sdk, params)
7-
86
return new SdkException("Not implemented", SdkExceptionCode.InternalError)
97

108
/*

src/sdk/bridge-aggregation/modules/stargate.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ import { AbiCoder } from "ethers"
44
import { BridgeFaucet__factory, TransferFaucet__factory } from "~/abis/types"
55
import { contractAddresses, stargateNetworksMapping } from "~/config"
66
import { PriceStorageExtension } from "~/extensions"
7-
import SdkCore from "~/sdk/sdk-core"
7+
import SdkCore, { SdkConfig } from "~/sdk/sdk-core"
88
import SdkException, { SdkExceptionCode } from "~/sdk/sdk-exception"
99
import { AggregationModuleRequestParams, AggregationModuleResponse } from "~/types"
1010
import messageQuoter from "~/utils/message-quoter"
1111

1212
export 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),

src/sdk/evm-converter/evm-cross-chain-extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ export default class EvmCrossChainExtension {
266266
sourceChainRoute ? sourceChainRoute.tokensOut.map(t => t.address.toString()) : [fromNetworkUSDC.address.toString()]
267267
]))
268268

269-
const aggregationResult = await aggregateBridges(this.parent.sdkInstance, {
269+
const aggregationResult = await aggregateBridges(this.parent.sdkInstance, this.sdkConfig, {
270270
senderAddress: from,
271271
request,
272272
destinationChainRoute,

src/sdk/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { Address } from "@safeblock/blockchain-utils"
22
import BigNumber from "bignumber.js"
33
import { ethers, JsonRpcSigner } from "ethers"
44
import SdkCore, { type SdkConfig } from "~/sdk/sdk-core"
5+
import SdkException, { SdkExceptionCode } from "~/sdk/sdk-exception"
56
import { ExtractConfigExtensionsType } from "~/sdk/sdk-extension"
67
import { ExchangeRequest, ExecutorCallData } from "~/types"
7-
import SdkException, { SdkExceptionCode } from "~/sdk/sdk-exception"
88

99

1010
type GenericBlacklist<I extends string, S extends string> = Array<{ [key: string]: any } & { [key in I]: string } & { [key in S]: boolean }>
@@ -87,7 +87,10 @@ export default class SafeBlock<Configuration extends SdkConfig = SdkConfig> exte
8787

8888
if (content instanceof SdkException) return content
8989

90-
this.sdkConfig.debugLogListener?.(`Quota: Built: ${ JSON.stringify(content.executorCallData.map(c => ({ data: c.callData, value: c.value?.toString() }))) }`)
90+
this.sdkConfig.debugLogListener?.(`Quota: Built: ${ JSON.stringify(content.executorCallData.map(c => ({
91+
data: c.callData,
92+
value: c.value?.toString()
93+
}))) }`)
9194

9295
return content
9396
}

src/utils/message-quoter.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import { ethersProvider } from "@safeblock/blockchain-utils"
22
import { Network } from "ethers"
33
import { LayerZero__factory } from "~/abis/types"
44
import { contractAddresses } from "~/config"
5+
import { SdkConfig } from "~/sdk"
56
import SdkException, { SdkExceptionCode } from "~/sdk/sdk-exception"
67

7-
export default async function messageQuoter(network: Network, lzId: number, data: string) {
8+
export default async function messageQuoter(network: Network, sdkConfig: SdkConfig, lzId: number, data: string) {
89
const provider = ethersProvider(network)
910

1011
if (!provider) return new SdkException(`Provider not found for network ${ network.name }`, SdkExceptionCode.InternalError)
1112

12-
const lzContract = LayerZero__factory.connect(contractAddresses.entryPoint(network))
13+
const lzContract = LayerZero__factory.connect(contractAddresses.entryPoint(network, sdkConfig), provider)
1314

1415
const message = await lzContract.quoteMessage(lzId, data)
1516
.catch(() => null)

0 commit comments

Comments
 (0)