Circle USYC 백서

Circle USYC

원문

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

ases the loan's cirBTC collateral back to your Mint balance and the loan transitions to `closed`. * **Partial repay**: set `mode: PARTIAL` and include the `amount` you want to apply in raw `uint256` base units. The loan stays `active` with a reduced debt. No collateral is released. <Tabs> <Tab title="Full repay"> ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/borrow/loans/fc988ed5-c129-4f70-a064-e5beb7eb8e32/repayments \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "idempotencyKey": "d7a3e2c1-8f45-4b91-ae67-2c9d0f8b3e5a", "mode": "FULL" }' ``` </Tab> <Tab title="Partial repay"> ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/borrow/loans/fc988ed5-c129-4f70-a064-e5beb7eb8e32/repayments \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "idempotencyKey": "d7a3e2c1-8f45-4b91-ae67-2c9d0f8b3e5a", "mode": "PARTIAL", "amount": "50000000000" }' ``` </Tab> </Tabs> The endpoint returns an `onchainJob` with `jobType: repay`: ```json theme={null} { "data": { "id": "e5f6a7b8-9012-3456-efab-345678901234", "jobType": "repay", "status": "received", "createDate": "2026-06-25T10:00:00.000Z", "updateDate": "2026-06-25T10:00: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 repayment. 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": "e5f6a7b8-9012-3456-efab-345678901234", "jobType": "repay", "status": "completed", "amount": "500.00", "asset": "USD", "loanId": "fc988ed5-c129-4f70-a064-e5beb7eb8e32", "txHash": "0x2b3c4d5e6f70819293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9aa", "createDate": "2026-06-25T10:00:00.000Z", "updateDate": "2026-06-25T10:02:00.000Z" } } ``` </Step> <Step title="Confirm the outcome"> Fetch the loan to inspect the updated position: ```bash theme={null} curl https://api-sandbox.circle.com/v1/borrow/loans/fc988ed5-c129-4f70-a064-e5beb7eb8e32 \ -H "Authorization: Bearer $API_KEY" ``` For a full repay, the loan's `status` is `closed` and `debtAmount` is zero. The cirBTC collateral is credited back to your Mint balance. Confirm the credit by calling `GET /v1/businessAccount/balances`. For a partial repay, the loan's `status` remains `active` and `debtAmount` reflects the reduced outstanding balance. No collateral change occurs. </Step> </Steps> # How-to: Transfer USDC onchain Source: https://developers.circle.com/circle-mint/howtos/transfer-on-chain Receive USDC and EURC via deposit addresses and send them to external blockchain wallets using the Circle Mint API. Receive USDC or EURC by generating deposit addresses for external wallets to send to, or send USDC or EURC to allowlisted recipient addresses on supported blockchains. Third-party payouts may require Travel Rule compliance data; see [Travel rule compliance](/circle-mint/references/travel-rule-compliance) for thresholds, schemas, and failure modes. ## Prerequisites Before you begin: * Complete the [account and API key setup](/circle-mint/quickstarts/getting-started). * Review [supported chains and currencies](/circle-mint/references/supported-chains-and-currencies) for available blockchains. * (For sending) Have a funded Circle Mint account. * (For sending) All recipient addresses must be approved by an account administrator through the [Mint Console](https://app.circle.com/signin) before you can create transfers. If your account is domiciled in France or Singapore, addresses require additional verification through the Mint Console. ## Step 1. Receive USDC via deposit address ### Step 1.1. Create a deposit address Use the create deposit address endpoint to generate an address for receiving USDC or EURC on a specific blockchain. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/deposit \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" \ -d '{"idempotencyKey": "ba943ff1-ca16-49b2-ba55-1057e70ca5c7", "currency": "USD", "chain": "ARC"}' ``` Expected response: ```json theme={null} { "data": { "id": "d51d72d2-9955-4340-b3fd-2f07a82a1e6c", "address": "0xbd01242af414961c25aa72dcae06646fc52e9b92", "currency": "USD", "chain": "ARC" } } ``` <Note> You can create one deposit address per blockchain. Use the same address for all deposits on that blockchain. </Note> ### Step 1.2. Send funds to your deposit address This step happens outside the Circle Mint API. The sender transfers USDC or EURC from their external wallet to your deposit address on the matching blockchain. <Warning> Sending funds on the wrong blockchain results in permanent loss. Always confirm the blockchain network matches between the sender's wallet and your deposit address. </Warning> ### Step 1.3. Verify the deposit Use the [list transfers](/api-reference/circle-mint/account/list-business-transfers) endpoint to confirm the incoming transfer has settled. ```bash theme={null} curl https://api-sandbox.circle.com/v1/businessAccount/transfers \ -H "Authorization: Bearer ${YOUR_API_KEY}" ``` Expected response: ```json theme={null} { "data": [ { "id": "a6a1b575-13d5-4e73-9da7-73e2a3e4418a", "source": { "type": "blockchain", "chain": "ARC" }, "destination": { "type": "wallet", "id": "1000066041" }, "amount": { "amount": "100.00", "currency": "USD" }, "transactionHash": "0x4cfd25b5ab46e9fe25e845e7a7e0ea2f1f7e4bba3c6e0f1db0b846e4a1bc5fd2", "status": "complete", "createDate": "2024-01-01T12:00:00.000Z" } ] } ``` The transfer reaches `complete` status after the required number of [blockchain confirmations](/circle-mint/references/blockchain-confirmations) for the deposit's blockchain. ## Step 2. Send USDC to an external address ### Step 2.1. Add a recipient address Use the create recipient address endpoint to allowlist an external blockchain address for outbound transfers. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" \ -d '{"idempotencyKey": "2a308497-e66e-4c42-ac1e-7bedab86d958", "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1", "chain": "ARC", "currency": "USD", "description": "Treasury wallet"}' ``` Expected response: ```json theme={null} { "data": { "id": "cfa01bb0-d166-5506-a48a-56f2beab559f", "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1", "chain": "ARC", "currency": "USD", "description": "Treasury wallet" } } ``` Adding a recipient address through the API creates a pending request. An account administrator must approve the address through the [Mint Console](https://app.circle.com/signin) before you can send transfers to it. A confirmation notification is sent to all administrators. ### Step 2.2. Create a transfer Use the create transfer endpoint to send funds to the approved recipient address. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" \ -d '{"idempotencyKey": "6ec3827d-15bb-442e-9d4c-32e73e61cbf4", "destination": {"type": "verified_blockchain", "addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"}, "amount": {"currency": "USD", "amount": "25.00"}}' ``` Expected response: ```json theme={null} { "data": { "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea", "source": { "type": "wallet", "id": "1016875042" }, "destination": { "type": "blockchain", "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1", "chain": "ARC" }, "amount": { "amount": "25.00", "currency": "USD" }, "status": "pending", "createDate": "2024-07-15T16:41:12.395Z" } } ``` ### Step 2.3. Check the transfer status Use the get transfer endpoint to monitor the status of your transfer. ```bash theme={null} curl -X GET https://api-sandbox.circle.com/v1/businessAccount/transfers/21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea \ -H "Authorization: Bearer ${YOUR_API_KEY}" ``` The transfer progresses through these statuses: * **`pending`**: Circle received the request. * **`running`**: The transaction is broadcast onchain. The response includes a `transactionHash`. * **`complete`**: Blockchain finality reached -- the required number of confirmations passed. Expected response for a running transfer: ```json theme={null} { "data": { "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea", "source": { "type": "wallet", "id": "1016875042" }, "destination": { "type": "blockchain", "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1", "chain": "ARC" }, "amount": { "amount": "25.00", "currency": "USD" }, "transactionHash": "0x0654eee4f609f9c35e376cef9455dd9fc1546c482c5c32c8f8d434ead14fcf97", "status": "running", "createDate": "2024-07-15T16:41:12.395Z" } } ``` ## See also * [How minting and redemption works](/circle-mint/concepts/how-minting-works): understand the transfer lifecycle * [Travel rule compliance](/circle-mint/references/travel-rule-compliance): thresholds, schemas, and failure modes for third-party payouts * [Blockchain confirmations](/circle-mint/references/blockchain-confirmations): confirmation counts by blockchain * [Supported Chains and Currencies](/circle-mint/references/supported-chains-and-currencies): available blockchains # How-to: Withdraw fiat Source: https://developers.circle.com/circle-mint/howtos/withdraw-fiat Redeem USDC or EURC to fiat and withdraw funds to your bank account using the Circle Mint API. Redeem (offramp) USDC or EURC in your Circle Mint balance to fiat and send funds to a linked bank account. You can track payout status from `pending` through `complete` or `failed`, and handle returned withdrawals caused by bank-side rejections. Payouts route through the `/wires` endpoint and support standard wires, real-time interbank rails (RTP, SPEI, SEPA, CHATS) where available, and book transfers when applicable -- Circle selects the rail based on your destination bank and region. ## Prerequisites Before you begin: * Complete the [account and API key setup](/circle-mint/quickstarts/getting-started). * Have a funded Circle Mint account with available USDC or EURC balance. * Have a linked bank account. If you have not linked one, see [Deposit Fiat](/circle-mint/howtos/deposit-fiat) Step 1. * If your Circle Mint account is domiciled in Singapore or France, verify your payout recipients through the [Mint Console](https://app.circle.com/signin) before proceeding. Unverified recipients cause payouts to remain in `pending` status. ## Step 1. Verify your balance Before you initiate a withdrawal, confirm that your available balance covers the amount you plan to send. ```bash theme={null} curl -X GET https://api-sandbox.circle.com/v1/businessAccount/balances \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" ``` Expected response: ```json theme={null} { "data": { "available": [ { "amount": "150.00", "currency": "USD" } ], "unsettled": [ { "amount": "25.00", "currency": "USD" } ] } } ``` The `available` array shows funds you can withdraw immediately. The `unsettled` array shows funds that are still being processed and are not yet available. ## Step 2. Create a payout Use the [create a payout](/api-reference/circle-mint/account/create-business-payout) endpoint to send funds from your Circle Mint account to your linked bank account. ```bash theme={null} curl -X POST https://api-sandbox.circle.com/v1/businessAccount/payouts \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" \ -d '{"idempotencyKey": "'$(uuidgen)'", "destination": {"type": "wire", "id": "9d1fa351-b24d-442a-8aa5-e717db1ed636"}, "amount": {"currency": "USD", "amount": "75.00"}}' ``` Replace the `destination.id` value with the bank account ID returned when you linked your bank account. Expected response: ```json theme={null} { "data": { "id": "9cf38c76-cac4-40d8-a516-f46e9a610a85", "amount": { "amount": "75.00", "currency": "USD" }, "status": "pending", "sourceWalletId": "1016875042", "destination": { "type": "wire", "id": "9d1fa351-b24d-442a-8aa5-e717db1ed636", "name": "WELLS FARGO BANK, NA ****0010" }, "createDate": "2024-01-15T14:22:31.062Z", "updateDate": "2024-01-15T14:22:31.062Z" } } ``` Record the `id` from the response to check the payout status in the next step. ## Step 3. Check the payout status Use the [get a payout](/api-reference/circle-mint/account/get-business-payout) endpoint to check the current status of your withdrawal. ```bash theme={null} curl -X GET https://api-sandbox.circle.com/v1/businessAccount/payouts/9cf38c76-cac4-40d8-a516-f46e9a610a85 \ -H "Authorization: Bearer ${YOUR_API_KEY}" \ -H "Content-Type: application/json" ``` A payout moves through the following statuses: * **`pending`**: Circle has received the payout request and is processing it. * **`complete`**: Funds have been sent to the receiving bank. * **`failed`**: The payout could not be processed. Check the `errorCode` field for details. Expected response for a completed payout: ```json theme={null} { "data": { "id": "9cf38c76-cac4-40d8-a516-f46e9a610a85", "amount": { "amount": "75.00", "currency": "USD" }, "status": "complete", "sourceWalletId": "1016875042", "destination": { "type": "wire", "id": "9d1fa351-b24d-442a-8aa5-e717db1ed636", "name": "WELLS FARGO BANK, NA ****0010" }, "createDate": "2024-01-15T14:22:31.062Z", "updateDate": "2024-01-16T09:15:42.778Z" } } ``` Payouts are asynchronous. To track status changes without polling, subscribe to `payouts` webhook notifications. Alternatively, poll the get a payout endpoint at a reasonable interval until the status reaches `complete` or `failed`. ### Returned withdrawals Even after a payout reaches `complete` status, bank-side issues can cause the wire to be returned. Common reasons include: * Incorrect account details, such as a wrong routing number or a closed account. * Compliance holds at the receiving bank. * Beneficiary name mismatch between the payout and the bank account on file. When a wire is returned, the funds are re-credited to your Circle Mint balance. Monitor webhook notifications for `payouts` events to detect returns. If a payout fails or is returned, verify the bank account details and retry with a new idempotency key. ## See also * [How minting and redemption works](/circle-mint/concepts/how-minting-works) -- understand the redemption process * [Sandbox to Production](/circle-mint/references/sandbox-and-testing) -- production settlement timing differences * [Create a payout](/api-reference/circle-mint/account/create-business-payout) \-- API reference # How mTLS authentication works Source: https://developers.circle.com/circle-mint/mtls-authentication Learn how mutual TLS authentication adds a transport-layer certificate check to Circle Mint API access, as a MiCA requirement or an optional security enhancement. Mutual Transport Layer Security (mTLS) adds transport-layer certificate authentication on top of your existing API key. With mTLS enabled, both Circle and your client verify each other's identity before any API request is processed. A request is accepted only when it arrives over a connection that both sides have authenticated. ## Who should use mTLS You can enable mTLS in either of two situations: * **As a MiCA requirement.** Entities operating in an EU/EEA member state under the Markets in Crypto-Assets (MiCA) regulation must use mTLS on regulated API endpoints. * **As an optional security enhancement.** Any Circle Mint customer with an active API key can opt in to mTLS for an additional layer of transport-level authentication. Opting in is voluntary, and there's no regulatory prerequisite. The certificate model, setup flow, and API key lifecycle are the same in both cases. Only two things differ, depending on why you enable mTLS: | Aspect | MiCA-regulated | Optional (non-MiCA) | | - | - | - | | API hostname | Regional EU hostname `api-eu.circle.com` | Standard hostname `api.circle.com` (unchanged) | | Server certificate you validate | A Qualified Website Authentication Certificate (QWAC), validated for PSD2 | Circle's standard server certificate, validated as usual | ## What is mTLS Standard TLS (one-way TLS) authenticates only the server. Your client verifies Circle's certificate during the TLS handshake, but Circle has no way to verify your client's identity at the transport layer. Mutual TLS (mTLS) extends this model so that both sides present certificates: * **Server authentication**: Circle presents its certificate to your client, just as in standard TLS. * **Client authentication**: Your client presents a client certificate issued by Circle's private certificate authority (CA) during the same handshake. Circle validates that certificate against its private CA before accepting the connection. The result is a two-way trust relationship established before any HTTP traffic flows. Only after both certificates are validated does the connection proceed to the application layer, where your API key is checked as usual. ```mermaid theme={null} sequenceDiagram participant C as Your client participant S as Circle API Note over C,S: TLS handshake begins S->>C: Presents server certificate C->>C: Validates server certificate C->>S: Presents client certificate (issued by Circle's private CA) S->>S: Validates client certificate against its private CA Note over C,S: TLS handshake complete Note over C,S: Application layer C->>S: Sends API request with Bearer token S->>S: Validates API key S-->>C: Returns API response ``` ## Client certificates Circle issues your client certificate from its private certificate authority (CA), managed through AWS Private CA. You do not purchase a Qualified Website Authentication Certificate (QWAC) or any other certificate from a third party. The issuance flow keeps your private key in your own environment: <Steps> <Step title="Generate a key pair and CSR locally"> You generate an Elliptic Curve Digital Signature Algorithm (ECDSA) P-256 key pair and a PKCS#10 certificate signing request (CSR) locally. Circle accepts only ECDSA P-256 keys; RSA keys and other curves are rejected. </Step> <Step title="Submit the CSR to Circle"> You submit the CSR, which contains only your public key, to Circle. Your private key never leaves your environment. </Step> <Step title="Receive your signed certificate"> Circle validates the CSR, issues a signed client certificate from its private CA, and returns a single file, `client-fullchain.pem`, through a secure, out-of-band channel. It contains your signed certificate followed by the CA certificate chain. </Step> </Steps> Circle assigns the certificate fields, including the subject name, key usage (`digitalSignature`), and extended key usage (`clientAuth`). The certificate is valid for 365 days from the date of issuance. ### Certificate validation Because Circle issues your client certificate from its own private CA, Circle validates the certificate you present against that CA on every request. You do not pre-register the certificate separately; presenting it during the TLS handshake is sufficient. If the certificate is expired or does not chain to Circle's private CA, requests fail at the transport layer before the API key is evaluated. For step-by-step instructions on generating a key pair and CSR and obtaining your certificate, see [How-to: Set up mTLS authentication](/circle-mint/set-up-mtls-authentication). ### Server certificate v
프로젝트로 돌아가기