@across-protocol/contracts

中文文档
5.0.28发布于 2026/11/06AGPL-3.0-onlyTypeScriptCommonJS近 30 天下载 2万

Across-logo

中文使用文档
文档目录13 节
  1. 理解可升级性
  2. 已部署的合同版本
  3. 所需资源
  4. 构建
  5. 测试
  6. 林特
  7. 部署和核查
  8. EVM( 视频)
  9. 特别志愿人员
  10. 其他专题
  11. 斯莱特
  12. ZK 同步适配器
  13. 许可证

Across-logo

包含智能合同套件,允许任意两个网络之间的即时令牌传输. 中继器被备份 中央流动资金 HubPool 在埃特鲁姆,它也充当了所有合同的跨链管理人 系统. SpokePool 合同被部署到任何希望产生象征性存款或成为最终存款的网络 代币转让目的地,它们都受 HubPool 在以利他岛.

这些合同一直受到OpenZeppelin的审计,审计报告可以找到 这里。 。 。 .

理解可升级性

SpokePool的合同是 UUPS 可升级 代理合同意味着其地址将永远相同,但其执行代码可以改变.

所有SpokePools可以升级 如果合同的"管理员"呼叫 upgradeTo。通过执行 _requireAdminSender() 虚拟函数 在儿童合同中。 例如这里是 坐标 财务报告和审定财务报表 乐观主义 行政检查的执行情况.

所有的 SpokePool 都得到实施,以至于管理员是 HubPool, 因此我们把 SpokePool 描述为拥有"跨链所有权". 湖宝的主人可以打电话 函数 发送一个跨链执行 upgradeTo 在任何 SpokePool 上进行升级.

这个 脚本 用于创建通过HubPool执行跨链升级的调用数据.

已部署的合同版本

最新合同部署情况见 /broadcast/deployed-addresses.json (自动生成由 yarn extract-addresses) (中文(简体) ).

所需资源

这个寄存器假设你有 节点 已安装,使用CI版本22.23.4或后期的补丁节点22放出. 取决于你打算怎么处理你可能需要的还款 铸造 财务报告和审定财务报表 锁定 也将安装。 如果你有问题,请确保先安装这两个.

如果你还没用过主播 就得跑 avm use latest 还有.

构建

yarn
yarn build # Will build all code. Compile solidity & rust (local toolchain), generate ts outputs
yarn build-verified # Will build all code. Compile solidity & rust (verified docker build), generate ts outputs

EVM 构建和测试使用 Findry 版本 .foundry-version; CI 通过 foundry-rs/foundry-toolchain运行 yarn pin-foundry 切换本地工具链到它( 当它已经关闭时, 不可打开) 页:1 通过编辑文件跳出针.

测试

yarn test # Run all unit tests without gas analysis, using local toolchain SVM build
yarn test-verified # Run all unit tests (without gas analysis) with verified SVM docker build
yarn test:gas-analytics # Run only tests that count gas costs
yarn test:report-gas # Run unit tests with gas reporting enabled
yarn test-evm # Only test EVM code
yarn test-svm # Only test SVM code (local toolchain build)
yarn test-svm-solana-verify # Only test SVM code (verified docker build)

林特

yarn lint
yarn lint-js # Only lint Javascript
yarn lint-rust # Only lint rust
yarn lint-solidity # Only lint solidity
yarn lint-fix

部署和核查

EVM( 视频)

创建

forge build

forge script script/001DeployHubPool.s.sol:DeployHubPool --rpc-url ethereum --broadcast --verify -vvvv

创建( ZKSync)

要启用 ZKSync 支持,必须安装铸币局的 Zksync 叉(参见 这里 说明).

此外 FOUNDRY_PROFILE 环境变量必须设定为 zksync。 。 。 .

FOUNDRY_PROFILE=zksync forge script script/016DeployZkSyncSpokePool.s.sol:DeployZkSyncSpokePool --rpc-url zksync --broadcast --verify -vvvv

或者 yarn forge-script-zksync 命令可用于部署合同.

yarn forge-script-zksync script/016DeployZkSyncSpokePool.s.sol:DeployZkSyncSpokePool --rpc-url zksync --broadcast --verify -vvvv

特别志愿人员

在首次部署之前, 确定所有程序 ID 在内 lib.rs 财务报告和审定财务报表 Anchor.toml 运行时与列表相同 anchor keys list如果没有,请更新,以匹配下方的部署密钥 target/deploy/ 并做出改变.

确保使用可以构建的已验证的嵌入符二进制 :

unset IS_TEST # Ensures the production build is used (not the test feature)
yarn build-svm-solana-verify # Builds verified SVM binaries
yarn generate-svm-artifacts # Builds IDLs

