Skip to main content

SkyBridgeEntryPoint

SkyBridgeEntryPoint is the user-facing contract on every chain. It is deployed as an ERC-1967 / UUPS upgradeable proxy. Per-chain addresses are listed in Official Addresses.

Version: 6.1.2 (constant version on the implementation).


Roles

The EntryPoint has three roles:

Rolebytes32 identifierPurpose
DEFAULT_ADMIN_ROLEbytes32(0)Grant/revoke all roles; set fee, diamond, token messenger, fee collector; add/remove chains; upgrade
PAUSER_ROLEkeccak256("aviator.pauser_role")Call setPaused(true/false)
OPERATOR_ROLEkeccak256("OPERATOR_ROLE")Register/remove OP Standard Bridge L1→L2 token mappings

DEFAULT_ADMIN_ROLE can also call setPaused directly.


Fee model

Every bridge transaction pays a flat fee in native currency (ETH, POL, AVAX, or BNB depending on chain). The fee is set by the admin via setFlatFee(uint256) and readable as flatFee.

Individual tokens can be exempt from the flat fee (setTokenFeeExempt). The effective fee for a given token is returned by getEffectiveFee(address token) (returns 0 if exempt, flatFee otherwise).

CCTP fast route charges an additional percentage fee retained as USDC in the EntryPoint: fastCctpFeeBps basis points (currently 25 = 0.25%). This is separate from the flat native fee.

Accumulated fees are collected permissionlessly by anyone calling collectFees() (ETH) or collectTokenFees(address token) (ERC-20). Both functions sweep the full balance to the feeCollector address (the Fee Safe 0xA953B9DF3b081709eA75895cF5a8fAf7DCC29354). There is no FEE_COLLECTOR_ROLE — fee custody is a stored address, not a role.


Rail routing

Rail 1 — OP Standard Bridge

Forwards ETH or listed ERC-20s to the OP L1StandardBridge on OP-stack L2s (Base, Optimism, Unichain, Soneium, Ink). The contract source comments label this rail "legacy" and recommend CCIP for new integrations, but it remains an available, supported rail.

Key functions:

FunctionDescription
bridgeOPStandardETH(chainId, minGasLimit, extraData)Bridge ETH to an OP-stack L2
bridgeOPStandardETHTo(chainId, to, ...)Bridge ETH to a specific recipient
bridgeOPStandardERC20(chainId, l1Token, amount, ...)Bridge an ERC-20 (must be registered in the L1→L2 token registry)
bridgeOPStandardERC20To(chainId, l1Token, to, ...)Bridge ERC-20 to a specific recipient

The L2 token for each l1Token is resolved from an on-chain registry (opBridgeL2Tokens); the caller cannot specify the L2 token directly.

Routes through the Diamond (BridgeFacet / ERC721BridgeFacet). Works for any CCIP-supported ERC-20 and ERC-721 across all 11 chains.

Key functions:

FunctionReturnsDescription
bridgeCCIP(token, amount, chainSelector, receiver)bytes32 messageIdBridge an ERC-20 via CCIP
bridgeCCIPNativeETH(amount, chainSelector, receiver)bytes32 messageIdBridge native ETH (Diamond wraps to WETH internally; only works on chains with a registered WETH CCIP pool)
bridgeCCIPNFT(token, tokenId, chainSelector, receiver)bytes32 messageIdBridge a single ERC-721
bridgeCCIPNFTBatch(token, tokenIds[], chainSelector, receiver)bytes32 messageIdBridge multiple NFTs from the same collection
getBridgeCCIPQuote(token, amount, chainSelector, receiver)(ccipFee, protocolFee, totalFee)Get fee quote before bridging
getBridgeCCIPNFTQuote(token, tokenId, chainSelector, receiver)(ccipFee, protocolFee, totalFee)Get NFT fee quote

Fee-on-transfer tokens are rejected automatically (pre/post balance check). Blacklisted tokens revert with TokenBlacklisted.

Rail 4 — Circle CCTP

Burns USDC via Circle's TokenMessengerV2 using the Forwarding Service hook, which instructs Circle's relayer to auto-mint on the destination chain.

Key function:

ParameterDescription
tokenUSDC address on this chain
amountTotal USDC (protocol fee deducted before burn on fast route)
destinationDomainCircle CCTP destination domain ID
mintRecipientRecipient (bytes32-padded)
maxFeeMaximum fee for Circle's Forwarding Service market maker
minFinalityThreshold1000 = Fast, 2000 = Standard

The 0.25% fast-route fee is retained as USDC in the EntryPoint (swept later via collectTokenFees(usdc)). burnAmount must exceed maxFee after the deduction.


Chain registry (Rail 1)

OP-stack chain registrations are managed via addChain / updateChain / removeChain (admin). L1→L2 token mappings for Rail 1 are batch-registered via setOpBridgeTokens (operator) and queried via getOpBridgeL2Token(chainId, l1Token).


Upgradeability

_authorizeUpgrade is restricted to DEFAULT_ADMIN_ROLE. The reinitializer(2) slot is reserved for the first post-launch state migration and must not be used for no-op upgrades.


Emergency recovery

Admin-only functions recoverETH, recoverERC20, and recoverERC721 allow retrieving assets stuck in the EntryPoint.