Development package for the Fast USDC product. Here in agoric-sdk as a convenience for integration testing and iterating on the SDK affordances required for the product.
This package is meant to contain all the code for the Fast USDC product. However, there are some constraints:
a3p-integration top-level package, separate
from this workspace@agoric/builders to work with the
a3p-integration build:submissions script@aglocal/boot to test running them atop a fresh
bootstrapped environmentOver time we can update our tooling to decouple this more from the packages directory.
build:submissions script work with arbitrary builder
paths, allowing this to be above @agoric/builders in the package graph@aglocal/boot, allowing this to be
above @aglocal/boot in the package graphpackages/, eg. a top-level
dapps directory. multichain-testing does this now but not organized per contract.sequenceDiagram
  actor User as User
  participant NEA as User Wallet
[Browser]
  participant ETH as CCTP Contract
[Ethereum]
  participant NFA as Noble Forwarding Account
[Noble]
  participant NC as Noble Chain
[Noble]
  participant NAR as Noble-Agoric
[IBC Relayer]
  participant SA as Settlement Account
[Agoric]
  participant CFA as Contract Fee Account
[Agoric]
  participant DAR as Destination-Agoric
[IBC Relayer]
  participant EUD as End User Destination
[Dest Chain]
  autonumber
  rect rgb(240, 248, 255)
    User ->> NEA: Sign transaction
(MintAmount, to NFA)
    NEA ->> ETH: Submit USDC Burn Txn via CCTP
  end
  rect rgb(200, 255, 230)
    FUC ->> P: Initiate PFM transfer(AdvanceAmount, EUD) from pool
of Noble-Agoric tokens to EUD Chain
    P ->> NC: PFM transfer(AdvanceAmount of Agoric USDC denom) to EUD
    NC ->> EUD: deliver AdvanceAmount as final USDC denom
  end
  Note over User, EUD: User got their AdvanceAmountof IBC USDC
UX COMPLETE
  rect rgb(255, 200, 200)
    Note over ETH, SA: Minting Process
    Note over ETH: ~12 minutes for Ethereum finality
    Note over NC: 1-6 minutes for CCTP
to Mint on Noble
    NC ->> NFA: Noble CCTP contract mints USDC
 into Noble Forwarding Address
    NFA ->> NAR: Broadcast Forward MintAmount (as Agoric USDC Denom) to FU Account
    NAR ->> SA: Relay    
  end
  rect rgb(255, 245, 230)
    Note over FUC, CFA: Settlement Process
    alt Advance was started:
      FUC ->> SA: Initiate transfers out of settlement
      SA ->> P: Deposit the AdvanceAmount + PoolFee (= MintAmount - ContractFee)
      SA ->> CFA: Deposit ContractFee
    else Advance for matched transaction that has not yet started:
      P ->> NC: PFM transfer(MintAmount of Agoric USDC denom) to EUD
      NC ->> EUD: deliver MintAmount as final USDC denom
    else Settlement for unknown transaction:
      Note over SA: Leave funds in SettlementAccount.
      Note over SA: Wait for observation from watcher
    end
  end
Not pictured:
"Noble Forwarding Account" is also owned by the CCTP Relayer as they actually register it CCTP Relayer can be many parties, but only one when caller is specified
%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#f0f8ff',
    'primaryTextColor': '#2c3e50',
    'primaryBorderColor': '#7fb2e6',
    'lineColor': '#7fb2e6',
    'secondaryColor': '#f6f8fa',
    'tertiaryColor': '#fff5e6'
  }
}}%%
sequenceDiagram
    title Fast USDC Transaction Process
    autonumber
    actor User
    %% [Where it runs]
    participant NEA as Noble Express app
[Browser]
    participant ETH as CCTP Contract
[Ethereum]
    participant NFA as Noble Forwarding Account
[Noble]
    participant NC as Noble Chain
[Noble]
    participant NAR as Noble-Agoric
[Relayer]
    participant OCW as Eth Watcher
[Off-chain]
    participant FUC as Fast USDC Contract
[Agoric]
    participant P as Pool
[Agoric]
    participant SA as Settlement Account
[Agoric]
    participant CFA as Contract Fee Account
