Hop Docs
User Docs
Developer Docs
Developer Docs
  • Welcome
  • JavaScript SDK
    • Welcome
    • Getting started
    • API Reference
  • API
    • API Endpoints
  • Hop Node
    • Running a Hop Bonder
      • Bonder Requirements
      • Choosing a Platform
        • EC2 Setup
      • Securing your Server
        • Add SSH 2FA
      • Installing the Bonder
        • Installing the Bonder with Docker (recommended)
      • Configuring the Bonder
        • Keystore
          • Keystore AWS Parameter Store (recommended)
          • Keystore Local Passphrase
        • Configuration
      • Testing the Bonder
      • Running the Bonder
        • Staking
        • Starting the Bonder
      • Next Steps
    • Bonder Options
      • CLI Commands
      • Keystore Options
      • AWS KMS Signer
      • Monitoring
        • Docker CloudWatch Logs
        • Prometheus
      • Running Docker Container Options
      • Contract State
    • Resources and Best Practices
      • Securing Cloud Instance
      • Additional Security & Node Best Practices
      • Additional questions
  • Subgraphs
    • Welcome
    • Entities
    • Queries
    • Subgraph Info
  • Smart Contracts
    • Welcome
    • Integration
    • Contract Addresses
  • Fees
    • Fee Calculation
  • RPC
    • RPC Endpoints
  • Other
    • Assets
    • On the web
    • FAQ
Powered by GitBook
On this page
  • L1->L2
  • L2->L1 and L2->L2
  • L2 hTokens->L2 or L2 hTokens -> L1
  • Sending ETH vs Token
  • swapAndSend vs send
  • Calling Hop from smart contract for transfers
  • AMM Deposit
  • AMM Withdraw
  • Contract addresses
  • Calculating Bonder Fee
  • Getting transfer status
Edit on GitHub
  1. Smart Contracts

Integration

Smart contract integration

Last updated 1 year ago

L1->L2

To send funds L1->L2, call the sendToL2 on the L1 Bridge contract:

The relayer and relayerFee are required for most routes. You can get these values from the Hop SDK.

sendToL2(
    uint256 chainId,
    address recipient,
    uint256 amount,
    uint256 amountOutMin,
    uint256 deadline,
    address relayer,
    uint256 relayerFee
)

L2->L1 and L2->L2

To send funds L2->L1 or L2->L2, call the swapAndSend on the L2 AMM Wrapper contract:

swapAndSend(
    uint256 chainId,
    address recipient,
    uint256 amount,
    uint256 bonderFee,
    uint256 amountOutMin,
    uint256 deadline,
    uint256 destinationAmountOutMin,
    uint256 destinationDeadline
)

Note: Do not set destinationAmountOutMin and destinationDeadline when sending to L1 because there is no AMM on L1, otherwise the computed transferId will be invalid and the transfer will be unbondable. These parameters should be set to 0 when sending to L1.

L2 hTokens->L2 or L2 hTokens -> L1

send(
    uint256 chainId,
    address recipient,
    uint256 amount,
    uint256 bonderFee,
    uint256 amountOutMin,
    uint256 deadline
)

Note: There are no hTokens on L1 so sending L2 hUSDC to L1 means you'll receive USDC on L1.

Note: Do not set amountOutMin and deadline when sending to L1 because there is no AMM on L1, otherwise the computed transferId will be invalid and the transfer will be unbondable. These parameters should be set to 0 when sending to L1.

Sending ETH vs Token

When sending native asset from source chain (ie ETH on Ethereum, Optimism, Arbitrum, or XDAI on Gnosis Chain, or MATIC on Polygon), set the transaction value to match the amount parameter.

swapAndSend vs send

swapAndSend (on L2 AMM Wrapper) on the source chain swaps your canonical token (eg USDC) to hTokens (eg hUSDC) and burns the hTokens and then you receive the canonical tokens (eg USDC) on the destination chain.

send on (on L2 Bridge) is for only dealing with hTokens. The send method on the source chain takes your hTokens (ie hUSDC), burns the hTokens and then you receive hTokens (eg hUSDC) on the destination chain.

swapAndSend is what you'd want to use most of the time since the canonical tokens are what users are interested in.

Calling Hop from smart contract for transfers

Some good examples you can check out as a reference are:

AMM Deposit

Swap.addLiquidity(
    amounts, // array of amounts of tokens to LP, should be an array of 2 elements containing the amount of canonical tokens and h-tokens, e.g. ['100000000', '0'],
    minToMint, // min amount of LP tokens to receive,
    deadline // e.g. use 10 minutes from now in unix seconds
)

AMM Withdraw

Swap.removeLiquidityOneToken(
    tokenAmount, // amount of LP tokens to burn
    tokenIndex, // token to receive; use 0 for canonical token, use 1 for h-token
    minAmount, // minimum amount to receive
    deadline // e.g. use 10 minutes from now in unix seconds
)

Contract addresses

The L1 Bridge addresses, L2 Bridge addresses, L2 AMM wrapper addresses, AMM addresses (Saddle Swap contracts), and other Hop contract addresses can be found on this link:

Calculating Bonder Fee

Getting transfer status

To send hTokens L2->L2 or hTokens L2->L1, call the send on the L2 Bridge contract:

DSA connector contracts ()

bridge aggregator contracts ()

bridge aggregator contracts ()

Use the method on the Swap contract.

Use the method on the Swap contract. You can also use the method to receive proportional canonical tokens and h-tokens.

There's a REST API you can use to get estimated bonder fee. See .

There's a REST API you can use to get transfer status. See .

method
method
method
InstaDapp
helpers.sol
movr
Hop.sol
LI.FI
HopFacet.sol
addLiquidity
removeLiquidityOneToken
removeLiquidity
Contract Addresses
API docs
API Endpoints
API docs
API Endpoints