Skip to main content
Stable uses gUSDT(unwrapped USDT0) as the gas token, so you’ll need gUSDT in your wallet to interact with the chain. First, you need to fund gUSDT to your account using the faucet.
  1. Visit https://faucet.stable.xyz
  2. Click ‘Get gUSDT’ button and 1 gUSDT will be dropped to your wallet.
If you want more gUSDT or USDT0, you can bridge Test USDT from Ethereum Sepolia to Stable testnet.
  1. Visit https://sepolia.etherscan.io/token/0xc4DCC311c028e341fd8602D8eB89c5de94625927#writeContract, and mint desired amount of Test Tether USD to your account by calling the _mint function.
  2. Send the following transaction to the LayerZero bridge contract on Ethereum Sepolia to bridge Test USDT to the Stable testnet:
    export function addrTo32Bytes(addr: string): Buffer {
      const hex20 = ethers.utils.getAddress(addr).slice(2);
      const padded = hex20.padStart(64, "0");      // 32 bytes ⇒ 64 hex
      return Buffer.from(padded, "hex");           // length === 32
    }
    
    async function main() {
      const [owner] = await ethers.getSigners();
    
      const SEPOLIA_USDT0 = "0xc4DCC311c028e341fd8602D8eB89c5de94625927";
      const SEPOLIA_USDT0_OAPP = "0xc099cD946d5efCC35A99D64E808c1430cEf08126"
      const RECEIVER_EID = 40374;
    
      const usdt0 = await ethers.getContractAt("ERC20", SEPOLIA_USDT0);
      await usdt0.approve(SEPOLIA_USDT0_OAPP, ethers.utils.parseEther("1"));
    
      const options = Options.newOptions().addExecutorLzReceiveOption(0, 0).toBytes();
      const amount = ethers.utils.parseEther("1"); // Change this to your desired amount
      const OFTAdapter = await ethers.getContractAt("OFTAdapter", SEPOLIA_USDT0_OAPP);
    
      const sendParams = {
        dstEid: RECEIVER_EID,
        to: addrTo32Bytes(owner.address),
        amountLD: amount,
        minAmountLD: amount,
        extraOptions: options,
        composeMsg: Buffer.from(""),
        oftCmd: Buffer.from(""),
      };
      const fee = await OFTAdapter.quoteSend(sendParams, false);
      await OFTAdapter.send(
        sendParams,
        fee,
        owner.address,
        {
          value: fee.nativeFee,
        }
      )
    }
    
  3. Unwrap testnet USDT0 to gUSDT by calling depositTo function in OStableWrapper contract