Skip to main content

CCTP Receive

CCTP enables USDC to be received on Noble from a counterparty chain. At the time of writing, the source chain can be Ethereum, Avalanche, Optimism, or Arbitrum.

High level flow

  • User calls smart contract to burn the tokens on the source chain
  • CCTP relayer observes finalized burn and requests Attestation from Circle Iris API
  • Circle Iris API proves burn and issues attestation
  • CCTP relayer broadcasts the message and attestation to Noble
  • Noble processes the CCTP BurnMessage and mints the token to the Noble recipient

Deposit For Burn

Circle's Deposit For Burn contract includes four function parameters which are highlighted below.

function depositForBurn(
uint256 amount,
uint32 destinationDomain,
bytes32 mintRecipient,
address burnToken,
) external returns (uint64 nonce)

Let's expand on what each of these parameters means:

  • amount - The amount of tokens to transfer (burned on the source chain and minted on Noble)
  • destinationDomain - The domain ID of the destination chain (4 for Noble)
  • mintRecipient - The address of the recipient on the destination chain (Noble account address - 20 bytes left padded with 12 zeroes)
  • burnToken - The address of the contract to burn tokens on the source chain

Encoding

Below you will find a simple script that pads & hex encodes both the destination bech32 prefix and recipient.

The highlighted lines indicate inputs you can change to your specific case.

package main

import (
"encoding/hex"
"fmt"

"github.com/cosmos/cosmos-sdk/types/bech32"
)

const address = "noble14lwerrcfzkzrv626w49pkzgna4dtga8c5x479h"

func main() {
_, rawAddress, _ := bech32.DecodeAndConvert(address)
encodedAddress := Encode(rawAddress)

fmt.Println("ENCODED ADDRESS:", encodedAddress)
}

func Encode(bz []byte) (encoded string) {
padded := make([]byte, 32)
copy(padded[32-len(bz):], bz)

return "0x" + hex.EncodeToString(padded)
}

The output of the exact script above is:

ENCODED ADDRESS: 0x000000000000000000000000afdd918f09158436695a754a1b0913ed5ab474f8

Example

To send 10 USDC from Goerli Ethereum Testnet to Noble, address noble14lwerrcfzkzrv626w49pkzgna4dtga8c5x479h, you would call the following on the Goerli Ethereum Testnet:

depositForBurn(
0x989680, // 10000000uusdc = 10 USDC
0x4, //Noble
0x000000000000000000000000afdd918f09158436695a754a1b0913ed5ab474f8, // noble14lwerrcfzkzrv626w49pkzgna4dtga8c5x479h
0x07865c6E87B9F70255377e024ace6630C1Eaa37F, // USDC on Goerli Ethereum Testnet
)