@allbridge/bridge-core-sdk 3.33.0-alpha.2 → 3.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +2 -2
- package/dist/browser/index.js.map +4 -4
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +4 -4
- package/dist/src/services/bridge/cctp-utils.d.ts +1 -0
- package/dist/src/services/bridge/cctp-utils.js +13 -0
- package/dist/src/services/bridge/cctp-utils.js.map +1 -0
- package/dist/src/services/bridge/evm/abr-payer.d.ts +3 -0
- package/dist/src/services/bridge/evm/abr-payer.js +11 -0
- package/dist/src/services/bridge/evm/abr-payer.js.map +1 -0
- package/dist/src/services/bridge/evm/index.js +35 -10
- package/dist/src/services/bridge/evm/index.js.map +1 -1
- package/dist/src/services/bridge/sol/bridge-tx-service.d.ts +1 -0
- package/dist/src/services/bridge/sol/bridge-tx-service.js +25 -12
- package/dist/src/services/bridge/sol/bridge-tx-service.js.map +1 -1
- package/dist/src/services/bridge/sol/index.js.map +1 -1
- package/dist/src/services/bridge/sol/payer-with-token-service.js +14 -1
- package/dist/src/services/bridge/sol/payer-with-token-service.js.map +1 -1
- package/dist/src/services/bridge/srb/index.d.ts +1 -1
- package/dist/src/services/bridge/srb/index.js +33 -3
- package/dist/src/services/bridge/srb/index.js.map +1 -1
- package/dist/src/services/models/abi/CctpBridge.d.ts +40 -0
- package/dist/src/services/models/abi/CctpBridge.js +52 -0
- package/dist/src/services/models/abi/CctpBridge.js.map +1 -1
- package/dist/src/services/models/sol/types/cctp_v2_bridge.d.ts +254 -0
- package/dist/src/services/models/sol/types/cctp_v2_bridge.js.map +1 -1
- package/dist/src/services/models/sol/types/cctp_v2_bridge.json +254 -0
- package/dist/src/services/models/sol/types/payer_with_token.d.ts +6 -0
- package/dist/src/services/models/sol/types/payer_with_token.js.map +1 -1
- package/dist/src/services/models/sol/types/payer_with_token.json +6 -0
- package/dist/src/services/models/srb/cctp-bridge-contract.d.ts +451 -0
- package/dist/src/services/models/srb/cctp-bridge-contract.js +150 -0
- package/dist/src/services/models/srb/cctp-bridge-contract.js.map +1 -0
- package/dist/src/services/utils/srb/index.d.ts +1 -0
- package/dist/src/services/utils/srb/index.js +9 -0
- package/dist/src/services/utils/srb/index.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function encodeCctpHookForStellar(recipient: string): Buffer;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StrKey } from "@stellar/stellar-sdk";
|
|
2
|
+
import { SdkError } from "../../exceptions";
|
|
3
|
+
export function encodeCctpHookForStellar(recipient) {
|
|
4
|
+
if (!StrKey.isValidEd25519PublicKey(recipient) && !StrKey.isValidMed25519PublicKey(recipient)) {
|
|
5
|
+
throw new SdkError("Invalid Stellar recipient");
|
|
6
|
+
}
|
|
7
|
+
const recipientBytes = Buffer.from(recipient, "ascii");
|
|
8
|
+
const hookData = Buffer.alloc(4 + recipientBytes.length);
|
|
9
|
+
hookData.writeUInt32BE(recipientBytes.length);
|
|
10
|
+
recipientBytes.copy(hookData, 4);
|
|
11
|
+
return hookData;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cctp-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cctp-utils.js","sourceRoot":"","sources":["../../../../src/services/bridge/cctp-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { StrKey } from \"@stellar/stellar-sdk\";\nimport { SdkError } from \"../../exceptions\";\n\nexport function encodeCctpHookForStellar(recipient: string): Buffer {\n if (!StrKey.isValidEd25519PublicKey(recipient) && !StrKey.isValidMed25519PublicKey(recipient)) {\n throw new SdkError(\"Invalid Stellar recipient\");\n }\n const recipientBytes = Buffer.from(recipient, \"ascii\");\n const hookData = Buffer.alloc(4 + recipientBytes.length);\n hookData.writeUInt32BE(recipientBytes.length);\n recipientBytes.copy(hookData, 4);\n return hookData;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChainType } from "../../../chains/chain.enums";
|
|
2
|
+
import { Messenger } from "../../../client/core-api/core-api.model";
|
|
3
|
+
const ABR_PAYER_TARGET_BY_ROUTE = {
|
|
4
|
+
[`${Messenger.CCTP}:${ChainType.SOLANA}`]: 6,
|
|
5
|
+
[`${Messenger.CCTP_V2}:${ChainType.SOLANA}`]: 7,
|
|
6
|
+
[`${Messenger.CCTP_V2}:${ChainType.SRB}`]: 1008,
|
|
7
|
+
};
|
|
8
|
+
export function getAbrPayerTarget(destinationChainType, messenger) {
|
|
9
|
+
return ABR_PAYER_TARGET_BY_ROUTE[`${messenger}:${destinationChainType}`] ?? messenger;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=abr-payer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abr-payer.js","sourceRoot":"","sources":["../../../../../src/services/bridge/evm/abr-payer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,MAAM,yBAAyB,GAA2B;IACxD,CAAC,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5C,CAAC,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI;CAChD,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,oBAA+B,EAAE,SAAoB;IACrF,OAAO,yBAAyB,CAAC,GAAG,SAAS,IAAI,oBAAoB,EAAE,CAAC,IAAI,SAAS,CAAC;AACxF,CAAC","sourcesContent":["import { ChainType } from \"../../../chains/chain.enums\";\nimport { Messenger } from \"../../../client/core-api/core-api.model\";\n\nconst ABR_PAYER_TARGET_BY_ROUTE: Record<string, number> = {\n [`${Messenger.CCTP}:${ChainType.SOLANA}`]: 6,\n [`${Messenger.CCTP_V2}:${ChainType.SOLANA}`]: 7,\n [`${Messenger.CCTP_V2}:${ChainType.SRB}`]: 1008,\n};\n\nexport function getAbrPayerTarget(destinationChainType: ChainType, messenger: Messenger): number {\n return ABR_PAYER_TARGET_BY_ROUTE[`${messenger}:${destinationChainType}`] ?? messenger;\n}\n"]}
|
|
@@ -9,9 +9,11 @@ import CctpBridge from "../../models/abi/CctpBridge";
|
|
|
9
9
|
import OftBridge from "../../models/abi/OftBridge";
|
|
10
10
|
import PayerWithAbr from "../../models/abi/PayerWithAbr";
|
|
11
11
|
import XReserveBridge from "../../models/abi/XReserveBridge";
|
|
12
|
+
import { encodeCctpHookForStellar } from "../cctp-utils";
|
|
12
13
|
import { getCctpSolTokenRecipientAddress } from "../get-cctp-sol-token-recipient-address";
|
|
13
14
|
import { ChainBridgeService } from "../models";
|
|
14
|
-
import { bufferToSize, getNonce, prepareTxSendParams, prepareTxSwapParams } from "../utils";
|
|
15
|
+
import { bufferToSize, formatAddress, getNonce, prepareTxSendParams, prepareTxSwapParams } from "../utils";
|
|
16
|
+
import { getAbrPayerTarget } from "./abr-payer";
|
|
15
17
|
export class EvmBridgeService extends ChainBridgeService {
|
|
16
18
|
web3;
|
|
17
19
|
api;
|
|
@@ -119,15 +121,7 @@ export class EvmBridgeService extends ChainBridgeService {
|
|
|
119
121
|
const abrPayerContract = this.getAbrPayerContract(abrPayerAddress);
|
|
120
122
|
const abi = sendMethod.encodeABI();
|
|
121
123
|
const withoutSelector = "0x" + abi.slice(10);
|
|
122
|
-
|
|
123
|
-
if (params.destinationToken.chainType === ChainType.SOLANA) {
|
|
124
|
-
if (messenger === Messenger.CCTP) {
|
|
125
|
-
target = 6;
|
|
126
|
-
}
|
|
127
|
-
if (messenger === Messenger.CCTP_V2) {
|
|
128
|
-
target = 7;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
124
|
+
const target = getAbrPayerTarget(params.destinationToken.chainType, messenger);
|
|
131
125
|
sendMethod = abrPayerContract.methods.transferTokensAndCallTarget(params.sourceToken.tokenAddress, amount, totalFeeInAbr, target, withoutSelector);
|
|
132
126
|
return Promise.resolve({
|
|
133
127
|
from: fromAccountAddress,
|
|
@@ -167,6 +161,37 @@ export class EvmBridgeService extends ChainBridgeService {
|
|
|
167
161
|
}
|
|
168
162
|
}
|
|
169
163
|
}
|
|
164
|
+
else if (params.destinationToken.chainType === ChainType.SRB && params.messenger === Messenger.CCTP_V2) {
|
|
165
|
+
const destinationCctpV2Address = params.destinationToken.cctpV2Address;
|
|
166
|
+
if (!destinationCctpV2Address) {
|
|
167
|
+
throw new SdkError("Destination token must contain 'cctpV2Address' for CCTP V2");
|
|
168
|
+
}
|
|
169
|
+
const recipient = formatAddress(destinationCctpV2Address, ChainType.SRB, ChainType.EVM);
|
|
170
|
+
const destinationCallerValue = await cctpBridgeContract.methods.otherBridges(toChainId).call();
|
|
171
|
+
const destinationCaller = typeof destinationCallerValue === "string"
|
|
172
|
+
? destinationCallerValue
|
|
173
|
+
: "0x" + Buffer.from(destinationCallerValue).toString("hex");
|
|
174
|
+
if (destinationCaller.toLowerCase() !== recipient.toLowerCase()) {
|
|
175
|
+
throw new SdkError(`CCTPv2 destination caller mismatch: expected ${recipient}, received ${destinationCaller}`);
|
|
176
|
+
}
|
|
177
|
+
const hookData = "0x" + encodeCctpHookForStellar(params.toAccountAddress).toString("hex");
|
|
178
|
+
switch (gasFeePaymentMethod) {
|
|
179
|
+
case FeePaymentMethod.WITH_ABR:
|
|
180
|
+
case FeePaymentMethod.WITH_NATIVE_CURRENCY: {
|
|
181
|
+
sendMethod = cctpBridgeContract.methods.bridgeWithHook(amount, recipient, toChainId, 0, hookData);
|
|
182
|
+
value = totalFee;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case FeePaymentMethod.WITH_STABLECOIN: {
|
|
186
|
+
sendMethod = cctpBridgeContract.methods.bridgeWithHook(amount, recipient, toChainId, totalFee, hookData);
|
|
187
|
+
value = "0";
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
default: {
|
|
191
|
+
return assertNever(gasFeePaymentMethod, "Unhandled FeePaymentMethod");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
170
195
|
else {
|
|
171
196
|
switch (gasFeePaymentMethod) {
|
|
172
197
|
case FeePaymentMethod.WITH_ABR:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/bridge/evm/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAddress } from \"@stacks/transactions\";\nimport { Big } from \"big.js\";\nimport BN from \"bn.js\";\nimport { Contract } from \"web3\";\nimport { PayableMethodObject } from \"web3-eth-contract\";\nimport { Chains } from \"../../../chains\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n EssentialWeb3,\n FeePaymentMethod,\n Messenger,\n SdkError,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { convertAmountPrecision } from \"../../../utils/calculation\";\nimport { assertNever } from \"../../../utils/utils\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport Bridge from \"../../models/abi/Bridge\";\nimport CctpBridge from \"../../models/abi/CctpBridge\";\nimport OftBridge from \"../../models/abi/OftBridge\";\nimport PayerWithAbr from \"../../models/abi/PayerWithAbr\";\nimport XReserveBridge from \"../../models/abi/XReserveBridge\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsEvm, TxSwapParamsEvm } from \"../models\";\nimport { bufferToSize, getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class EvmBridgeService extends ChainBridgeService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionSend(params);\n return this.sendRawTransaction(rawTransaction);\n }\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwapFromParams(params: TxSwapParamsEvm): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const bridgeContract = this.getBridgeContract(contractAddress);\n\n const swapMethod = bridgeContract.methods.swap(\n amount,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n data: swapMethod.encodeABI(),\n });\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n abrExchangeRate,\n } = txSendParams;\n\n const nonce = \"0x\" + getNonce().toString(\"hex\");\n let sendMethod: PayableMethodObject;\n let value: string;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n let totalFeeInAbr: string | undefined;\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_ABR) {\n if (!abrExchangeRate) {\n throw new SdkError(\"Cannot find 'abrExchangeRate' for ABR payment method\");\n }\n if (!params.sourceToken.abrPayer) {\n throw new SdkError(\"Source token must contain 'abrPayer' for ABR payment method\");\n }\n totalFeeInAbr = totalFee;\n const totalFeeInNativeRaw = Big(totalFee).div(abrExchangeRate);\n totalFee = convertAmountPrecision(\n totalFeeInNativeRaw,\n params.sourceToken.abrPayer.abrToken.decimals,\n Chains.getChainDecimalsByType(params.sourceToken.chainType)\n ).toFixed();\n }\n\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const cctp = await this.buildRawTransactionCctpSend(params, txSendParams, totalFee);\n sendMethod = cctp.sendMethod;\n value = cctp.value;\n break;\n }\n case Messenger.OFT: {\n const oft = this.buildRawTransactionOftSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = oft.sendMethod;\n value = oft.value;\n break;\n }\n case Messenger.X_RESERVE: {\n const xReserve = this.buildRawTransactionXReserveSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = xReserve.sendMethod;\n value = xReserve.value;\n break;\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n {\n const bridgeContract = this.getBridgeContract(contractAddress);\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n 0\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n totalFee\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n }\n break;\n }\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_ABR) {\n if (!params.sourceToken.abrPayer) {\n throw new SdkError(\"Source token must contain 'abrPayer' for ABR payment method\");\n }\n\n const abrPayerAddress = params.sourceToken.abrPayer.payerAddress;\n\n if (!totalFeeInAbr) {\n throw new SdkError(\"Failed to calculate totalFeeInAbr\");\n }\n const abrPayerContract = this.getAbrPayerContract(abrPayerAddress);\n\n const abi = sendMethod.encodeABI();\n const withoutSelector = \"0x\" + abi.slice(10);\n\n let target: number = messenger;\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n if (messenger === Messenger.CCTP) {\n target = 6;\n }\n if (messenger === Messenger.CCTP_V2) {\n target = 7;\n }\n }\n sendMethod = abrPayerContract.methods.transferTokensAndCallTarget(\n params.sourceToken.tokenAddress,\n amount,\n totalFeeInAbr,\n target,\n withoutSelector\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: abrPayerAddress,\n value: \"0\",\n data: sendMethod.encodeABI(),\n });\n }\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n value: value,\n data: sendMethod.encodeABI(),\n });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string\n ): Promise<{\n sendMethod: PayableMethodObject;\n value: string;\n }> {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const cctpBridgeContract = this.getCctpBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipient = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n 0\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n totalFee\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n } else {\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, 0);\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, totalFee);\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n }\n return { sendMethod, value };\n }\n\n private buildRawTransactionOftSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const oftBridgeContract = this.getOftBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n 0,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n totalFee,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n\n return { sendMethod, value };\n }\n\n private buildRawTransactionXReserveSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n if (gasFeePaymentMethod !== FeePaymentMethod.WITH_NATIVE_CURRENCY) {\n throw new SdkError(\"xReserve bridge supports only WITH_NATIVE_CURRENCY payment method\");\n }\n if (Big(totalFee).gt(0) || (extraGasDest && Big(extraGasDest).gt(0))) {\n throw new SdkError(\"xReserve bridge does not support additional bridge fee or extra gas\");\n }\n\n let recipient = toAccountAddress;\n if (params.destinationToken.chainType == ChainType.STX) {\n const { version, hash160 } = createAddress(params.toAccountAddress);\n const versionHex = Number(version).toString(16);\n const hashBytes = Buffer.from(`${versionHex}${hash160}`, \"hex\");\n recipient = \"0x\" + bufferToSize(hashBytes, 32).toString(\"hex\");\n }\n\n const xReserveBridgeContract = this.getXReserveBridgeContract(contractAddress);\n return {\n sendMethod: xReserveBridgeContract.methods.bridge(amount, recipient, toChainId),\n value: \"0\",\n };\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction) {\n const estimateGas = await this.web3.eth.estimateGas(rawTransaction);\n\n // @ts-expect-error DISABLE SITE SUGGESTED GAS FEE IN METAMASK\n // prettier-ignore\n const feeOptions: { maxPriorityFeePerGas?: number | string | BN; maxFeePerGas?: number | string | BN } = { maxPriorityFeePerGas: null, maxFeePerGas: null };\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...(rawTransaction as object),\n gas: estimateGas,\n ...feeOptions,\n });\n return { txId: transactionHash.toString() };\n }\n\n private getBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(Bridge.abi, contractAddress) as Contract<typeof Bridge.abi>;\n }\n\n private getCctpBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(CctpBridge.abi, contractAddress) as Contract<typeof CctpBridge.abi>;\n }\n\n private getOftBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(OftBridge.abi, contractAddress) as Contract<typeof OftBridge.abi>;\n }\n\n private getAbrPayerContract(contractAddress: string) {\n return new this.web3.eth.Contract(PayerWithAbr.abi, contractAddress) as Contract<typeof PayerWithAbr.abi>;\n }\n\n private getXReserveBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(XReserveBridge.abi, contractAddress) as Contract<typeof XReserveBridge.abi>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/bridge/evm/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAddress } from \"@stacks/transactions\";\nimport { Big } from \"big.js\";\nimport BN from \"bn.js\";\nimport { Contract } from \"web3\";\nimport { PayableMethodObject } from \"web3-eth-contract\";\nimport { Chains } from \"../../../chains\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n EssentialWeb3,\n FeePaymentMethod,\n Messenger,\n SdkError,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { convertAmountPrecision } from \"../../../utils/calculation\";\nimport { assertNever } from \"../../../utils/utils\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport Bridge from \"../../models/abi/Bridge\";\nimport CctpBridge from \"../../models/abi/CctpBridge\";\nimport OftBridge from \"../../models/abi/OftBridge\";\nimport PayerWithAbr from \"../../models/abi/PayerWithAbr\";\nimport XReserveBridge from \"../../models/abi/XReserveBridge\";\nimport { encodeCctpHookForStellar } from \"../cctp-utils\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsEvm, TxSwapParamsEvm } from \"../models\";\nimport { bufferToSize, formatAddress, getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\nimport { getAbrPayerTarget } from \"./abr-payer\";\n\nexport class EvmBridgeService extends ChainBridgeService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionSend(params);\n return this.sendRawTransaction(rawTransaction);\n }\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwapFromParams(params: TxSwapParamsEvm): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const bridgeContract = this.getBridgeContract(contractAddress);\n\n const swapMethod = bridgeContract.methods.swap(\n amount,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n data: swapMethod.encodeABI(),\n });\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n abrExchangeRate,\n } = txSendParams;\n\n const nonce = \"0x\" + getNonce().toString(\"hex\");\n let sendMethod: PayableMethodObject;\n let value: string;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n let totalFeeInAbr: string | undefined;\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_ABR) {\n if (!abrExchangeRate) {\n throw new SdkError(\"Cannot find 'abrExchangeRate' for ABR payment method\");\n }\n if (!params.sourceToken.abrPayer) {\n throw new SdkError(\"Source token must contain 'abrPayer' for ABR payment method\");\n }\n totalFeeInAbr = totalFee;\n const totalFeeInNativeRaw = Big(totalFee).div(abrExchangeRate);\n totalFee = convertAmountPrecision(\n totalFeeInNativeRaw,\n params.sourceToken.abrPayer.abrToken.decimals,\n Chains.getChainDecimalsByType(params.sourceToken.chainType)\n ).toFixed();\n }\n\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const cctp = await this.buildRawTransactionCctpSend(params, txSendParams, totalFee);\n sendMethod = cctp.sendMethod;\n value = cctp.value;\n break;\n }\n case Messenger.OFT: {\n const oft = this.buildRawTransactionOftSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = oft.sendMethod;\n value = oft.value;\n break;\n }\n case Messenger.X_RESERVE: {\n const xReserve = this.buildRawTransactionXReserveSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = xReserve.sendMethod;\n value = xReserve.value;\n break;\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n {\n const bridgeContract = this.getBridgeContract(contractAddress);\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n 0\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n totalFee\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n }\n break;\n }\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_ABR) {\n if (!params.sourceToken.abrPayer) {\n throw new SdkError(\"Source token must contain 'abrPayer' for ABR payment method\");\n }\n\n const abrPayerAddress = params.sourceToken.abrPayer.payerAddress;\n\n if (!totalFeeInAbr) {\n throw new SdkError(\"Failed to calculate totalFeeInAbr\");\n }\n const abrPayerContract = this.getAbrPayerContract(abrPayerAddress);\n\n const abi = sendMethod.encodeABI();\n const withoutSelector = \"0x\" + abi.slice(10);\n\n const target = getAbrPayerTarget(params.destinationToken.chainType, messenger);\n sendMethod = abrPayerContract.methods.transferTokensAndCallTarget(\n params.sourceToken.tokenAddress,\n amount,\n totalFeeInAbr,\n target,\n withoutSelector\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: abrPayerAddress,\n value: \"0\",\n data: sendMethod.encodeABI(),\n });\n }\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n value: value,\n data: sendMethod.encodeABI(),\n });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string\n ): Promise<{\n sendMethod: PayableMethodObject;\n value: string;\n }> {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const cctpBridgeContract = this.getCctpBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipient = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n 0\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n totalFee\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n } else if (params.destinationToken.chainType === ChainType.SRB && params.messenger === Messenger.CCTP_V2) {\n const destinationCctpV2Address = params.destinationToken.cctpV2Address;\n if (!destinationCctpV2Address) {\n throw new SdkError(\"Destination token must contain 'cctpV2Address' for CCTP V2\");\n }\n const recipient = formatAddress(destinationCctpV2Address, ChainType.SRB, ChainType.EVM);\n const destinationCallerValue = await cctpBridgeContract.methods.otherBridges(toChainId).call();\n const destinationCaller =\n typeof destinationCallerValue === \"string\"\n ? destinationCallerValue\n : \"0x\" + Buffer.from(destinationCallerValue).toString(\"hex\");\n if (destinationCaller.toLowerCase() !== recipient.toLowerCase()) {\n throw new SdkError(`CCTPv2 destination caller mismatch: expected ${recipient}, received ${destinationCaller}`);\n }\n const hookData = \"0x\" + encodeCctpHookForStellar(params.toAccountAddress).toString(\"hex\");\n\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = cctpBridgeContract.methods.bridgeWithHook(amount, recipient, toChainId, 0, hookData);\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = cctpBridgeContract.methods.bridgeWithHook(amount, recipient, toChainId, totalFee, hookData);\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n } else {\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, 0);\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, totalFee);\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n }\n return { sendMethod, value };\n }\n\n private buildRawTransactionOftSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const oftBridgeContract = this.getOftBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n switch (gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_ABR:\n case FeePaymentMethod.WITH_NATIVE_CURRENCY: {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n 0,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = totalFee;\n break;\n }\n case FeePaymentMethod.WITH_STABLECOIN: {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n totalFee,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = \"0\";\n break;\n }\n default: {\n return assertNever(gasFeePaymentMethod, \"Unhandled FeePaymentMethod\");\n }\n }\n\n return { sendMethod, value };\n }\n\n private buildRawTransactionXReserveSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n if (gasFeePaymentMethod !== FeePaymentMethod.WITH_NATIVE_CURRENCY) {\n throw new SdkError(\"xReserve bridge supports only WITH_NATIVE_CURRENCY payment method\");\n }\n if (Big(totalFee).gt(0) || (extraGasDest && Big(extraGasDest).gt(0))) {\n throw new SdkError(\"xReserve bridge does not support additional bridge fee or extra gas\");\n }\n\n let recipient = toAccountAddress;\n if (params.destinationToken.chainType == ChainType.STX) {\n const { version, hash160 } = createAddress(params.toAccountAddress);\n const versionHex = Number(version).toString(16);\n const hashBytes = Buffer.from(`${versionHex}${hash160}`, \"hex\");\n recipient = \"0x\" + bufferToSize(hashBytes, 32).toString(\"hex\");\n }\n\n const xReserveBridgeContract = this.getXReserveBridgeContract(contractAddress);\n return {\n sendMethod: xReserveBridgeContract.methods.bridge(amount, recipient, toChainId),\n value: \"0\",\n };\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction) {\n const estimateGas = await this.web3.eth.estimateGas(rawTransaction);\n\n // @ts-expect-error DISABLE SITE SUGGESTED GAS FEE IN METAMASK\n // prettier-ignore\n const feeOptions: { maxPriorityFeePerGas?: number | string | BN; maxFeePerGas?: number | string | BN } = { maxPriorityFeePerGas: null, maxFeePerGas: null };\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...(rawTransaction as object),\n gas: estimateGas,\n ...feeOptions,\n });\n return { txId: transactionHash.toString() };\n }\n\n private getBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(Bridge.abi, contractAddress) as Contract<typeof Bridge.abi>;\n }\n\n private getCctpBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(CctpBridge.abi, contractAddress) as Contract<typeof CctpBridge.abi>;\n }\n\n private getOftBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(OftBridge.abi, contractAddress) as Contract<typeof OftBridge.abi>;\n }\n\n private getAbrPayerContract(contractAddress: string) {\n return new this.web3.eth.Contract(PayerWithAbr.abi, contractAddress) as Contract<typeof PayerWithAbr.abi>;\n }\n\n private getXReserveBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(XReserveBridge.abi, contractAddress) as Contract<typeof XReserveBridge.abi>;\n }\n}\n"]}
|
|
@@ -12,6 +12,7 @@ import { getMessage, getTokenAccountData, getVUsdAmount } from "../../utils/sol"
|
|
|
12
12
|
import { getAssociatedAccount, getAuthorityAccount, getBridgeTokenAccount, getCctpAccounts, getCctpAuthorityAccount, getCctpBridgeAccount, getCctpBridgeTokenAccount, getCctpLockAccount, getCctpV2BridgeConfigAccount, getChainBridgeAccount, getConfigAccount, getGasUsageAccount, getLockAccount, getOtherChainTokenAccount, getPriceAccount, getSendMessageAccount, } from "../../utils/sol/accounts";
|
|
13
13
|
import { buildAnchorProvider } from "../../utils/sol/anchor-provider";
|
|
14
14
|
import { addUnitLimitAndUnitPriceToTx } from "../../utils/sol/compute-budget";
|
|
15
|
+
import { encodeCctpHookForStellar } from "../cctp-utils";
|
|
15
16
|
import { getNonce, prepareTxSwapParams } from "../utils";
|
|
16
17
|
import { convertToVersionedTransaction } from "./utils";
|
|
17
18
|
const COMPUTE_UNIT_LIMIT = 1_000_000;
|
|
@@ -113,7 +114,7 @@ export class BridgeTxService {
|
|
|
113
114
|
break;
|
|
114
115
|
}
|
|
115
116
|
case Messenger.CCTP_V2: {
|
|
116
|
-
const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpV2Data(solTxSendParams);
|
|
117
|
+
const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpV2Data(params, solTxSendParams);
|
|
117
118
|
const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpV2Transaction(params.destinationToken.chainSymbol, swapAndBridgeSolData);
|
|
118
119
|
swapAndBridgeTx = transaction;
|
|
119
120
|
requiredMessageSigner = messageSentEventDataKeypair;
|
|
@@ -421,7 +422,7 @@ export class BridgeTxService {
|
|
|
421
422
|
messageSentEventDataKeypair,
|
|
422
423
|
};
|
|
423
424
|
}
|
|
424
|
-
async prepareSwapAndBridgeCctpV2Data(txSendParams) {
|
|
425
|
+
async prepareSwapAndBridgeCctpV2Data(params, txSendParams) {
|
|
425
426
|
const { contractAddress, amount, fromAccountAddress, fromTokenAddress, toChainId, toAccountAddress, toTokenAddress, extraGas, } = txSendParams;
|
|
426
427
|
const cctpV2BridgeAddress = contractAddress;
|
|
427
428
|
if (!cctpV2BridgeAddress) {
|
|
@@ -430,18 +431,32 @@ export class BridgeTxService {
|
|
|
430
431
|
const CHAIN_ID = 4;
|
|
431
432
|
const account = fromAccountAddress;
|
|
432
433
|
const receiveTokenAddress = toTokenAddress;
|
|
433
|
-
const receiverInBuffer32 = toAccountAddress;
|
|
434
434
|
const provider = buildAnchorProvider(this.solanaRpcUrl, account);
|
|
435
435
|
const cctpBridge = new Program({ ...cctpV2BridgeIdl, address: cctpV2BridgeAddress }, provider);
|
|
436
436
|
const mint = new PublicKey(fromTokenAddress);
|
|
437
437
|
const cctpBridgeConfigAccount = getCctpV2BridgeConfigAccount(mint, cctpBridge.programId);
|
|
438
438
|
const userAccount = new PublicKey(account);
|
|
439
439
|
const configAccountInfo = await cctpBridge.account.config.fetch(cctpBridgeConfigAccount);
|
|
440
|
+
let recipient;
|
|
441
|
+
let hookData;
|
|
442
|
+
if (params.destinationToken.chainType === ChainType.SRB) {
|
|
443
|
+
const destinationCctpV2Address = params.destinationToken.cctpV2Address;
|
|
444
|
+
if (!destinationCctpV2Address) {
|
|
445
|
+
throw new CCTPDoesNotSupportedError("The route does not support CCTPv2 protocol");
|
|
446
|
+
}
|
|
447
|
+
recipient = Array.from(new PublicKey(destinationCctpV2Address).toBytes());
|
|
448
|
+
hookData = encodeCctpHookForStellar(params.toAccountAddress);
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
recipient = Array.from(toAccountAddress);
|
|
452
|
+
hookData = undefined;
|
|
453
|
+
}
|
|
440
454
|
const swapAndBridgeData = {};
|
|
441
455
|
swapAndBridgeData.cctpBridge = cctpBridge;
|
|
442
456
|
swapAndBridgeData.amount = new BN(amount);
|
|
443
|
-
swapAndBridgeData.recipient =
|
|
457
|
+
swapAndBridgeData.recipient = recipient;
|
|
444
458
|
swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);
|
|
459
|
+
swapAndBridgeData.hookData = hookData;
|
|
445
460
|
swapAndBridgeData.userToken = getAssociatedAccount(userAccount, mint);
|
|
446
461
|
swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);
|
|
447
462
|
swapAndBridgeData.userAccount = userAccount;
|
|
@@ -456,7 +471,7 @@ export class BridgeTxService {
|
|
|
456
471
|
return swapAndBridgeData;
|
|
457
472
|
}
|
|
458
473
|
async buildSwapAndBridgeCctpV2Transaction(destinationChainSymbol, swapAndBridgeData) {
|
|
459
|
-
const { amount, cctpBridge: program, chainBridgeAccount, destinationChainId, extraGasInstruction, gasPrice, mint, provider, receiveToken, recipient, thisGasPrice, userAccount, userToken, } = swapAndBridgeData;
|
|
474
|
+
const { amount, cctpBridge: program, chainBridgeAccount, destinationChainId, extraGasInstruction, gasPrice, hookData, mint, provider, receiveToken, recipient, thisGasPrice, userAccount, userToken, } = swapAndBridgeData;
|
|
460
475
|
const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];
|
|
461
476
|
const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpV2TransmitterProgramId;
|
|
462
477
|
const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpV2TokenMessengerMinter;
|
|
@@ -471,13 +486,11 @@ export class BridgeTxService {
|
|
|
471
486
|
instructions.push(extraGasInstruction);
|
|
472
487
|
}
|
|
473
488
|
const messageSentEventDataKeypair = Keypair.generate();
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
receiveToken,
|
|
480
|
-
})
|
|
489
|
+
const bridgeArgs = { amount, destinationChainId, recipient, receiveToken };
|
|
490
|
+
const method = hookData
|
|
491
|
+
? program.methods.bridgeWithHook({ ...bridgeArgs, hookData })
|
|
492
|
+
: program.methods.bridge(bridgeArgs);
|
|
493
|
+
const tx = await method
|
|
481
494
|
.accounts({
|
|
482
495
|
mint: mint,
|
|
483
496
|
user: userAccount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-tx-service.js","sourceRoot":"","sources":["../../../../../src/services/bridge/sol/bridge-tx-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BN, Idl, Program, Provider, web3 } from \"@coral-xyz/anchor\";\nimport { createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync } from \"@solana/spl-token\";\nimport { Keypair, PublicKey, SystemProgram, TransactionInstruction, VersionedTransaction } from \"@solana/web3.js\";\nimport { Messenger } from \"../../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { CCTPDoesNotSupportedError, OFTDoesNotSupportedError, SdkError } from \"../../../exceptions\";\nimport { CctpParams, ChainType, SwapParams, TxFeeParams } from \"../../../models\";\nimport { assertNever } from \"../../../utils/utils\";\nimport { RawTransaction } from \"../../models\";\nimport { Bridge as BridgeType } from \"../../models/sol/types/bridge\";\nimport * as bridgeIdl from \"../../models/sol/types/bridge.json\";\nimport { CctpBridge as CctpBridgeType } from \"../../models/sol/types/cctp_bridge\";\nimport * as cctpBridgeIdl from \"../../models/sol/types/cctp_bridge.json\";\nimport { CctpV2Bridge as CctpV2BridgeType } from \"../../models/sol/types/cctp_v2_bridge\";\nimport * as cctpV2BridgeIdl from \"../../models/sol/types/cctp_v2_bridge.json\";\nimport { getMessage, getTokenAccountData, getVUsdAmount } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getCctpAccounts,\n getCctpAuthorityAccount,\n getCctpBridgeAccount,\n getCctpBridgeTokenAccount,\n getCctpLockAccount,\n getCctpV2BridgeConfigAccount,\n getChainBridgeAccount,\n getConfigAccount,\n getGasUsageAccount,\n getLockAccount,\n getOtherChainTokenAccount,\n getPriceAccount,\n getSendMessageAccount,\n} from \"../../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../../utils/sol/anchor-provider\";\nimport { addUnitLimitAndUnitPriceToTx } from \"../../utils/sol/compute-budget\";\nimport { SendParams, TxSwapParamsSol } from \"../models\";\nimport { getNonce, prepareTxSwapParams } from \"../utils\";\nimport { convertToVersionedTransaction, SolTxSendParams } from \"./utils\";\n\ninterface SwapAndBridgeSolData {\n bridge: Program<BridgeType>;\n amount: BN;\n vusdAmount: BN;\n nonce: number[];\n recipient: number[];\n receiveToken: number[];\n poolAccount: PublicKey;\n lockAccount: PublicKey;\n bridgeAuthority: PublicKey;\n userToken: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n otherBridgeTokenAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n config: PublicKey;\n configAccountInfo: ConfigAccountInfo;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n message: Buffer;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\ninterface ConfigAccountInfo {\n allbridgeMessengerProgramId: PublicKey;\n wormholeMessengerProgramId: PublicKey;\n gasOracleProgramId: PublicKey;\n}\n\ninterface SwapAndBridgeSolDataCctpData<IDL extends Idl> {\n cctpBridge: Program<IDL>;\n cctpBridgeAccount: PublicKey;\n cctpAddressAccount: PublicKey;\n amount: BN;\n recipient: number[];\n receiveToken: number[];\n userToken: PublicKey;\n bridgeAuthority: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\nexport interface SolanaBridgeParams {\n /** @deprecated Do not use. */\n wormholeMessengerProgramId?: string;\n solanaLookUpTable: string;\n cctpParams: CctpParams;\n}\n\nconst COMPUTE_UNIT_LIMIT = 1_000_000;\n\nexport class BridgeTxService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n\n constructor(\n public solanaRpcUrl: string,\n public params: SolanaBridgeParams,\n public api: AllbridgeCoreClient\n ) {}\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildSwapTransaction(\n txSwapParams,\n params.sourceToken.poolAddress,\n params.destinationToken.poolAddress,\n params.txFeeParams\n );\n }\n\n private async buildSwapTransaction(\n params: TxSwapParamsSol,\n poolAddress: string,\n toPoolAddress: string,\n txFeeParams?: TxFeeParams\n ): Promise<VersionedTransaction> {\n const {\n fromAccountAddress,\n amount,\n contractAddress,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount,\n } = params;\n const account = fromAccountAddress;\n const bridgeAddress = contractAddress;\n const tokenAddress = fromTokenAddress;\n const receiveTokenAddress = toTokenAddress;\n const receivePoolAddress = toPoolAddress;\n const receiverOriginal = toAccountAddress;\n\n const userAccount = new PublicKey(account);\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n const bridge = new Program<BridgeType>({ ...bridgeIdl, address: bridgeAddress }, provider);\n\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const configAccount = await getConfigAccount(bridge.programId);\n\n const sendMint = new PublicKey(tokenAddress);\n const sendBridgeToken = await getBridgeTokenAccount(sendMint, bridge.programId);\n const sendPool = new PublicKey(poolAddress);\n const sendUserToken = getAssociatedAccount(userAccount, sendMint);\n\n const receiverAccount = new PublicKey(receiverOriginal);\n const receiveMint = new PublicKey(receiveTokenAddress);\n const receiveBridgeToken = await getBridgeTokenAccount(receiveMint, bridge.programId);\n const receivePool = new PublicKey(receivePoolAddress);\n const receiveUserToken = getAssociatedAccount(receiverAccount, receiveMint);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ];\n\n try {\n await getTokenAccountData(receiveUserToken, provider);\n } catch (ignoreError) {\n const receiveUserToken = getAssociatedTokenAddressSync(receiveMint, receiverAccount);\n const createReceiveUserTokenInstruction = createAssociatedTokenAccountInstruction(\n userAccount,\n receiveUserToken,\n receiverAccount,\n receiveMint\n );\n preInstructions.push(createReceiveUserTokenInstruction);\n }\n const transaction = await bridge.methods\n .swap(new BN(amount), new BN(minimumReceiveAmount || 0))\n .accountsPartial({\n payer: userAccount,\n config: configAccount,\n bridgeAuthority,\n user: userAccount,\n sendBridgeToken,\n sendMint,\n sendPool,\n sendUserToken,\n receiveBridgeToken,\n receiveMint,\n receivePool,\n receiveUserToken,\n })\n .preInstructions(preInstructions)\n .transaction();\n\n const connection = provider.connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n await addUnitLimitAndUnitPriceToTx(transaction, txFeeParams, this.solanaRpcUrl);\n return await convertToVersionedTransaction(transaction, connection, this.params.solanaLookUpTable);\n }\n\n async buildRawTransactionSend(\n params: SendParams,\n solTxSendParams: SolTxSendParams\n ): Promise<{ tx: VersionedTransaction; requiredMessageSigner: Keypair | undefined }> {\n let swapAndBridgeTx: VersionedTransaction;\n let requiredMessageSigner: Keypair | undefined = undefined;\n switch (params.messenger) {\n case Messenger.ALLBRIDGE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n swapAndBridgeTx = await this.buildSwapAndBridgeAllbridgeTransaction(swapAndBridgeSolData);\n break;\n }\n case Messenger.WORMHOLE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n const { transaction, messageAccount } = await this.buildSwapAndBridgeWormholeTransaction(swapAndBridgeSolData);\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageAccount;\n break;\n }\n case Messenger.CCTP: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpData(solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpTransaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.CCTP_V2: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpV2Data(solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpV2Transaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.X_RESERVE:\n throw new SdkError(\"Messenger xReserve is not supported yet.\");\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n default: {\n return assertNever(params.messenger, \"Unhandled Messenger type\");\n }\n }\n return { tx: swapAndBridgeTx, requiredMessageSigner };\n }\n private getExtraGasInstruction(\n extraGas: string,\n userAccount: PublicKey,\n configAccount: PublicKey\n ): TransactionInstruction | undefined {\n return web3.SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: configAccount,\n lamports: +extraGas,\n });\n }\n\n private async prepareSwapAndBridgeData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolData> {\n const {\n amount,\n contractAddress,\n fromChainId,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n poolAddress,\n extraGas,\n } = txSendParams;\n const tokenAddress = fromTokenAddress;\n const account = fromAccountAddress;\n const destinationChainId = toChainId;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n const bridgeAddress = contractAddress;\n const sourceChainId = fromChainId;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const bridge = new Program<BridgeType>({ ...bridgeIdl, address: bridgeAddress }, provider);\n const nonce = Array.from(getNonce());\n const poolAccount = new PublicKey(poolAddress);\n const vUsdAmount = await getVUsdAmount(amount, bridge, poolAccount);\n\n const lockAccount = await getLockAccount(nonce, bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const userToken = getAssociatedAccount(new PublicKey(account), new PublicKey(tokenAddress));\n const bridgeTokenAccount = await getBridgeTokenAccount(new PublicKey(tokenAddress), bridge.programId);\n const chainBridgeAccount = await getChainBridgeAccount(destinationChainId, bridge.programId);\n const otherBridgeTokenAccount = await getOtherChainTokenAccount(\n destinationChainId,\n Buffer.from(receiveTokenAddress),\n bridge.programId\n );\n\n const configAccount = await getConfigAccount(bridge.programId);\n const configAccountInfo = await bridge.account.config.fetch(configAccount);\n const priceAccount = await getPriceAccount(destinationChainId, configAccountInfo.gasOracleProgramId);\n const thisGasPriceAccount = await getPriceAccount(sourceChainId, configAccountInfo.gasOracleProgramId);\n\n const message = getMessage({\n amount: vUsdAmount,\n recipient: Buffer.from(receiverInBuffer32),\n nonce: Buffer.from(nonce),\n receiveToken: Buffer.from(receiveTokenAddress),\n destinationChainId,\n sourceChainId,\n chainBridge: (await getAuthorityAccount(bridge.programId)).toBuffer(),\n });\n\n const swapAndBridgeData = {} as SwapAndBridgeSolData;\n\n swapAndBridgeData.bridge = bridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.vusdAmount = new BN(vUsdAmount);\n swapAndBridgeData.nonce = nonce;\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.poolAccount = poolAccount;\n swapAndBridgeData.lockAccount = lockAccount;\n swapAndBridgeData.bridgeAuthority = bridgeAuthority;\n swapAndBridgeData.userToken = userToken;\n swapAndBridgeData.bridgeTokenAccount = bridgeTokenAccount;\n swapAndBridgeData.chainBridgeAccount = chainBridgeAccount;\n swapAndBridgeData.otherBridgeTokenAccount = otherBridgeTokenAccount;\n swapAndBridgeData.userAccount = new PublicKey(account);\n swapAndBridgeData.destinationChainId = destinationChainId;\n swapAndBridgeData.mint = new PublicKey(tokenAddress);\n swapAndBridgeData.config = configAccount;\n swapAndBridgeData.configAccountInfo = configAccountInfo;\n swapAndBridgeData.gasPrice = priceAccount;\n swapAndBridgeData.thisGasPrice = thisGasPriceAccount;\n swapAndBridgeData.message = message;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n configAccount\n );\n }\n return swapAndBridgeData;\n }\n\n private async buildSwapAndBridgeAllbridgeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<VersionedTransaction> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const allbridgeMessengerProgramId = configAccountInfo.allbridgeMessengerProgramId;\n const messengerGasUsageAccount = await getGasUsageAccount(destinationChainId, allbridgeMessengerProgramId);\n const messengerConfig = await getConfigAccount(allbridgeMessengerProgramId);\n\n const sentMessageAccount = await getSendMessageAccount(message, allbridgeMessengerProgramId);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const transaction = await bridge.methods\n .swapAndBridge({\n vusdAmount,\n nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accountsPartial({\n payer: userAccount,\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n messenger: allbridgeMessengerProgramId,\n messengerGasUsage: messengerGasUsageAccount,\n messengerConfig,\n sentMessageAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString()).connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return await convertToVersionedTransaction(transaction, connection, this.params.solanaLookUpTable);\n }\n\n private async buildSwapAndBridgeWormholeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<{ transaction: VersionedTransaction; messageAccount: Keypair }> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n } = swapAndBridgeData;\n const wormholeProgramId = this.params.wormholeMessengerProgramId;\n if (!wormholeProgramId) {\n throw new SdkError(\"Do not use.\");\n }\n\n const [whBridgeAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Bridge\")],\n new PublicKey(wormholeProgramId)\n );\n const [whFeeCollectorAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"fee_collector\")],\n new PublicKey(wormholeProgramId)\n );\n const [whSequenceAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Sequence\"), bridgeAuthority.toBuffer()],\n new PublicKey(wormholeProgramId)\n );\n\n const messengerGasUsageAccount = await getGasUsageAccount(\n destinationChainId,\n configAccountInfo.wormholeMessengerProgramId\n );\n const wormholeMessengerConfigAccount = await getConfigAccount(configAccountInfo.wormholeMessengerProgramId);\n const messageAccount = Keypair.generate();\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n\n const bridgeAccountInfo = await provider.connection.getAccountInfo(whBridgeAccount);\n if (bridgeAccountInfo == null) {\n throw new SdkError(\"Cannot fetch wormhole bridge account info\");\n }\n const feeLamports = new BN(bridgeAccountInfo.data.slice(16, 24), \"le\").toString();\n\n const feeInstruction = SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: whFeeCollectorAccount,\n lamports: +feeLamports,\n });\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const accounts = {\n payer: userAccount,\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n messengerGasUsage: messengerGasUsageAccount,\n wormholeProgram: wormholeProgramId,\n bridge: whBridgeAccount,\n message: messageAccount.publicKey,\n wormholeMessenger: configAccountInfo.wormholeMessengerProgramId,\n sequence: whSequenceAccount,\n feeCollector: whFeeCollectorAccount,\n wormholeMessengerConfig: wormholeMessengerConfigAccount,\n clock: web3.SYSVAR_CLOCK_PUBKEY,\n };\n\n const transaction = await bridge.methods\n .swapAndBridgeWormhole({\n vusdAmount,\n nonce: nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts(accounts)\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n feeInstruction,\n ])\n .postInstructions(instructions)\n .signers([messageAccount])\n .transaction();\n transaction.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(transaction, provider.connection, this.params.solanaLookUpTable),\n messageAccount,\n };\n }\n\n private async prepareSwapAndBridgeCctpData(\n txSendParams: SolTxSendParams\n ): Promise<SwapAndBridgeSolDataCctpData<CctpBridgeType>> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpAddress = contractAddress;\n if (!cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpBridgeType> = new Program<CctpBridgeType>(\n { ...cctpBridgeIdl, address: cctpAddress },\n provider\n );\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeAccount = await getCctpBridgeAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.cctpBridge.fetch(cctpBridgeAccount);\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData<CctpBridgeType>;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.cctpBridgeAccount = cctpBridgeAccount;\n swapAndBridgeData.cctpAddressAccount = new PublicKey(cctpAddress);\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.userToken = getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.bridgeAuthority = await getCctpAuthorityAccount(cctpBridgeAccount, cctpBridge.programId);\n swapAndBridgeData.bridgeTokenAccount = await getCctpBridgeTokenAccount(mint, cctpBridge.programId);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeAccount\n );\n }\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpTransaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData<CctpBridgeType>\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n cctpBridge,\n cctpBridgeAccount,\n amount,\n recipient,\n receiveToken,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n userAccount,\n destinationChainId,\n mint,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n provider,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpTransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpTokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTP is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n const lockAccount = getCctpLockAccount(cctpBridge.programId, messageSentEventDataKeypair.publicKey);\n\n const tx = await cctpBridge.methods\n .bridge({\n amount,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accountsPartial({\n mint: mint,\n user: userAccount,\n cctpBridge: cctpBridgeAccount,\n payer: userAccount,\n\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n lock: lockAccount,\n\n cctpMessenger: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessengerKey: remoteTokenMessengerKey,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n bridgeToken: bridgeTokenAccount,\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n bridgeAuthority: bridgeAuthority,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(tx, connection, this.params.solanaLookUpTable),\n messageSentEventDataKeypair,\n };\n }\n\n private async prepareSwapAndBridgeCctpV2Data(\n txSendParams: SolTxSendParams\n ): Promise<SwapAndBridgeSolDataCctpData<CctpV2BridgeType>> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpV2BridgeAddress = contractAddress;\n if (!cctpV2BridgeAddress) {\n throw new CCTPDoesNotSupportedError(\"The route does not support CCTPv2 protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpV2BridgeType> = new Program<CctpV2BridgeType>(\n { ...cctpV2BridgeIdl, address: cctpV2BridgeAddress },\n provider\n );\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeConfigAccount = getCctpV2BridgeConfigAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.config.fetch(cctpBridgeConfigAccount);\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData<CctpV2BridgeType>;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.userToken = getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeConfigAccount\n );\n }\n\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpV2Transaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData<CctpV2BridgeType>\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n amount,\n cctpBridge: program,\n chainBridgeAccount,\n destinationChainId,\n extraGasInstruction,\n gasPrice,\n mint,\n provider,\n receiveToken,\n recipient,\n thisGasPrice,\n userAccount,\n userToken,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpV2TransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpV2TokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTPv2 is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey: remoteTokenMessenger,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n\n const tx = await program.methods\n .bridge({\n amount,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts({\n mint: mint,\n user: userAccount,\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n tokenMessengerMinterProgram: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessenger: remoteTokenMessenger,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(tx, connection, this.params.solanaLookUpTable),\n messageSentEventDataKeypair,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridge-tx-service.js","sourceRoot":"","sources":["../../../../../src/services/bridge/sol/bridge-tx-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BN, Idl, Program, Provider, web3 } from \"@coral-xyz/anchor\";\nimport { createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync } from \"@solana/spl-token\";\nimport { Keypair, PublicKey, SystemProgram, TransactionInstruction, VersionedTransaction } from \"@solana/web3.js\";\nimport { Messenger } from \"../../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { CCTPDoesNotSupportedError, OFTDoesNotSupportedError, SdkError } from \"../../../exceptions\";\nimport { CctpParams, ChainType, SwapParams, TxFeeParams } from \"../../../models\";\nimport { assertNever } from \"../../../utils/utils\";\nimport { RawTransaction } from \"../../models\";\nimport { Bridge as BridgeType } from \"../../models/sol/types/bridge\";\nimport * as bridgeIdl from \"../../models/sol/types/bridge.json\";\nimport { CctpBridge as CctpBridgeType } from \"../../models/sol/types/cctp_bridge\";\nimport * as cctpBridgeIdl from \"../../models/sol/types/cctp_bridge.json\";\nimport { CctpV2Bridge as CctpV2BridgeType } from \"../../models/sol/types/cctp_v2_bridge\";\nimport * as cctpV2BridgeIdl from \"../../models/sol/types/cctp_v2_bridge.json\";\nimport { getMessage, getTokenAccountData, getVUsdAmount } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getCctpAccounts,\n getCctpAuthorityAccount,\n getCctpBridgeAccount,\n getCctpBridgeTokenAccount,\n getCctpLockAccount,\n getCctpV2BridgeConfigAccount,\n getChainBridgeAccount,\n getConfigAccount,\n getGasUsageAccount,\n getLockAccount,\n getOtherChainTokenAccount,\n getPriceAccount,\n getSendMessageAccount,\n} from \"../../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../../utils/sol/anchor-provider\";\nimport { addUnitLimitAndUnitPriceToTx } from \"../../utils/sol/compute-budget\";\nimport { encodeCctpHookForStellar } from \"../cctp-utils\";\nimport { SendParams, TxSwapParamsSol } from \"../models\";\nimport { getNonce, prepareTxSwapParams } from \"../utils\";\nimport { convertToVersionedTransaction, SolTxSendParams } from \"./utils\";\n\ninterface SwapAndBridgeSolData {\n bridge: Program<BridgeType>;\n amount: BN;\n vusdAmount: BN;\n nonce: number[];\n recipient: number[];\n receiveToken: number[];\n poolAccount: PublicKey;\n lockAccount: PublicKey;\n bridgeAuthority: PublicKey;\n userToken: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n otherBridgeTokenAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n config: PublicKey;\n configAccountInfo: ConfigAccountInfo;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n message: Buffer;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\ninterface ConfigAccountInfo {\n allbridgeMessengerProgramId: PublicKey;\n wormholeMessengerProgramId: PublicKey;\n gasOracleProgramId: PublicKey;\n}\n\ninterface SwapAndBridgeSolDataCctpData<IDL extends Idl> {\n cctpBridge: Program<IDL>;\n cctpBridgeAccount: PublicKey;\n cctpAddressAccount: PublicKey;\n amount: BN;\n recipient: number[];\n receiveToken: number[];\n hookData?: Buffer;\n userToken: PublicKey;\n bridgeAuthority: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\nexport interface SolanaBridgeParams {\n /** @deprecated Do not use. */\n wormholeMessengerProgramId?: string;\n solanaLookUpTable: string;\n cctpParams: CctpParams;\n}\n\nconst COMPUTE_UNIT_LIMIT = 1_000_000;\n\nexport class BridgeTxService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n\n constructor(\n public solanaRpcUrl: string,\n public params: SolanaBridgeParams,\n public api: AllbridgeCoreClient\n ) {}\n\n /** @deprecated Do not use. */\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildSwapTransaction(\n txSwapParams,\n params.sourceToken.poolAddress,\n params.destinationToken.poolAddress,\n params.txFeeParams\n );\n }\n\n private async buildSwapTransaction(\n params: TxSwapParamsSol,\n poolAddress: string,\n toPoolAddress: string,\n txFeeParams?: TxFeeParams\n ): Promise<VersionedTransaction> {\n const {\n fromAccountAddress,\n amount,\n contractAddress,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount,\n } = params;\n const account = fromAccountAddress;\n const bridgeAddress = contractAddress;\n const tokenAddress = fromTokenAddress;\n const receiveTokenAddress = toTokenAddress;\n const receivePoolAddress = toPoolAddress;\n const receiverOriginal = toAccountAddress;\n\n const userAccount = new PublicKey(account);\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n const bridge = new Program<BridgeType>({ ...bridgeIdl, address: bridgeAddress }, provider);\n\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const configAccount = await getConfigAccount(bridge.programId);\n\n const sendMint = new PublicKey(tokenAddress);\n const sendBridgeToken = await getBridgeTokenAccount(sendMint, bridge.programId);\n const sendPool = new PublicKey(poolAddress);\n const sendUserToken = getAssociatedAccount(userAccount, sendMint);\n\n const receiverAccount = new PublicKey(receiverOriginal);\n const receiveMint = new PublicKey(receiveTokenAddress);\n const receiveBridgeToken = await getBridgeTokenAccount(receiveMint, bridge.programId);\n const receivePool = new PublicKey(receivePoolAddress);\n const receiveUserToken = getAssociatedAccount(receiverAccount, receiveMint);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ];\n\n try {\n await getTokenAccountData(receiveUserToken, provider);\n } catch (ignoreError) {\n const receiveUserToken = getAssociatedTokenAddressSync(receiveMint, receiverAccount);\n const createReceiveUserTokenInstruction = createAssociatedTokenAccountInstruction(\n userAccount,\n receiveUserToken,\n receiverAccount,\n receiveMint\n );\n preInstructions.push(createReceiveUserTokenInstruction);\n }\n const transaction = await bridge.methods\n .swap(new BN(amount), new BN(minimumReceiveAmount || 0))\n .accountsPartial({\n payer: userAccount,\n config: configAccount,\n bridgeAuthority,\n user: userAccount,\n sendBridgeToken,\n sendMint,\n sendPool,\n sendUserToken,\n receiveBridgeToken,\n receiveMint,\n receivePool,\n receiveUserToken,\n })\n .preInstructions(preInstructions)\n .transaction();\n\n const connection = provider.connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n await addUnitLimitAndUnitPriceToTx(transaction, txFeeParams, this.solanaRpcUrl);\n return await convertToVersionedTransaction(transaction, connection, this.params.solanaLookUpTable);\n }\n\n async buildRawTransactionSend(\n params: SendParams,\n solTxSendParams: SolTxSendParams\n ): Promise<{ tx: VersionedTransaction; requiredMessageSigner: Keypair | undefined }> {\n let swapAndBridgeTx: VersionedTransaction;\n let requiredMessageSigner: Keypair | undefined = undefined;\n switch (params.messenger) {\n case Messenger.ALLBRIDGE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n swapAndBridgeTx = await this.buildSwapAndBridgeAllbridgeTransaction(swapAndBridgeSolData);\n break;\n }\n case Messenger.WORMHOLE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n const { transaction, messageAccount } = await this.buildSwapAndBridgeWormholeTransaction(swapAndBridgeSolData);\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageAccount;\n break;\n }\n case Messenger.CCTP: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpData(solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpTransaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.CCTP_V2: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpV2Data(params, solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpV2Transaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.X_RESERVE:\n throw new SdkError(\"Messenger xReserve is not supported yet.\");\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n default: {\n return assertNever(params.messenger, \"Unhandled Messenger type\");\n }\n }\n return { tx: swapAndBridgeTx, requiredMessageSigner };\n }\n private getExtraGasInstruction(\n extraGas: string,\n userAccount: PublicKey,\n configAccount: PublicKey\n ): TransactionInstruction | undefined {\n return web3.SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: configAccount,\n lamports: +extraGas,\n });\n }\n\n private async prepareSwapAndBridgeData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolData> {\n const {\n amount,\n contractAddress,\n fromChainId,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n poolAddress,\n extraGas,\n } = txSendParams;\n const tokenAddress = fromTokenAddress;\n const account = fromAccountAddress;\n const destinationChainId = toChainId;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n const bridgeAddress = contractAddress;\n const sourceChainId = fromChainId;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const bridge = new Program<BridgeType>({ ...bridgeIdl, address: bridgeAddress }, provider);\n const nonce = Array.from(getNonce());\n const poolAccount = new PublicKey(poolAddress);\n const vUsdAmount = await getVUsdAmount(amount, bridge, poolAccount);\n\n const lockAccount = await getLockAccount(nonce, bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const userToken = getAssociatedAccount(new PublicKey(account), new PublicKey(tokenAddress));\n const bridgeTokenAccount = await getBridgeTokenAccount(new PublicKey(tokenAddress), bridge.programId);\n const chainBridgeAccount = await getChainBridgeAccount(destinationChainId, bridge.programId);\n const otherBridgeTokenAccount = await getOtherChainTokenAccount(\n destinationChainId,\n Buffer.from(receiveTokenAddress),\n bridge.programId\n );\n\n const configAccount = await getConfigAccount(bridge.programId);\n const configAccountInfo = await bridge.account.config.fetch(configAccount);\n const priceAccount = await getPriceAccount(destinationChainId, configAccountInfo.gasOracleProgramId);\n const thisGasPriceAccount = await getPriceAccount(sourceChainId, configAccountInfo.gasOracleProgramId);\n\n const message = getMessage({\n amount: vUsdAmount,\n recipient: Buffer.from(receiverInBuffer32),\n nonce: Buffer.from(nonce),\n receiveToken: Buffer.from(receiveTokenAddress),\n destinationChainId,\n sourceChainId,\n chainBridge: (await getAuthorityAccount(bridge.programId)).toBuffer(),\n });\n\n const swapAndBridgeData = {} as SwapAndBridgeSolData;\n\n swapAndBridgeData.bridge = bridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.vusdAmount = new BN(vUsdAmount);\n swapAndBridgeData.nonce = nonce;\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.poolAccount = poolAccount;\n swapAndBridgeData.lockAccount = lockAccount;\n swapAndBridgeData.bridgeAuthority = bridgeAuthority;\n swapAndBridgeData.userToken = userToken;\n swapAndBridgeData.bridgeTokenAccount = bridgeTokenAccount;\n swapAndBridgeData.chainBridgeAccount = chainBridgeAccount;\n swapAndBridgeData.otherBridgeTokenAccount = otherBridgeTokenAccount;\n swapAndBridgeData.userAccount = new PublicKey(account);\n swapAndBridgeData.destinationChainId = destinationChainId;\n swapAndBridgeData.mint = new PublicKey(tokenAddress);\n swapAndBridgeData.config = configAccount;\n swapAndBridgeData.configAccountInfo = configAccountInfo;\n swapAndBridgeData.gasPrice = priceAccount;\n swapAndBridgeData.thisGasPrice = thisGasPriceAccount;\n swapAndBridgeData.message = message;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n configAccount\n );\n }\n return swapAndBridgeData;\n }\n\n private async buildSwapAndBridgeAllbridgeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<VersionedTransaction> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const allbridgeMessengerProgramId = configAccountInfo.allbridgeMessengerProgramId;\n const messengerGasUsageAccount = await getGasUsageAccount(destinationChainId, allbridgeMessengerProgramId);\n const messengerConfig = await getConfigAccount(allbridgeMessengerProgramId);\n\n const sentMessageAccount = await getSendMessageAccount(message, allbridgeMessengerProgramId);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const transaction = await bridge.methods\n .swapAndBridge({\n vusdAmount,\n nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accountsPartial({\n payer: userAccount,\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n messenger: allbridgeMessengerProgramId,\n messengerGasUsage: messengerGasUsageAccount,\n messengerConfig,\n sentMessageAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString()).connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return await convertToVersionedTransaction(transaction, connection, this.params.solanaLookUpTable);\n }\n\n private async buildSwapAndBridgeWormholeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<{ transaction: VersionedTransaction; messageAccount: Keypair }> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n } = swapAndBridgeData;\n const wormholeProgramId = this.params.wormholeMessengerProgramId;\n if (!wormholeProgramId) {\n throw new SdkError(\"Do not use.\");\n }\n\n const [whBridgeAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Bridge\")],\n new PublicKey(wormholeProgramId)\n );\n const [whFeeCollectorAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"fee_collector\")],\n new PublicKey(wormholeProgramId)\n );\n const [whSequenceAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Sequence\"), bridgeAuthority.toBuffer()],\n new PublicKey(wormholeProgramId)\n );\n\n const messengerGasUsageAccount = await getGasUsageAccount(\n destinationChainId,\n configAccountInfo.wormholeMessengerProgramId\n );\n const wormholeMessengerConfigAccount = await getConfigAccount(configAccountInfo.wormholeMessengerProgramId);\n const messageAccount = Keypair.generate();\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n\n const bridgeAccountInfo = await provider.connection.getAccountInfo(whBridgeAccount);\n if (bridgeAccountInfo == null) {\n throw new SdkError(\"Cannot fetch wormhole bridge account info\");\n }\n const feeLamports = new BN(bridgeAccountInfo.data.slice(16, 24), \"le\").toString();\n\n const feeInstruction = SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: whFeeCollectorAccount,\n lamports: +feeLamports,\n });\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const accounts = {\n payer: userAccount,\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n messengerGasUsage: messengerGasUsageAccount,\n wormholeProgram: wormholeProgramId,\n bridge: whBridgeAccount,\n message: messageAccount.publicKey,\n wormholeMessenger: configAccountInfo.wormholeMessengerProgramId,\n sequence: whSequenceAccount,\n feeCollector: whFeeCollectorAccount,\n wormholeMessengerConfig: wormholeMessengerConfigAccount,\n clock: web3.SYSVAR_CLOCK_PUBKEY,\n };\n\n const transaction = await bridge.methods\n .swapAndBridgeWormhole({\n vusdAmount,\n nonce: nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts(accounts)\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n feeInstruction,\n ])\n .postInstructions(instructions)\n .signers([messageAccount])\n .transaction();\n transaction.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(transaction, provider.connection, this.params.solanaLookUpTable),\n messageAccount,\n };\n }\n\n private async prepareSwapAndBridgeCctpData(\n txSendParams: SolTxSendParams\n ): Promise<SwapAndBridgeSolDataCctpData<CctpBridgeType>> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpAddress = contractAddress;\n if (!cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpBridgeType> = new Program<CctpBridgeType>(\n { ...cctpBridgeIdl, address: cctpAddress },\n provider\n );\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeAccount = await getCctpBridgeAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.cctpBridge.fetch(cctpBridgeAccount);\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData<CctpBridgeType>;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.cctpBridgeAccount = cctpBridgeAccount;\n swapAndBridgeData.cctpAddressAccount = new PublicKey(cctpAddress);\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.userToken = getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.bridgeAuthority = await getCctpAuthorityAccount(cctpBridgeAccount, cctpBridge.programId);\n swapAndBridgeData.bridgeTokenAccount = await getCctpBridgeTokenAccount(mint, cctpBridge.programId);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeAccount\n );\n }\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpTransaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData<CctpBridgeType>\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n cctpBridge,\n cctpBridgeAccount,\n amount,\n recipient,\n receiveToken,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n userAccount,\n destinationChainId,\n mint,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n provider,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpTransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpTokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTP is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n const lockAccount = getCctpLockAccount(cctpBridge.programId, messageSentEventDataKeypair.publicKey);\n\n const tx = await cctpBridge.methods\n .bridge({\n amount,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accountsPartial({\n mint: mint,\n user: userAccount,\n cctpBridge: cctpBridgeAccount,\n payer: userAccount,\n\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n lock: lockAccount,\n\n cctpMessenger: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessengerKey: remoteTokenMessengerKey,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n bridgeToken: bridgeTokenAccount,\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n bridgeAuthority: bridgeAuthority,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(tx, connection, this.params.solanaLookUpTable),\n messageSentEventDataKeypair,\n };\n }\n\n private async prepareSwapAndBridgeCctpV2Data(\n params: SendParams,\n txSendParams: SolTxSendParams\n ): Promise<SwapAndBridgeSolDataCctpData<CctpV2BridgeType>> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpV2BridgeAddress = contractAddress;\n if (!cctpV2BridgeAddress) {\n throw new CCTPDoesNotSupportedError(\"The route does not support CCTPv2 protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpV2BridgeType> = new Program<CctpV2BridgeType>(\n { ...cctpV2BridgeIdl, address: cctpV2BridgeAddress },\n provider\n );\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeConfigAccount = getCctpV2BridgeConfigAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.config.fetch(cctpBridgeConfigAccount);\n let recipient;\n let hookData;\n if (params.destinationToken.chainType === ChainType.SRB) {\n const destinationCctpV2Address = params.destinationToken.cctpV2Address;\n if (!destinationCctpV2Address) {\n throw new CCTPDoesNotSupportedError(\"The route does not support CCTPv2 protocol\");\n }\n recipient = Array.from(new PublicKey(destinationCctpV2Address).toBytes());\n hookData = encodeCctpHookForStellar(params.toAccountAddress);\n } else {\n recipient = Array.from(toAccountAddress);\n hookData = undefined;\n }\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData<CctpV2BridgeType>;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = recipient;\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.hookData = hookData;\n swapAndBridgeData.userToken = getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeConfigAccount\n );\n }\n\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpV2Transaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData<CctpV2BridgeType>\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n amount,\n cctpBridge: program,\n chainBridgeAccount,\n destinationChainId,\n extraGasInstruction,\n gasPrice,\n hookData,\n mint,\n provider,\n receiveToken,\n recipient,\n thisGasPrice,\n userAccount,\n userToken,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpV2TransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpV2TokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTPv2 is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey: remoteTokenMessenger,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n\n const bridgeArgs = { amount, destinationChainId, recipient, receiveToken };\n const method = hookData\n ? program.methods.bridgeWithHook({ ...bridgeArgs, hookData })\n : program.methods.bridge(bridgeArgs);\n\n const tx = await method\n .accounts({\n mint: mint,\n user: userAccount,\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n tokenMessengerMinterProgram: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessenger: remoteTokenMessenger,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return {\n transaction: await convertToVersionedTransaction(tx, connection, this.params.solanaLookUpTable),\n messageSentEventDataKeypair,\n };\n }\n}\n"]}
|