输出所需的环境变量,例如:

export RPC_URL=https://api.devnet.solana.com
export KEYPAIR=~/.config/solana/dev-wallet.json
export PROGRAM=svm_spoke # Also repeat the deployment process for multicall_handler
export PROGRAM_ID=$(cat target/idl/$PROGRAM.json | jq -r ".address")
export MULTISIG= # Export the Squads vault, not the multisig address!
export SOLANA_VERSION=$(grep -A 2 'name = "solana-program"' Cargo.lock | grep 'version' | head -n 1 | cut -d'"' -f2)

初步部署还需要:

export SVM_CHAIN_ID=$(cast to-dec $(cast shr $(cast shl $(cast keccak solana-devnet) 208) 208))
export HUB_POOL=0x14224e63716afAcE30C9a417E0542281869f7d9e # This is for sepolia, update for mainnet
export DEPOSIT_QUOTE_TIME_BUFFER=3600
export FILL_DEADLINE_BUFFER=21600
export MAX_LEN=$(( 2 * $(stat -c %s target/deploy/$PROGRAM.so) )) # Reserve twice the size of the program for future upgrades

初步部署

部署此程序, 并将升级权限设置为多西格 :

solana program deploy \
  --url $RPC_URL \
  --keypair $KEYPAIR \
  --program-id target/deploy/$PROGRAM-keypair.json \
  --max-len $MAX_LEN \
  --with-compute-unit-price 100000 \
  --max-sign-attempts 100 \
  --use-rpc \
  target/deploy/$PROGRAM.so
solana program set-upgrade-authority \
  --url $RPC_URL \
  --keypair $KEYPAIR \
  --skip-new-upgrade-authority-signer-check \
  $PROGRAM_ID \
  --new-upgrade-authority $MULTISIG

更新和承诺 deployments/legacy-addresses.json 与已部署的程序标识和部署槽.

上传IDL并设置升级权限到多相:

anchor idl init \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR \
  --filepath target/idl/$PROGRAM.json \
  $PROGRAM_ID
anchor idl set-authority \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR \
  --program-id $PROGRAM_ID \
  --new-authority $MULTISIG

svm_spoke 还需要在第一次部署时启动和转让所有权:

anchor run initialize \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR -- \
  --chainId $SVM_CHAIN_ID \
  --remoteDomain 0 \
  --crossDomainAdmin $HUB_POOL \
  --svmAdmin $MULTISIG \
  --depositQuoteTimeBuffer $DEPOSIT_QUOTE_TIME_BUFFER \
  --fillDeadlineBuffer $FILL_DEADLINE_BUFFER

创建接受存款的金库, 例如 :

export MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU # This is USDC on devnet, update with address for mainnet
anchor run createVault \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR -- \
  --originToken $MINT

sponsored_cctp_src_periphery 需要初始化,并为支持的刻录符设定最低押金:

# Replace --quoteSigner with actual quote signer address
anchor run initializeSponsoredCctpSrc \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR -- \
  --quoteSigner 0x0000000000000000000000000000000000000000
# Below is USDC on devnet, replace --burnToken with mainnet burn token and --amount with required minimum deposit amount (raw value)
anchor run setMinimumDepositSponsoredCctpSrc \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR -- \
  --burnToken 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU \
  --amount 0

升级

启动程序升级 :

solana program write-buffer \
  --url $RPC_URL \
  --keypair $KEYPAIR \
  --with-compute-unit-price 100000 \
  --max-sign-attempts 100 \
  --use-rpc \
  target/deploy/$PROGRAM.so
export BUFFER= # Export the logged buffer address from the command above
solana program set-buffer-authority \
  --url $RPC_URL \
  --keypair $KEYPAIR \
  $BUFFER \
  --new-buffer-authority $MULTISIG

将程序ID添加到 Squads multisig () 中https://devnet.squads.so/ 用于 devnet 和 https://app.squads.so/ 用于主网),位于开发者/程序段. 然后在缓冲地址中添加升级填充并缓冲退款. 在创建升级后,按要求验证缓冲权限,并着手启动升级. 一旦所有需要的签名者都得到批准,就执行交易部分的升级.

通过写入缓冲器开始IDL升级:

anchor idl write-buffer \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR \
  --filepath target/idl/$PROGRAM.json \
  $PROGRAM_ID
export IDL_BUFFER= # Export the logged IDL buffer address from the command above
anchor idl set-authority \
  --provider.cluster $RPC_URL \
  --provider.wallet $KEYPAIR \
  --program-id $PROGRAM_ID \
  --new-authority $MULTISIG \
  $IDL_BUFFER

