Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Cross-chain bridge and multi-chain development expertise. Supports LayerZero, Chainlink CCIP, Wormhole, and Axelar for omnichain messaging, token bridging, and cross-chain state verification.
.claude/skills/a5c-ai-cross-chain/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 115% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 106% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 93% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 121% | 0% |
Expert cross-chain bridge development and multi-chain integration.
solidity// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol"; contract MyOFT is OFT { constructor( string memory _name, string memory _symbol, address _lzEndpoint, address _delegate ) OFT(_name, _symbol, _lzEndpoint, _delegate) { _mint(msg.sender, 1000000 * 10 ** decimals()); } }
solidityimport { OApp } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppReceiver.sol"; contract CrossChainCounter is OApp { uint256 public count; constructor(address _endpoint, address _owner) OApp(_endpoint, _owner) {} function increment( uint32 _dstEid, bytes calldata _options ) external payable { bytes memory payload = abi.encode(count + 1); _lzSend( _dstEid, payload, _options, MessagingFee(msg.value, 0), payable(msg.sender) ); count++; } function _lzReceive( Origin calldata _origin, bytes32 _guid, bytes calldata _message, address _executor, bytes calldata _extraData ) internal override { uint256 newCount = abi.decode(_message, (uint256)); count = newCount; } }
typescript// hardhat.config.ts LayerZero setup import { EndpointId } from "@layerzerolabs/lz-definitions"; const config = { networks: { ethereum: { url: process.env.ETHEREUM_RPC, accounts: [process.env.PRIVATE_KEY], }, arbitrum: { url: process.env.ARBITRUM_RPC, accounts: [process.env.PRIVATE_KEY], }, }, layerZero: { ethereum: { eid: EndpointId.ETHEREUM_V2_MAINNET, endpoint: "0x1a44076050125825900e736c501f859c50fE728c", }, arbitrum: { eid: EndpointId.ARBITRUM_V2_MAINNET, endpoint: "0x1a44076050125825900e736c501f859c50fE728c", }, }, };
solidityimport {IRouterClient} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol"; import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract CCIPTokenTransfer { IRouterClient public router; address public linkToken; constructor(address _router, address _link) { router = IRouterClient(_router); linkToken = _link; } function transferTokens( uint64 destinationChainSelector, address receiver, address token, uint256 amount ) external returns (bytes32 messageId) { Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); tokenAmounts[0] = Client.EVMTokenAmount({ token: token, amount: amount }); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(receiver), data: "", tokenAmounts: tokenAmounts, extraArgs: "", feeToken: linkToken }); uint256 fee = router.getFee(destinationChainSelector, message); IERC20(linkToken).approve(address(router), fee); IERC20(token).approve(address(router), amount); messageId = router.ccipSend(destinationChainSelector, message); } }
solidityimport {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol"; import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; contract CCIPReceiver is CCIPReceiver { event MessageReceived(bytes32 messageId, bytes data); constructor(address router) CCIPReceiver(router) {} function _ccipReceive( Client.Any2EVMMessage memory message ) internal override { emit MessageReceived(message.messageId, message.data); // Process message (string memory text) = abi.decode(message.data, (string)); // Handle the message... } }
solidityinterface IWormholeTokenBridge { function transferTokens( address token, uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce ) external payable returns (uint64 sequence); function completeTransfer(bytes memory encodedVm) external; } contract WormholeBridge { IWormholeTokenBridge public bridge; function bridgeTokens( address token, uint256 amount, uint16 targetChain, address recipient ) external payable { IERC20(token).transferFrom(msg.sender, address(this), amount); IERC20(token).approve(address(bridge), amount); bytes32 recipientBytes = bytes32(uint256(uint160(recipient))); bridge.transferTokens{value: msg.value}( token, amount, targetChain, recipientBytes, 0, uint32(block.timestamp) ); } }
soliditycontract RateLimitedBridge { uint256 public constant RATE_LIMIT = 1000000 * 1e18; uint256 public constant RATE_PERIOD = 1 hours; uint256 public currentPeriodStart; uint256 public currentPeriodTransferred; modifier rateLimited(uint256 amount) { if (block.timestamp >= currentPeriodStart + RATE_PERIOD) { currentPeriodStart = block.timestamp; currentPeriodTransferred = 0; } require( currentPeriodTransferred + amount <= RATE_LIMIT, "Rate limit exceeded" ); currentPeriodTransferred += amount; _; } }
soliditycontract CircuitBreakerBridge { bool public paused; address public guardian; uint256 public pauseThreshold; modifier notPaused() { require(!paused, "Bridge paused"); _; } function pause() external { require(msg.sender == guardian, "Only guardian"); paused = true; } function unpause() external { require(msg.sender == guardian, "Only guardian"); paused = false; } function emergencyWithdraw( address token, address to, uint256 amount ) external { require(msg.sender == guardian, "Only guardian"); require(paused, "Must be paused"); IERC20(token).transfer(to, amount); } }
soliditycontract VerifiedBridge { mapping(bytes32 => bool) public processedMessages; mapping(uint256 => uint256) public chainConfirmations; function processMessage( bytes32 messageHash, bytes[] calldata signatures, uint256 sourceChain ) external { require(!processedMessages[messageHash], "Already processed"); require( verifySignatures(messageHash, signatures), "Invalid signatures" ); processedMessages[messageHash] = true; // Process the message... } function verifySignatures( bytes32 messageHash, bytes[] calldata signatures ) internal view returns (bool) { // Verify threshold signatures from validators uint256 validSigs = 0; for (uint i = 0; i < signatures.length; i++) { address signer = recoverSigner(messageHash, signatures[i]); if (isValidator(signer)) { validSigs++; } } return validSigs >= threshold; } }
typescript// TypeScript finality handling const CHAIN_FINALITY = { ethereum: { blocks: 32, time: 384 }, // 384 seconds for finality arbitrum: { blocks: 1, time: 0 }, // Inherits ETH security optimism: { blocks: 1, time: 0 }, // Inherits ETH security polygon: { blocks: 256, time: 512 }, // ~8.5 minutes bsc: { blocks: 15, time: 45 }, // ~45 seconds avalanche: { blocks: 1, time: 2 }, // 2 seconds }; async function waitForFinality(chainId: number, txHash: string) { const finality = CHAIN_FINALITY[chainId]; const receipt = await provider.getTransactionReceipt(txHash); while (true) { const currentBlock = await provider.getBlockNumber(); if (currentBlock - receipt.blockNumber >= finality.blocks) { return receipt; } await sleep(1000); } }
| Process | Purpose | |---------|---------| | cross-chain-bridge.js | Bridge development | | blockchain-node-setup.js | Multi-chain infra | | multi-signature-wallet.js | Cross-chain multisig |
skills/solidity-dev/SKILL.md - Contract developmentagents/bridge-architect/AGENT.md - Bridge expert| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,581 | 16,561 | -15% | 1 | 1 | 0% | 3,922 | 6,203 | +58% | 0 | 0 | — |
case-02 | fail→pass | 11,010 | 6,410 | -42% | 1 | 1 | 0% | 1,986 | 4,261 | +115% | 0 | 0 | — |
case-03 | pass→pass | 17,545 | 19,467 | +11% | 1 | 1 | 0% | 3,537 | 6,829 | +93% | 0 | 0 | — |
case-04 | fail→fail | 10,249 | 11,159 | +9% | 1 | 1 | 0% | 2,036 | 5,164 | +154% | 0 | 0 | — |
case-05 | pass→pass | 9,336 | 6,836 | -27% | 1 | 1 | 0% | 1,956 | 4,316 | +121% | 0 | 0 | — |
case-06 | pass→pass | 14,805 | 10,394 | -30% | 1 | 1 | 0% | 3,336 | 5,126 | +54% | 0 | 0 | — |
case-07 | pass→pass | 11,049 | 11,615 | +5% | 1 | 1 | 0% | 2,521 | 5,534 | +120% | 0 | 0 | — |
case-08 | pass→pass | 14,958 | 13,352 | -11% | 1 | 1 | 0% | 3,359 | 6,127 | +82% | 0 | 0 | — |
case-09 | pass→pass | 26,193 | 8,638 | -67% | 1 | 1 | 0% | 2,693 | 4,539 | +69% | 0 | 0 | — |
case-10 | fail→fail | 15,753 | 11,560 | -27% | 1 | 1 | 0% | 3,335 | 5,336 | +60% | 0 | 0 | — |
case-11 | pass→pass | 17,349 | 13,753 | -21% | 1 | 1 | 0% | 3,587 | 5,611 | +56% | 0 | 0 | — |
case-12 | pass→pass | 7,474 | 3,148 | -58% | 1 | 1 | 0% | 1,515 | 3,520 | +132% | 0 | 0 | — |
case-13 | pass→pass | 14,019 | 7,088 | -49% | 1 | 1 | 0% | 2,163 | 4,295 | +99% | 0 | 0 | — |
case-14 | fail→pass | 12,434 | 8,693 | -30% | 1 | 1 | 0% | 2,553 | 4,581 | +79% | 0 | 0 | — |
case-15 | pass→pass | 7,993 | 1,911 | -76% | 1 | 1 | 0% | 1,455 | 3,182 | +119% | 0 | 0 | — |
case-16 | pass→pass | 6,568 | 1,541 | -77% | 1 | 1 | 0% | 985 | 2,997 | +204% | 0 | 0 | — |
case-17 | pass→pass | 10,564 | 1,804 | -83% | 1 | 1 | 0% | 1,825 | 3,130 | +72% | 0 | 0 | — |
case-18 | fail→pass | 9,039 | 2,426 | -73% | 1 | 1 | 0% | 1,531 | 3,157 | +106% | 0 | 0 | — |
case-19 | pass→pass | 9,431 | 4,581 | -51% | 1 | 1 | 0% | 2,001 | 3,738 | +87% | 0 | 0 | — |
case-20 | pass→pass | 20,361 | 30,583 | +50% | 1 | 1 | 0% | 5,024 | 6,110 | +22% | 0 | 0 | — |
case-21 | pass→pass | 12,553 | 9,273 | -26% | 1 | 1 | 0% | 2,662 | 4,971 | +87% | 0 | 0 | — |
case-22 | pass→pass | 10,542 | 12,938 | +23% | 1 | 1 | 0% | 2,104 | 5,419 | +158% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.