UPD — Universal Private Dollar

SDK Quickstart

Install the UPD SDK, get a quote, mint UPD, and burn UPD.

Testnet Only

UPD is currently deployed on testnet. Do not use with real funds.

Installation

npm install @permissionless-technologies/upd-sdk

Setup

import { createUPDClient } from '@permissionless-technologies/upd-sdk'
import { createPublicClient, createWalletClient, http } from 'viem'
import { sepolia } from 'viem/chains'

const publicClient = createPublicClient({ chain: sepolia, transport: http() })
const walletClient = createWalletClient({ chain: sepolia, transport: http() })

const upd = createUPDClient({
  publicClient,
  walletClient,
  chainId: sepolia.id,
})

Get a Quote

Before minting, check how much UPD you'll receive for your ETH:

import { quoteMintUPD } from '@permissionless-technologies/upd-sdk/core'

// Get current ETH price and compute quote
const { ethPrice, updAmount, fee } = await upd.quoteMint({
  ethAmount: parseEther('1.0'),
})

console.log(`1 ETH → ${formatUnits(updAmount, 18)} UPD at $${ethPrice}/ETH`)

Mint UPD

Deposit ETH (converted to stETH) to mint UPD:

// Mint UPD by depositing ETH
const { txHash, updMinted } = await upd.mint({
  ethAmount: parseEther('1.0'),
  minUpdOut: updAmount * 99n / 100n, // 1% slippage tolerance
})

console.log(`Minted ${formatUnits(updMinted, 18)} UPD`)

Burn UPD

Redeem UPD to receive stETH:

// Get quote for burn
const { stEthAmount } = await upd.quoteBurn({
  updAmount: parseUnits('1000', 18),
})

// Burn UPD to receive stETH
const { txHash, stEthReceived } = await upd.burn({
  updAmount: parseUnits('1000', 18),
  minStEthOut: stEthAmount * 99n / 100n,
})

Check Balances

const updBalance = await upd.getUPDBalance(myAddress)
const collateralInfo = await upd.getCollateralInfo()

console.log('UPD balance:', formatUnits(updBalance, 18))
console.log('Collateralization ratio:', collateralInfo.ratio.toString() + '%')

React Integration

import { UPDProvider, useUPD, useCollateral } from '@permissionless-technologies/upd-sdk/react'

function App() {
  return (
    <UPDProvider chainId={11155111}>
      <UPDStats />
    </UPDProvider>
  )
}

function UPDStats() {
  const { balance, isLoading } = useUPD()
  const { ratio, totalCollateral } = useCollateral()

  if (isLoading) return <div>Loading...</div>

  return (
    <div>
      <p>Your UPD balance: {formatUnits(balance, 18)} UPD</p>
      <p>System collateralization: {ratio.toString()}%</p>
    </div>
  )
}

Next Steps

On this page