Exact Output 兌換¶
Exact Output 從接收者必須收到的金額出發計算報價。當前流程使用錢包資金和固定輸入扣款,要求 gas_mode="pay_more"、funding_policy="wallet_fixed_exact_output",不使用已有 Vault 餘額支付這筆兌換。整數取整後,成功到賬金額可能高於目標;實際結果以確認金額爲準。
可用性取決於目標部署。臨時 503 不能證明執行失敗,請保留請求身份並遵循下方重試規則。
請求報價¶
身份驗證: 無。
請求體¶
{
"quote_uuid": "client-quote-001",
"from_token": "0x1111111111111111111111111111111111111111",
"to_token": "0x2222222222222222222222222222222222222222",
"to_amount": "1000000",
"max_from_amount": "1200000",
"owner_address": "0x3333333333333333333333333333333333333333",
"recipient": "0x3333333333333333333333333333333333333333",
"expiration": 1800000000,
"gas_mode": "pay_more",
"funding_policy": "wallet_fixed_exact_output"
}
GET /api/v1/system/time 設置未來截止時間,並預留報價、簽名和執行時間。 | 欄位 | 必填 | 說明 |
|---|---|---|
quote_uuid | 否 | 1–64 個不含空格的可見 ASCII 字符;省略時生成 UUID。建議自行提供並保存,以便識別報價重試 |
from_token、to_token | 是 | 不同、非零、嚴格小寫的 0x EVM 地址 |
owner_address、recipient | 是 | 非零小寫簽名/付款錢包與接收錢包 |
to_amount | 是 | 目標輸出金額,正 uint256 十進制 raw 字串 |
max_from_amount | 否 | 包含報價 gas 費用的最大錢包輸入扣款,正 raw 字串 |
expiration | 是 | Unix 秒數整數,0 < expiration < 2**48;報價後必須留有執行時間 |
gas_mode | 是 | pay_more |
funding_policy | 是 | wallet_fixed_exact_output |
額外欄位、浮點金額和非規範 raw 字串會被拒絕。報價有效期最長 30 秒,且至少早於路由截止時間 30 秒結束;請始終使用回傳的 expires_at。
回應¶
| 欄位 | 說明 |
|---|---|
quote_uuid | 執行和狀態查詢使用的標識符 |
execution_flow | exact_output_fok_v1 |
status | quoted |
expires_at | 報價過期的 Unix 秒數 |
funding_policy、gas_mode | 已接受的資金與 gas 選項 |
route_params | 必須原樣簽名的 EIP-712 Intent 欄位;其中 uuid 是簽名 uint256,不是 quote_uuid |
signing_domain | 本次報價應使用的 EIP-712 域 |
permit | 資金授權元數據,沿用 Swap 的 permit/approve 分支 |
fee_breakdown.quoted_gas_fee_input_raw | 以輸入代幣 raw 單位計價的 gas 費 |
fee_breakdown.wallet_debit_raw | 固定的錢包總扣款 |
fee_breakdown.expected_recipient_output_raw | 預期輸出,不低於 to_amount |
fee_breakdown.confirmed_recipient_output_raw | 報價時爲 null |
fee_breakdown.gas_fee_usd | gas 的美元成本,十進制字串 |
route_params.maxInputAmount 和 initialDepositAmount 均等於固定錢包扣款。minOutputAmount 是請求的目標金額。使用 Intent 類型和本次報價的 signing_domain,原樣簽署所有回傳欄位。
執行¶
身份驗證: EIP-712 Intent 簽名。如攜帶 API Key,必須屬於報價所有者。
請求體¶
{
"quote_uuid": "client-quote-001",
"signature": "0x...",
"permit_signature": "0x...",
"permit_deadline": 1800000000
}
quote_uuid 和 signature 必填。只有已存報價要求且支援 EIP-2612 permit 時,才提交 permit_signature / permit_deadline。否則完成 approve 流程並省略這兩個欄位;多餘的 permit 欄位會被拒絕。 待確認執行回傳 HTTP 202;其他正常 HTTP 回應使用 200。HTTP 200 本身不表示交易成功,必須檢查 status。
查詢狀態¶
GET /api/v1/swap/exact-output/{quote_uuid}
GET /api/v1/swap/exact-output?quote_uuid=client-quote-001
身份驗證: 需要 API Key,結果僅對報價所有者可見。自訂或不透明 ID 優先使用查詢參數形式,並由 HTTP 客戶端編碼參數。路徑形式僅適用於單路徑段 ID:合法的 a/b 即使編碼為 a%2Fb 也可能因路由解碼回傳 404,不能據此認定報價不存在。
| 狀態 | 含義 |
|---|---|
quoted | 報價存在且仍有效,尚無確認的執行結果 |
expired | 未執行報價已失效 |
pending | 執行結果尚未確定 |
succeeded | 成功結算已確認 |
failed | 執行已進入終態失敗 |
報價/過期回應包含 quote_uuid、execution_flow、status。執行記錄持久化後,還包含 order_id、route_uuid、intent_hash、transaction_hash、error_code、confirmed_recipient_output_raw、confirmed_actual_input_cost_raw;待確認時相關確認欄位可能爲 null。最終記賬應使用確認欄位,不能使用報價估計值。
重試與錯誤¶
- 報價重試使用同一
quote_uuid和完全相同的報價欄位。相同 ID 綁定不同請求會回傳 409;過期身份不能作爲新報價複用。 - 發送前保存完整執行請求體。超時、503 或 pending 後查詢原 ID,必要時重試完全相同的簽名請求。改變簽名字節或 permit 內容會與已認領執行衝突;編碼說明見下文。
- 執行結果未知時,不要創建新報價 ID 替代原執行。關閉新報價/執行准入時,狀態讀取仍保留。
pending 可能包含服務在確認尚未廣播交易後,對臨時提交失敗進行的自動重試,也可能表示提交或鏈上恢復結果尚不確定。這兩種情況都不要求客戶端創建新報價或重新簽署替代 Intent;應持續查詢原 quote_uuid,直到得到終態結果。
| HTTP | 含義 / 處理 |
|---|---|
| 400 | Intent/permit 簽名無效、多餘 permit 或資金預檢失敗 |
| 401 | 狀態查詢缺少或使用無效 API Key |
| 404 | 報價不存在 |
| 409 | 報價/執行身份衝突;部分准入前 permit nonce 衝突需重新報價 |
| 410 | 計劃或報價過期 |
| 422 | 請求無效、超出輸入上限或類型化報價拒絕 |
| 429 | 限流;存在 Retry-After 時遵循該值 |
| 503 | 臨時不可用或關閉新准入;保留 ID 並查詢狀態 |
類型化 4xx 使用 detail.code,例如 EXACT_OUTPUT_QUOTE_CONFLICT、EXACT_OUTPUT_EXECUTION_CONFLICT、EXACT_OUTPUT_PLAN_EXPIRED、EXACT_OUTPUT_INPUT_CAP_EXCEEDED。共用的 Swap 預檢錯誤也可能使用 detail.error_code 或字串。5xx 通常回傳通用 503 回應,不能依賴內部 EXACT_OUTPUT_* 碼一定出現在該回應中。
Intent 與 permit 長度限制見簽名編碼。為保持相容,應保存並原樣重試簽名請求:新執行認領將等價的十六進位編碼正規化為簽名字節,但改變簽名字節或簽名內容會改變執行身分;歷史認領仍可能使用原字串指紋。同時遵守整體請求體上限。