全桥核心SDK
为浏览器或节点.js中的DApps提供与Allbridge Core桥的简单集成
目录
安装
$ npm install @allbridge/bridge-core-sdk
如何使用
找出如何整合 Allbridge Core SDK 和浏览器扩展钱包
1. 初始化SDK
1) 以节点 Rpc urls (RECOMEND) 初始化 SDK 实例
import {AllbridgeCoreSdk, nodeRpcUrlsDefault} from "@allbridge/bridge-core-sdk";
// Connections to blockchains will be made through your rpc-urls passed during initialization
const sdk = new AllbridgeCoreSdk({
...nodeRpcUrlsDefault,
TRX: "your trx-rpc-url",
ETH: "your eth-rpc-url"
});
// Sdk will be using your rpc url for fetch data from blockchain to create tx
const rawTx = await sdk.bridge.rawTxBuilder.send(sendParams);
苏伊苏伊完全节点不再服务 JSON -RPC,所以
SUIuRL必须是gRPC-web(sui.rpc.v2)一个完整节点的基url,例如.https://fullnode.mainnet.sui.io。 。 。 .
(2) 初始化 SDK 实例( 使用经过的提供者连接区块链)
import {AllbridgeCoreSdk, nodeRpcUrlsDefault} from "@allbridge/bridge-core-sdk";
const sdk = new AllbridgeCoreSdk(nodeRpcUrlsDefault);
// The Provider parameter must be passed in order for it to be used to connect to the blockchain, for example:
const rawTx = await sdk.bridge.rawTxBuilder.send(sendParams, provider);
提普: 为(Web3:v1.9.0,tronweb:v4.4.4.0)进行测试和开发,在其他情况下使用方法1
2. 获取支持的符号列表
const supportedChains = await sdk.chainDetailsMap();
// extract information about ETH chain
const {tokens, chainId, name, oftBridgeAddress} = supportedChains[ChainSymbol.ETH];
// Choose one of the tokens supported on ETH
const usdcOnEthToken = tokens.find(token => token.symbol === 'USDC');
每一个符号都作为 TokenWithChainDetails 对象。 除了一般符号数据外(symbol, (中文(简体) ), name, (中文(简体) ),
decimals, (中文(简体) ), tokenAddress它包含一切需要 找出 哪些使者可以发送 标志:
| 外地 | 现时 | 含义 |
|---|---|---|
cctpAddress, (中文(简体) ), cctpFeeShare | 符号由 CCTP 支持 | CCTP 桥梁合同地址(核准支出人)和CCTP收费份额 |
cctpV2Address, (中文(简体) ), cctpV2FeeShare | 符号由 CCTP V2 支持 | CCTP V2 桥梁合同地址(批准支出者)和CCTP V2 收费份额 |
oftId, (中文(简体) ), oftBridgeAddress | oFT 支持符/ 链 | Id 在不同链条上由同一同物共享 OFT桥合同地址 |
xReserve | xReserve 支持符号 | xReserve桥梁合同地址(核准支出人), feeShare 财务报告和审定财务报表 feeConst |
lifiIntents | 符号在 LI.FI 路线上 | bridgeAddress (批准支出者,仅限源链)和 destinations |
transferTime | 永远 | 每信使平均向其他链条转移时间 |
abrPayer | 链式支持在 ABR 中支付费用 | ABR 付款人合同地址和每信使可用性 |
3. 选择信使
每一次传输都由被支持的信使之一执行(行距协议).
信使是所有依赖路由的 SDK 方法的要求参数 :
bridge.checkAllowance, (中文(简体) ), bridge.rawTxBuilder.approve, (中文(简体) ), bridge.rawTxBuilder.send, (中文(简体) ), getAmountToBeReceived, (中文(简体) ),
getAmountToSend, (中文(简体) ), getGasFeeOptions, (中文(简体) ), getExtraGasMaxLimits 财务报告和审定财务报表 getAverageTransferTime。 。 。 .
| 通讯员 | 议定书 | 当 |
|---|---|---|
Messenger.CCTP | 圆 CCTP | cctpAddress 定义在源代码和目的符号上 |
Messenger.CCTP_V2 | 圆 CCTP V2 | cctpV2Address 定义在源代码和目的符号上 |
Messenger.OFT | 层零 OFT | oftId 来源和目的地的符号和 oftBridgeAddress 在两个链上定义 |
Messenger.X_RESERVE | x 保存 | xReserve 定义在源代码和目的符号上 |
Messenger.LIFI_INTENTS | LI.FI 意图 | 源代码有 lifiIntents.bridgeAddress 并列出在 lifiIntents.destinations (EVM和索拉纳源链),参见 isLifiIntentsRouteSupported |
Messenger.ALLBRIDGE 财务报告和审定财务报表 Messenger.WORMHOLE 已贬值,不得使用.
import {isLifiIntentsRouteSupported, Messenger} from "@allbridge/bridge-core-sdk";
function getAvailableMessengers(sourceToken: TokenWithChainDetails, destinationToken: TokenWithChainDetails): Messenger[] {
const messengers: Messenger[] = [];
if (sourceToken.cctpAddress && destinationToken.cctpAddress) {
messengers.push(Messenger.CCTP);
}
if (sourceToken.cctpV2Address && destinationToken.cctpV2Address) {
messengers.push(Messenger.CCTP_V2);
}
if (
sourceToken.oftId &&
sourceToken.oftId === destinationToken.oftId &&
sourceToken.oftBridgeAddress &&
destinationToken.oftBridgeAddress
) {
messengers.push(Messenger.OFT);
}
if (sourceToken.xReserve && destinationToken.xReserve) {
messengers.push(Messenger.X_RESERVE);
}
if (isLifiIntentsRouteSupported(sourceToken, destinationToken)) {
messengers.push(Messenger.LIFI_INTENTS);
}
return messengers;
}
getAverageTransferTime 返回时 null 当信使无法在来源链和目的地链之间找到时,
因此,它可以作为额外的检查。 如果选择的路由不支持信使, SDK 方法将丢出
CCTPDoesNotSupportedError, (中文(简体) ), OFTDoesNotSupportedError, (中文(简体) ), LifiIntentsDoesNotSupportedError 或者说 SdkError ( 对于xReserve).
提普: 详情见 示例
CCTP和CCTP V2
本地USDC通过 Circle CCTP 传输.
必须批准的桥梁合同是 token.cctpAddress (CCTP)或 (中文(简体) ) token.cctpV2Address (中文(简体) ).
收费是转移金额的一部分,参见: token.cctpFeeShare 编号 : token.cctpV2FeeShare· ;
使用情况 getAmountToBeReceived 要得到准确的结果.
实例: EVM (CCTP) (英语), (中文(简体) ), EVM( CCTP V2), (中文(简体) ), EVM(CCTP V2,用稳定币支付的煤气费), (中文(简体) ), 索拉纳, (中文(简体) ), 苏
办公室
通过 LayerZero OFT 传输. 不同链条上的指针由 token.oftId。 。 。 .
必须批准的桥梁合同是 oftBridgeAddress 源链.
收费份额由Allbridge核心API为线路提供,
使用情况 getAmountToBeReceived 要得到准确的结果.
实例: 龙, (中文(简体) ), Tron (用马币支付的天然气费)
发觉
通过xReserve协议进行传输. 路线配置在 token.xReserve数字 :
bridgeAddress 是必须批准的合同, feeShare 财务报告和审定财务报表 feeConst 说明收费.
由于收费的固定部分,有最低的转账额;
getAmountToBeReceived 丢出一个 SdkError 如果数额太低,则最低数额.
此信使不支持额外的气体 : getExtraGasMaxLimits 返回零限制.
实例: 堆栈
缩略语( N)
通过LI.FI的转账 意向,一个解析器市场:信使被锁入源链上的代管和a
解决者在秒内向目的地链上的接收者支付. 原生地代币(如ETH)也可以被寄出.
路线配置在 token.lifiIntents数字 : bridgeAddress 是全桥 LifiIntentsBridge 合同
须经批准(土著标志不需要批准), destinations 列出每个链条的目的地符号.
Allbridge核心API的市场价格报价
getAmountToBeReceived 编号 : getAmountToSend 请求引用, sdk.lifiIntents.getQuote 与全桥返回 fee。 。 。 .
引用错误被键入 : LifiIntentsAmountTooLowError (单位:千美元)minAmount, (中文(简体) ), LifiIntentsAmountTooHighError (单位:千美元)maxAmount, (中文(简体) ),
LifiIntentsNoQuoteError 财务报告和审定财务报表 LifiIntentsQuoteError。 。 。 .
订单交易由 Core API 构建,并且是短寿命的(引文对 40-120 s 有效,交易) 在大约10分钟后返回,所以首先批准,然后在签署前立即创建订单:
const messenger = Messenger.LIFI_INTENTS;
if (!(await sdk.bridge.checkAllowance({token: sourceToken, owner: fromAddress, amount, messenger}))) {
const rawTransactionApprove = await sdk.bridge.rawTxBuilder.approve({token: sourceToken, owner: fromAddress, messenger});
// sign and send rawTransactionApprove, wait for it to be mined
}
// creates the order and returns its LifiIntentsBridge call; order.orderId is the transfer id for getTransferStatus
const {rawTransaction, order} = await sdk.lifiIntents.buildSendTransaction({
amount,
fromAccountAddress: fromAddress,
toAccountAddress: toAddress,
sourceToken,
destinationToken,
});
// sign and send rawTransaction at once
bridge.rawTxBuilder.send 与 Messenger.LIFI_INTENTS 进行相同的交易,只返回原始交易.
煤气费为零,额外的煤气不受此信使的支持: getExtraGasMaxLimits 返回零限制.
LI.FI向发送人退还未填单(getTransferStatus 报告 refunded); Allbridge 收费不退.
索拉纳无需批准: buildSendTransaction 返回未签名 VersionedTransaction
(单位:千美元)RawBridgeSolanaTransaction全桥 lifi-intents-bridge 以发件人为付费人和新人的程序
blackash, 签个名,马上寄出去. 索拉纳岛上的收件人是钱包(所有者)地址:解决者支付
相关符名账户.
对索拉纳来说,解答者不创建该账户:没有该账户的收款人的命令不会被填充并被退还. 发送前检查, 请收件人先创建账户( 本地的 SOL 传输不需要 ):
if (!(await sdk.utils.sol.hasTokenAccount(toAddress, destinationToken))) {
// warn: the recipient has no token account for destinationToken on Solana
}
4.1 批准转让令牌(仅用于Evm,Tron)
发信人出道前,桥要经批准使用出道人出道的道具.
这是通过建造 approve 与 SDK 实例交易.
施花者取取之于使者,故曰:"所取之所取也 messenger 需要参数.
如果目前的津贴不是0, 3⁄4 ̄ ̧漯b.
const rawTx = await sdk.bridge.rawTxBuilder.approve({
token: sourceToken,
owner: accountAddress,
messenger: Messenger.CCTP_V2,
});
使用 bridge.checkAllowance 确定批准是否足够:
const isApproved = await sdk.bridge.checkAllowance({
token: sourceToken,
owner: accountAddress,
amount: "1.01",
messenger: Messenger.CCTP_V2,
});
4.2 发送托肯斯
以 send sDK实例中的方法.
const rawTx = await sdk.bridge.rawTxBuilder.send({
amount: "1.01",
fromAccountAddress: fromAddress,
toAccountAddress: toAddress,
sourceToken: sourceToken,
destinationToken: destinationToken,
messenger: Messenger.CCTP_V2,
});
完整实例
使用 CCTP V2 从 ETH 链向 ARB 链发送 USDC
import {
AllbridgeCoreSdk,
ChainSymbol,
Messenger,
nodeRpcUrlsDefault,
RawEvmTransaction,
} from "@allbridge/bridge-core-sdk";
import * as dotenv from "dotenv";
// Utils method
// For more details, see Examples (https://github.com/allbridge-io/allbridge-core-js-sdk/tree/main/examples)
// import { getEnvVar } from "../../../utils/env";
// import { sendEvmRawTransaction } from "../../../utils/web3";
// import { ensure } from "../../../utils/utils";
dotenv.config({path: ".env"});
async function runExample() {
const fromAddress = getEnvVar("ETH_ACCOUNT_ADDRESS"); // sender address
const toAddress = getEnvVar("ARB_ACCOUNT_ADDRESS"); // recipient address
const sdk = new AllbridgeCoreSdk({ ...nodeRpcUrlsDefault, ETH: getEnvVar("WEB3_PROVIDER_URL") });
const chains = await sdk.chainDetailsMap();
const sourceChain = chains[ChainSymbol.ETH];
const sourceToken = ensure(sourceChain.tokens.find((tokenInfo) => tokenInfo.symbol === "USDC"));
const destinationChain = chains[ChainSymbol.ARB];
const destinationToken = ensure(destinationChain.tokens.find((tokenInfo) => tokenInfo.symbol === "USDC"));
const amount = "1.01";
const messenger = Messenger.CCTP_V2;
//check if sending tokens already approved
if (!(await sdk.bridge.checkAllowance({ token: sourceToken, owner: fromAddress, amount, messenger }))) {
// authorize the bridge to transfer tokens from sender's address
const rawTransactionApprove = (await sdk.bridge.rawTxBuilder.approve({
token: sourceToken,
owner: fromAddress,
messenger,
})) as RawEvmTransaction;
const approveTxReceipt = await sendEvmRawTransaction(rawTransactionApprove);
console.log("Approve tx id:", approveTxReceipt.transactionHash);
}
// initiate transfer
const rawTransactionTransfer = (await sdk.bridge.rawTxBuilder.send({
amount: amount,
fromAccountAddress: fromAddress,
toAccountAddress: toAddress,
sourceToken: sourceToken,
destinationToken: destinationToken,
messenger,
})) as RawEvmTransaction;
console.log(`Sending ${amount} ${sourceToken.symbol}`);
const txReceipt = await sendEvmRawTransaction(rawTransactionTransfer);
console.log("tx id:", txReceipt.transactionHash);
}
runExample();
提普: 详情见 实例
其他行动
交易建立器
核准交易
SDK 方法 bridge.rawTxBuilder.approve 可用于创建批准的交易.
const rawTransactionApprove = await sdk.bridge.rawTxBuilder.approve(approveParams);
发送交易
SDK 方法 bridge.rawTxBuilder.send 可用于创建发送交易.
const rawTransactionSend = await sdk.bridge.rawTxBuilder.send(sendParams);
提普: 详情见 *** 实例 页:1
获取已发送交易的信息
SDK 方法 getTransferStatus 可用于获取有关指使转让的信息.
const transferStatus = await sdk.getTransferStatus(chainSymbol, txId);
计算收费后应收取的代币金额
SDK 方法 getAmountToBeReceived 可用于计算接收方之后将获得的令牌数量
使用被选中的使者的连接费.
const amountToBeReceived = await sdk.getAmountToBeReceived(
amountToSend,
sourceToken,
destinationToken,
Messenger.CCTP_V2
);
计算要发送的令牌数量
SDK 方法 getAmountToSend 可用于根据需要的
接收方应获得的标志.
const amountToSend = await sdk.getAmountToSend(
amountToBeReceived,
sourceToken,
destinationToken,
Messenger.CCTP_V2
);
提普: 详情见 示例
获得天然气费
SDK 方法 getGasFeeOptions 允许获取关于支付燃气费的现有方法的信息,
以及完成目的地链转移所需的天然气费数额.
煤气费在 发送 操作
并且可以用源链的货币、源代码或ABR符号支付
(见 gasFeePaymentMethod 内 SendParams) (中文(简体) ).
方法返回具有以下属性的对象:
- 土生土长:以源链货币单位计价的天然气费金额(例如:Ethereum的wei).
- 稳定币 : (可选) 燃气费的金额,以来源代币单位为单位计算. 如果该财产不存在,则表明不存在稳定币支付法.
- abr : (可选) 天然气费,以ABR令牌单位表示.
仅在源链有
abrPayer并且选定的信使可以支付ABR.
const {native, stablecoin, abr} = await sdk.getGasFeeOptions(
usdcOnEthToken, // from ETH
usdcOnArbToken, // to ARB
Messenger.CCTP_V2
);
console.log(native);
// Output:
// {
// int: "10000000000000000",
// float: "0.01" // (0.01 ETH)
// }
console.log(stablecoin);
// Output:
// {
// int: "10010000",
// float: "10.01" // (10.01 USDC)
// }
获得最大额外气体量
额外气体是目的地链通货的又一金额,可以与转账一起交付
(见 extraGas 内 SendParams. SDK 方法 getExtraGasMaxLimits 返回每个气体的最大额外值
气费支付方法,以及可在目的地链上得到的最高金额.
const extraGasLimits = await sdk.getExtraGasMaxLimits(
sourceToken,
destinationToken,
Messenger.CCTP_V2
);
提普: 详情见 示例
获得平均移交时间
SDK 方法 getAverageTransferTime 可以用来获得平均时间,以毫秒计 完成一个
以物配主,以物配主, 回返 null 如果信使在路线上没有得到支持.
const transferTimeMs = sdk.getAverageTransferTime(
sourceToken,
destinationToken,
Messenger.CCTP_V2
);
已知的审计警告
由于依赖 @solana/web3.js软件包 [email protected] 被标记为脆弱.
这种脆弱性在此SDK背景下是无法被利用的,而且没有敏感或用户化的代码依赖于 bigint-buffer 直接说.
我们正在监测上游一揽子计划,以便正式解决.