[Agoric]
    participant DAR as Destination-Agoric
[Relayer]
    participant EUD as End User Destination
[User]
    %% Notation: --> for async, ->> for sync
    rect rgb(240, 248, 255)
        Note over User,OCW: User request
        Note over NEA: App looks up fees and SettlementAccount address
        User->>NEA: Input desired MintAmount and EUD
        NEA->>User: Display fees and AdvanceAmount
        Note over NEA: Calculate VirtualRecipient from (SettlementAccount, EUD)
        Note over NEA: Calculate NFA address from (VirtualRecipient) using Signerless forwarding
        %% Getting from here to the burn is mostly up to Noble
        User->>NEA: Initiate transfer
        NEA-->>NC: Register NFA
        NEA->>User: Request signature
        User->>NEA: Sign transaction
(MintAmount, to NFA) 
        NEA->>ETH: Submit USDC Burn Txn via CCTP
        Note over ETH: Burn succeeds,
implying mint to NFA will happen
        OCW->>ETH: Query CCTP transactions to Noble
        ETH-->>OCW: 1 block confirmed
        OCW->>NC: Look up recipient of NFA
by account query
        NC->>OCW: RPC replies with account including `recipient` (LCA+EUD)
    end
    Note over OCW: Continue if recipient is over the Noble-Agoric channel
    rect rgb(200, 255, 230)
        Note over NC,EUD: Advancement Process
        Note over OCW: Log proof of each confirmation
        Note over OCW,FUC: Provide info needed by policy to make a decision
        OCW->>FUC: Notify of each confirmation
(dest=agoric1 recipient, amount,
metadata=transaction-nonce,chain,block,timestamp)
        Note over FUC: MM's policy decides whether to advance (e.g. 2 confirmations from Ethereum, 5 from Polygon)
        Note over FUC: Syslog with sufficient detail to debug
        Note over FUC: calculate AdvanceAmount = (MintAmount – PoolFee - ContractFee)
based on fee rates at this moment, and record for future lookup
        FUC->>P: Initiate PFM transfer(AdvanceAmount, EUD) from pool
of Noble-Agoric tokens to EUD Chain
        P->>NC: PFM transfer(AdvanceAmount of Agoric USDC denom) to EUD
        NC->>EUD: deliver AdvanceAmount as final USDC denom
        %% TODO do need epsilon tolerance on MintAmount for if Noble takes a small cut of the minted amount
        %% TODO map out the event handling for these states: START: only-observed,advance-started,received-minted-unobserved, END: done
        Note over SA: Wake up the settlement process to handle observed (key=EUD,MintAmount)
    end
    Note over User,EUD: User got their AdvanceAmountof IBC USDC
UX COMPLETE
    rect rgb(255, 200, 200)
        Note over ETH,SA: Minting Process
        Note over ETH: ~12 minutes for Ethereum finality
        Note over NC: 1-6 minutes for CCTP
to Mint on Noble
        NC->>NFA: Noble CCTP contract mints USDC
 into Noble Forwarding Address
        NFA->>SA: Forward MintAmount (as Agoric USDC Denom) to FU Account
    end
    rect rgb(255, 245, 230)
        Note over FUC,CFA: Settlement Process
        Note over FUC,SA: Tap on account reads MintAmount,
parses EUD from virtual address recipient
and looks up AdvanceAmount,PoolFee,ContractFee.
Matches against an unsettled transaction (by EUD and approx amount).
        %% Treat starting the advance as an atomic action. Assume it will complete once started.
        alt Advance was started:
            FUC->>SA: Initiate transfers out of settlement
            SA->>P: Deposit the AdvanceAmount + PoolFee (= MintAmount - ContractFee)
            SA->>CFA: Deposit ContractFee
        else Advance for matched transaction that has not yet started:
            P->>NC: PFM transfer(MintAmount of Agoric USDC denom) to EUD
            NC->>EUD: deliver MintAmount as final USDC denom
        else Settlement for unknown transaction:
            %% Have not received notification of this Amount,EUD from the watcher
            Note over SA: Leave funds in SettlementAccount.
            Note over SA: Wait for observation from watcher
        end
    end