构造用于完成IDL升级的多西格交易 。 从以下命令复制已编码的已打印的 Base58 交易, 并将其导入“ 分队多西格” 供批准和执行 :

anchor run squadsIdlUpgrade -- \
  --programId $PROGRAM_ID \
  --idlBuffer $IDL_BUFFER \
  --multisig $MULTISIG \
  --closeRecipient $(solana address --keypair $KEYPAIR)

校验

开始于本地验证已部署的程序是否匹配公共仓库的源代码 :

solana-verify verify-from-repo \
  --url $RPC_URL \
  --program-id $PROGRAM_ID \
   --library-name $PROGRAM \
   --base-image "solanafoundation/solana-verifiable-build:$SOLANA_VERSION" \
  https://github.com/across-protocol/contracts

当被提示时,不要像多西格那样将验证数据上传到区块链上. 继续创建上传交易, 然后导入并签名/ 在 Squads multisig 中执行 :

solana-verify export-pda-tx \
  --url $RPC_URL \
  --program-id $PROGRAM_ID \
  --library-name $PROGRAM  \
  --base-image "solanafoundation/solana-verifiable-build:$SOLANA_VERSION" \
  --uploader $MULTISIG \
  https://github.com/across-protocol/contracts

注意,如果多西格金库没有足够的SOL用于PDA的创建,初始上传交易可能失败. 在这种情况下,在执行上传交易之前,将所需资金转入多西格金库.

最后,将校验结果提交 OtterSec API(只在主网工作):

solana-verify remote submit-job \
  --url $RPC_URL \
  --program-id $PROGRAM_ID \
  --uploader $MULTISIG

其他专题

斯莱特

斯莱特 是用 Python 3 写的固态静态分析框架 。 它运行着一个 成套脆弱性探测器,打印关于合同细节的可视信息,并提供方便撰写的API 习惯分析。 Slither 使开发者能够发现弱点,增强他们的代码理解,并迅速 原型自定义分析.

已使用 [email protected] 没有找到主要错误。 重新运行分析器,运行:

slither contracts/SpokePool.sol
\ --solc-remaps @=node_modules/@
\ --solc-args "--optimize --optimize-runs 1000000"
\ --filter-paths "node_modules"
\ --exclude naming-convention

您可以替换 SpokePool.sol 你要分析的具体合同.

ZK 同步适配器

ZK EVM通常需要特殊的编译器来将固态转换为可以在ZK VM上运行的代码.

关于汇编和部署合同,有特别指示 zksync。汇编命令将创建 artifacts-zk 财务报告和审定财务报表 cache-zk 目录.

编译

这个步骤要求 嵌入桌面 正在运行,作为 solc docker 图像作为先决条件被获取 .

yarn compile-zksync

许可证

此寄存器中的所有代码均根据BUSL-1.1许可,除非文件中有不同规定. 风险实验室可以对许可证作个别例外规定 软件和设计。 如果你有兴趣在衍生作品中使用代码或设计, 自由接触 许可@ risklabs. foundation。 。 。 .

版本与发布记录

@across-protocol/contracts 共发布 154 个版本,首次发布于 2021/12/08;过去 12 个月发布了 86 个版本。

版本发布日期距今
5.0.28latest2026/11/061 天前
6.0.0-beta.4beta2026/10/1523 天前
6.0.0-beta.32026/10/1325 天前
5.0.272026/09/171 个月前
6.0.0-beta.22026/09/121 个月前
5.0.262026/07/313 个月前

其他发布通道:alpha → 5.0.16-alpha.2,beta → 6.0.0-beta.4。

关于 @across-protocol/contracts 的常见问题

如何安装 @across-protocol/contracts?

在项目目录运行 npm install @across-protocol/contracts,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:buffer-layout(^1.2.2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@across-protocol/contracts 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@across-protocol/contracts 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@across-protocol/contracts 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.18.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@across-protocol/contracts 可以商用吗?

@across-protocol/contracts 使用 AGPL-3.0-only 许可。最严格的 Copyleft:除分发外,通过网络向用户提供基于它的服务也需要开源对应源码。闭源 SaaS 使用前务必评估。以上为概括,不构成法律意见,请以许可原文为准。

@across-protocol/contracts 的下载量有多少?

根据 npm 官方下载统计,@across-protocol/contracts 在 2026/10/05 – 2026/11/03 这 30 天内被下载 20,474 次,日均约 682 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@across-protocol/contracts 还在维护吗?

最新版本 5.0.28 发布于 2026/11/06(1 天前);至今共发布 154 个版本,其中过去 12 个月发布了 86 个;首次发布于 2021/12/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。