Circle USYC 백서

Circle USYC

원문

bitpro가 원문에서 글자만 모은 내용이에요. 표·그림·수식은 빠지거나 깨질 수 있어요. 전체 75쪽 중 73쪽

as an onramp) is the process of depositing fiat currency and receiving an equivalent amount of stablecoins. When you send a fiat transfer to Circle, Circle credits your Mint account balance with the corresponding stablecoin amount at a 1:1 ratio. The minting flow works as follows: 1. You initiate a fiat transfer from your linked bank account to Circle. 2. Circle receives the fiat deposit and credits your Mint account balance. 3. The stablecoins become available for onchain transfers or other operations. Circle supports multiple payment rails for fiat deposits, including standard wires (FedWire and SWIFT), real-time interbank rails (RTP, SPEI, SEPA, and CHATS) in supported regions, and book transfers when you bank with one of Circle's settlement partners. Rail availability depends on your region and the currency you are depositing. **Settlement timing:** Domestic wire deposits received before the daily cutoff settle on the same business day. Real-time interbank rails settle in seconds, subject to network operating hours and transaction limits. International wires take 1-3 business days depending on intermediary banks. In the sandbox environment, mock wire deposits process in batches and may take up to 15 minutes. For step-by-step instructions, see [Deposit Fiat](/circle-mint/howtos/deposit-fiat). ## Redemption Redemption (also known as an offramp) is the reverse of minting. You convert stablecoins back to fiat currency by creating a payout to a linked bank account. The redemption flow works as follows: 1. You create a payout request specifying the amount and destination bank account. 2. Circle debits the stablecoin amount from your Mint account balance. 3. Circle sends a fiat transfer to your bank account using the appropriate rail for your region and bank. **Settlement timing:** Payouts typically settle on the next business day. In some cases, your bank may reject the incoming wire, resulting in a returned withdrawal. If a payout is returned, the funds are credited back to your Mint account balance. For step-by-step instructions, see [Withdraw Fiat](/circle-mint/howtos/withdraw-fiat). ## Account structure Your Circle Mint account has several key components that work together to support minting, redemption, and onchain transfers. ### Primary wallet Every Circle Mint account has a primary wallet identified by a `masterWalletId`. You retrieve this identifier from the `/v1/configuration` endpoint. The primary wallet serves as the source for outbound transfers and the destination for inbound deposits. ### Balances Your account maintains two types of balances: * **Available balance:** Settled funds you can transfer or redeem immediately. * **Unsettled balance:** Funds that are in transit and not yet available. Wire deposits appear as unsettled until they clear. ### Linked bank accounts You register external bank accounts to send and receive fiat. Each linked bank account receives a unique Virtual Account Number (VAN). When you wire funds to Circle using the VAN, Circle attributes the deposit to your account without requiring a tracking reference in the payment instruction. ### Deposit addresses Circle generates one deposit address per blockchain for your account. These addresses receive inbound stablecoin transfers from external wallets. You retrieve your deposit addresses through the API for each [supported blockchain](/circle-mint/references/supported-chains-and-currencies). ### Recipient addresses Recipient addresses are external blockchain addresses that you register and allowlist for outbound transfers. You must create a recipient address before you can send stablecoins to it. This allowlisting step provides an additional layer of security for outbound transfers. ## Onchain transfers Circle Mint supports both receiving and sending stablecoins onchain. * **Receiving:** External wallets send USDC or EURC to your deposit address on any supported blockchain. Circle detects the transfer and credits your account after the required number of [blockchain confirmations](/circle-mint/references/blockchain-confirmations). * **Sending:** You create a transfer to a registered recipient address. Circle debits your balance and broadcasts the transaction onchain. ### Transfer status lifecycle Onchain transfers progress through the following statuses: | Status | Description | | - | - | | `pending` | The transfer request is created but not yet broadcast onchain. | | `running` | The transaction is broadcast and awaiting blockchain confirmations. | | `complete` | The required confirmations are reached and the transfer is final. | For details on confirmation requirements per blockchain, see [Blockchain confirmations](/circle-mint/references/blockchain-confirmations). For step-by-step transfer instructions, see [Transfer USDC Onchain](/circle-mint/howtos/transfer-on-chain). ## Network fees Circle covers gas fees for outbound stablecoin transfers in most cases. You do not need to hold the native token of each blockchain to send USDC or EURC from your Mint account. ## Travel Rule compliance Transfers of \$3,000 or more in value on supported blockchains are subject to the FinCEN Travel Rule, which requires identity data about the originator of the transaction. How Circle handles the identity requirement depends on the type of transfer: * **Business account transfers:** Circle uses your company's identity stored on file. You do not need to include identity data in each request. * **Third-party payouts:** If you send funds on behalf of someone else, you must provide the originator's identity (name and address) in the payout request. Omitting required identity data causes the transfer to fail. For the full list of supported blockchains and implementation details, see [Travel Rule compliance](/circle-mint/howtos/transfer-on-chain#travel-rule-compliance). ## Approval workflows Customers in France and Singapore are subject to additional recipient address verification requirements. Before an outbound transfer can proceed, the recipient address must be verified through the [Mint Console](https://app.circle.com/signin). This approval step ensures compliance with local regulatory requirements in those jurisdictions. # Institutional API Source: https://developers.circle.com/circle-mint/concepts/institutional-api Understand how the Institutional API lets Circle Mint distributors mint, redeem, and transfer on behalf of compliance-screened external entities with their own per-entity wallets. The Institutional API is for Circle Mint customers with the institutional entitlement (Distributors) who operate fiat-to-stablecoin flows on behalf of their own institutional end clients. It lets you onboard those end clients as external entities, screen them through Circle compliance, and then mint, redeem, and transfer USDC on their behalf. Each entity gets its own dedicated wallet so balances and money movement stay segregated by counterparty. ## Why use the Institutional API Without the Institutional API, every counterparty that needs to mint or redeem through Circle would have to onboard as a direct Circle Mint customer. The Institutional API solves that by letting one Distributor's Mint account act as the integration surface for many institutional end clients. Circle still runs compliance on each external entity, but the Distributor—not the end client— holds the API key and runs the integration. The API is intended for B2B2B Distributors servicing institutional end clients, such as: * Commercial banks * Institutional banks * Centralized exchanges * Custodians * TradFi trading platforms * Real-world asset (RWA) platforms Retail-only use cases and internal-only flows do not require the Institutional API. ## Distributor and external entity The Institutional API revolves around two roles. The Distributor is the Circle Mint customer; the external entity is the Distributor's institutional end client. Each role has a different relationship to Circle and to the API. | Aspect | Distributor | External entity | | - | - | - | | Role | The Circle Mint customer integrating the Institutional API. | The Distributor's institutional end client. | | API access | Holds the API key and authenticates all requests. | Never accesses the Circle Mint API directly. | | Wallet | Owns a primary wallet identified by `masterWalletId`, used as the default source and destination when no entity wallet is specified. | Receives a dedicated subaccount wallet (type `end_user_wallet`) after Circle accepts the entity in compliance. | | Identity | Calls [`POST /v1/externalEntities`](/api-reference/circle-mint/institutional/create-external-entity) to onboard each external entity. | Identified by `businessName`, `businessUniqueIdentifier` (tax ID), `identifierIssuingCountryCode`, and `address` submitted by the Distributor. | | Money movement | Initiates mints, redemptions, and onchain transfers on behalf of each accepted entity. | Funds flow through the entity's `walletId`; the entity itself does not call Circle APIs. | ## Compliance lifecycle Every call to [`POST /v1/externalEntities`](/api-reference/circle-mint/institutional/create-external-entity) triggers a synchronous sanctions screening on the entity's business name, tax ID (`businessUniqueIdentifier`), issuing country code, and address. The 201 response returns the entity in `complianceState: PENDING` along with the provisioned `walletId`. The final decision—`ACCEPTED` or `REJECTED`—is delivered asynchronously through the `externalEntities` webhook topic. ```mermaid theme={null} sequenceDiagram participant D as Distributor participant C as Circle participant W as Distributor webhook endpoint D->>C: POST /v1/externalEntities C-->>D: 201 { complianceState: "PENDING" } Note over C: Synchronous sanctions screening alt Accepted C-->>W: externalEntities { complianceState: "ACCEPTED", walletId } else Rejected C-->>W: externalEntities { complianceState: "REJECTED" } end ``` The `walletId` is returned at creation but is unusable while the entity remains in `PENDING` or `REJECTED`. Wait for the `externalEntities` webhook to deliver `complianceState: ACCEPTED` before referencing the entity's wallet in any other endpoint. ## Per-entity wallet model When Circle accepts an external entity, it provisions a dedicated wallet of type `end_user_wallet` and surfaces the wallet identifier as `walletId` (for example, `"212000"`). The wallet is owned by the Distributor's Mint account but segregated to that entity, so balances and money movement remain attributable per counterparty. Every relevant Mint endpoint accepts the entity's `walletId`: * On `GET` endpoints (such as listing deposits, payouts, or transfers), pass the entity wallet as the `walletId` query parameter: `?walletId=212000`. * On `POST` endpoints (such as creating a payout or an onchain transfer), pass the entity wallet in the request body as `"source": { "type": "wallet", "id": "212000" }`. If `walletId` is omitted on a request, Circle defaults to the Distributor's primary wallet (`masterWalletId`). The primary wallet remains available for the Distributor's own balances and money movement; the entity wallets sit alongside it as siblings, not as children of the primary wallet. ## Operational flows The Institutional API supports three flows on behalf of an accepted external entity: minting, redeeming, and onchain transfer. The table below summarizes each flow at a conceptual level. For endpoint-level steps, see [Manage institutional subaccounts](/circle-mint/quickstarts/manage-institutional-subaccounts). | Flow | What it does | Where the entity wallet appears | | - | - | - | | Mint on behalf of an entity | The end client wires fiat against entity-scoped wire instructions; Circle credits the entity wallet and fires a `deposits` webhook. | `walletId` query parameter on the wire-instructions request. | | Redeem on behalf of an entity | The Distributor submits a payout from the entity wallet. The Institutional Direct fee is deducted at redemption, so `toAmount` reflects the net amount the entity's bank receives. | `source.id` in the payout request body. | | Onchain transfer on behalf of an entity | Outbound transfers draw from the entity wallet and target a verified destination from the Distributor's address book; inbound transfers use a per-entity deposit address. | `walletId` query parameter on deposit-address requests; `source.id` in the transfer request body. | ## Billing Institutional Direct is the default billing model for the Institutional API. A gross flat fee is applied to every redemption, charged to the end client at the point of redemption and deducted from the `toAmount` returned on the payout response. The Distributor sees the net amount in the payout payload, and the entity's bank receives that net amount. <Note> Alternative billing models are available by exception. Contact Circle to arrange one outside the API. </Note> ## What is not supported The Institutional API does not support the following operations on behalf of an external entity: * Editing or deleting an external entity once it is created. Contact Circle to make changes. * Express routes from entity subaccount wallets. * Local-currency onramp flows (such as BRL, MXN, or EURC swaps) on behalf of entity subaccounts. * Stablecoin Payins and Stablecoin Payouts against entity wallets. * Cross-Currency Exchange against entity wallets. * Credit API operations on behalf of an external entity. ## See also * [Manage institutional subaccounts](/circle-mint/quickstarts/manage-institutional-subaccounts) * [Webhook notifications: `externalEntities`](/circle-mint/references/webhook-notifications#externalentities) # How-to: Add collateral to a loan Source: https://developers.circle.com/circle-mint/howtos/add-collateral Post additional cirBTC as collateral to an open loan to lower its LTV and restore its health factor after a margin call. Post additional cirBTC as collateral against an open loan. Adding collateral lowers the loan's [LTV](/circle-mint/concepts/digital-asset-backed-borrowing#ltv-health-factor-and-liquidation) and raises its health factor without changing the outstanding debt. This is the standard response to a margin call when you want to keep the loan open rather than repay it. ## Prerequisites Before you begin, ensure that you've: * Completed the [Borrow USDC against cirBTC collateral](/circle-mint/quickstarts/borrow-with-cirbtc) quickstart and hold at least one loan in `active` status. * Held sufficient cirBTC in your Mint balance to cover the additional collateral you plan to post. ## Steps <Steps> <Step title="Submit the collateral request"> Call [`POST /v1/borrow/loans/{id}/collateral`](/api-reference/circle-mint/digital-asset-backed-borrowing/add-borrow-loan-collateral) with the amount of cirBTC you want to add in raw `uint256` base units. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/borrow/loans/fc988ed5-c129-4f70-a064-e5beb7eb8e32/collateral \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "idempotencyKey": "e5c6d7b8-9012-4a3b-cdef-1234567890ab", "amount": "2500000" }' ``` The endpoint returns an `onchainJob` with `jobType: add_collateral`: ```json theme={null} { "data": { "id": "f6a7b8c9-d012-3456-efab-456789012345", "jobType": "add_collateral", "status": "received", "createDate": "2026-06-25T10:15:00.000Z", "updateDate": "2026-06-25T10:15:00.000Z" } } ``` Save the job `id`. You poll it in the next step. </Step> <Step title="Poll the job to completion"> Circle builds, signs, and submits the onchain UserOperation for the added collateral. The job progresses through `submitted` and `confirmed` to `completed`. Poll [`GET /v1/borrow/jobs/{id}`](/api-reference/circle-mint/digital-asset-backed-borrowing/get-borrow-job) until you see the terminal state. ```json theme={null} { "data": { "id": "f6a7b8c9-d012-3456-efab-456789012345", "jobType": "add_collateral", "status": "completed", "amount": "0.025", "asset": "CIRBTC", "collateralAmount": "0.025", "collateralAsset": "CIRBTC", "loanId": "fc988ed5-c129-4f70-a064-e5beb7eb8e32", "txHash": "0x3c4d5e6f70819293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9aabb", "createDate": "2026-06-25T10:15:00.000Z", "updateDate": "2026-06-25T10:17:00.000Z" } } ``` </Step> <Step title="Confirm the updated position"> Fetch the loan to confirm the added collateral is reflected and the health factor has improved: ```bash theme={null} curl https://api-sandbox.circle.com/v1/borrow/loans/fc988ed5-c129-4f70-a064-e5beb7eb8e32 \ -H "Authorization: Bearer $API_KEY" ``` `collateralAmount` on the loan should now include the added amount, and `healthFactor` should be higher than it was before. </Step> </Steps> # How-to: Add another wallet owner Source: https://developers.circle.com/circle-mint/howtos/add-wallet-owner Register an additional passkey as an authorized owner on your MSCA to extend recovery coverage across additional devices. Register an additional [WebAuthn](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API) passkey as an owner on your [modular smart contract account (MSCA)](/wallets/account-types#smart-contract-accounts-sca-and-msca). Additional owners serve as recovery keys. They extend recovery coverage across additional devices without changing how routine signing works. See [How Digital Asset-Backed Borrowing works](/circle-mint/concepts/digital-asset-backed-borrowing) for the wallet architecture. ## Prerequisites Before you begin, ensure that you've: * Completed the [Borrow USDC against cirBTC collateral](/circle-mint/quickstarts/borrow-with-cirbtc) quickstart and provisioned a wallet. * Registered a new WebAuthn passkey on the device you want to add as an owner. Capture the P-256 public key and the WebAuthn credential identifier as hex strings. ## Steps <Steps> <Step title="Submit the add-owner request"> Call [`POST /v1/borrow/wallets/owners`](/api-reference/circle-mint/digital-asset-backed-borrowing/add-borrow-wallet-owner) with the new passkey's public key and credential ID. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/borrow/wallets/owners \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "idempotencyKey": "f7a8b9c0-d123-4e56-7890-abcdef123456", "ownerKey": "0x04c1d2e3f4051627384950a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f6", "credentialId": "b2c3d4e5f6071829" }' ``` The endpoint returns an `onchainJob` with `jobType: add_owner`: ```json theme={null} { "data": { "id": "a7b8c9d0-e123-4567-890a-bcdef1234567", "jobType": "add_owner", "status": "received", "createDate": "2026-06-25T11:00:00.000Z", "updateDate": "2026-06-25T11:00:00.000Z" } } ``` Save the job `id`. You poll it in the next step. </Step> <Step title="Wait for the operation to complete"> Poll [`GET /v1/borrow/jobs/{id}`](/api-reference/circle-mint/digital-asset-backed-borrowing/get-borrow-job) until `status` reaches `completed`. ```json theme={null} { "data": { "id": "a7b8c9d0-e123-4567-890a-bcdef1234567", "jobType": "add_owner", "status": "completed", "txHash": "0x4d5e6f70819293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9aabbccdd", "createDate": "2026-06-25T11:00:00.000Z", "updateDate": "2026-06-25T11:01:30.000Z" } } ``` </Step> <Step title="Confirm the new owner"> Fetch the wallet and confirm the new owner appears in the `owners` array with `status: active`: ```bash theme={null} curl https://api-sandbox.circle.com/v1/borrow/wallets \ -H "Authorization: Bearer $API_KEY" ``` ```json theme={null} { "data": [ { "id": "9c1b2a3d-4e5f-6071-8293-a4b5c6d7e8f9", "walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f9f68C", "owners": [ { "id": "1f2e3d4c-5b6a-7980-1234-56789abcdef0", "ownerType": "passkey", "publicKey": "0x04b0a1c2d3e4f5061728394a5
프로젝트로 돌아가기