# REST API

> NeuroChain REST API 전체 레퍼런스 — 노드와 gateway의 모든 엔드포인트를 영역별로 묶어 요청 필드, 서명 작업의 대상, 쿼리 파라미터, 금액과 오류 규칙, 요청 한도와 함께 설명합니다.

Source: https://docs.nro.world/ko/reference/rest

체인은 두 개의 HTTP 서비스로 제공됩니다:

| 서비스 | 기본값 | 용도 |
|--------|--------|------|
| **Gateway** (Node.js) | `http://localhost:3000` | dApp과 웹 앱이 호출하는 대상입니다. 노드를 프록시하고 WebSocket, AI 도구, 캐싱을 더합니다 |
| **노드 RPC** (Rust) | `http://localhost:9933` | 신뢰할 수 있는 원본입니다. 일부 운영자용 엔드포인트는 여기에만 있습니다 |

대부분의 경로는 양쪽이 같습니다. 아래 표에는 한쪽에만 있는 엔드포인트가 표시되어 있습니다. 예제에서는 `$GATEWAY`와 `$NODE_RPC`를 사용합니다 — [시작하기](/ko/learn/start-here)를 참고하십시오.

## 규칙

### 금액

- 온체인 금액은 **uNRO 단위의 정수**입니다(`1 NRO = 1 000 000 uNRO`).
- 응답에는 각 금액 옆에 형식화된 **`*_human`** 문자열(`balance_human`, `value_human`, `stake_human`, …)이 추가됩니다. 이 값을 표시하고, 클라이언트에서 변환하지 마십시오.
- 요청 본문에서는 엔드포인트가 달리 명시하지 않는 한 금액을 uNRO 단위의 **JSON 숫자**로 보내십시오.

### 서명 작업

상태를 변경하는 모든 엔드포인트에는 서명이 필요합니다. 두 종류가 있습니다:

| 종류 | 서명되는 메시지 | `nonce` |
|------|-----------------|---------|
| **트랜잭션** (`POST /api/v1/transactions`) | `nc-tx-v2|from|to|value|nonce` | 계정 nonce: 마지막으로 확정된 값 + 대기 중인 수 + 1 |
| **작업** (그 밖의 모든 것) | `nc-tx-v2|actor|<target>|<value>|nonce` | 밀리초 타임스탬프로, 주소마다 엄격하게 증가합니다 |

*target*은 작업을 나타내는 예약된 시스템 주소이며, 표의 **서명 대상** 열에 나와 있습니다. 모든 요청에는 `signature`(hex), `public_key`(hex ML-DSA-65), `nonce`가 포함됩니다. [지갑 → 서명 작업](/ko/learn/wallet#signed-operations)을 참고하십시오.

`CHAIN_ENV=mainnet`(기본값)에서는 서명이 없거나 유효하지 않으면 **401**로 거부됩니다. `CHAIN_ENV=testnet`에서는 노드가 대신 경고를 기록합니다 — 로컬 개발 전용입니다.

대부분의 작업은 **합의에서 적용**됩니다: 응답에는 `"status": "pending"`과 `tx_hash`가 반환되며, 해당 트랜잭션이 블록에 포함되면 효과가 보입니다.

#### 페이로드 서명 {#the-payload-signature}

위의 서명은 행위자, 대상, 값을 명시하지만 작업의 나머지 부분 — 수신자, 세션 키의 범위, 투표 — 은 포함하지 않습니다. mainnet에서는 모든 작업이 그 작업이 다루는 모든 것에 대한 **페이로드 서명**도 함께 가지므로, 블록 제안자도 중계 노드도 이를 변경할 수 없습니다:

- **작업**(스테이크, 신뢰 목록, 투표, NFT 전송, 세션 키, 볼트, 등록…): 엔드포인트는 작업을 대기열에 넣지 않습니다. 대신 `{ "needs_payload_signature": true, "op", "sign_payload", "prepared" }`로 응답합니다. 같은 키로 `sign_payload`(`nc-op-v1|…`, 노드가 생성)에 서명하고 `{ …prepared, "payload_signature": "<hex>" }`를 `POST /api/v1/markers/submit`으로 보내면 작업이 대기열에 들어갑니다.
- **자산 및 거래소 작업**: 요청(사람이 읽는 금액)을 `route`, `from`, `nonce`와 함께 `POST /api/v1/dex/prepare`로 보내면 `canonical` 메시지, 원시 `payload`, 사람이 읽을 수 있는 `summary`가 반환됩니다. `canonical`에 서명하고 같은 요청을 `payload_signature`와 함께 해당 엔드포인트로 보내십시오.

캐비닛과 거래소는 두 가지를 모두 대신 처리하며, 서명하기 전에 작업 내용을 보여 줍니다.

### 오류

오류는 JSON `{"error": "<message>"}` 형식이며, 때로는 `hint`나 추가 필드가 포함됩니다. 사용되는 HTTP 코드:

| 코드 | 의미 |
|------|------|
| 200 | 성공 — 단, 일부 오래된 엔드포인트는 200과 함께 `{"error": …}`를 반환하기도 하므로 항상 `error`를 확인하십시오 |
| 400 | 잘못된 요청, 검증 실패, Sentinel 거부 |
| 401 | 서명이 없거나 유효하지 않음, 키가 주소에 바인딩되지 않음 |
| 403 | 이 모드에서 금지됨(mainnet의 faucet, mainnet에서 합의 없는 쓰기 호출), VMGuardian이 배포를 거부함 |
| 404 | 찾을 수 없음 |
| 409 | 이미 사용 중인 이름 |
| 429 | 요청 한도 초과 |
| 502 / 503 | Gateway가 노드에 연결할 수 없음 |

### 페이지네이션

목록 엔드포인트는 `limit`과 `offset`(일부는 `page`도)을 받습니다. 각 엔드포인트는 `limit`의 상한(보통 100 또는 200)을 둡니다.

### 요청 한도와 CORS

| 위치 | 기본값 | 변수 |
|------|--------|------|
| 노드 RPC, IP당 | 초당 100 요청 | `NEUROCHAIN_RPC_RATE_LIMIT` |
| Gateway, IP당 | 초당 200 요청 | `GLOBAL_RL_MAX_RPS` |
| Gateway AI 엔드포인트(`/contracts/audit`, `/contracts/generate`, …), IP당 | 분당 10 요청 | `AI_RL_MAX_RPM` |

허용 출처: 두 서비스 모두 `CORS_ALLOWED_ORIGINS`(기본값 `*`).

---

## 네트워크와 노드

| 메서드 | 경로 | 비고 |
|--------|------|------|
| GET | `/health` | `status`, `height`, `round`, `mempool`, `peers`, `tps`, `total_txs`, `validator_count`, `bft_quorum`, `bft_ready` |
| GET | `/status`, `/api/v1/status` | 노드 전용. 높이, 검증자, 샤드, 네트워크 이름 |
| GET | `/api/v1/network/status` | Gateway 전용. 익스플로러용 네트워크 요약 |
| GET | `/metrics` | Prometheus 텍스트 형식 — [노드 실행](/ko/operate/node) 참고 |
| GET | `/api/v1/shards` | 샤드별 높이와 루트 |
| GET | `/api/v1/state/root` | `global_root`, `shard_roots`, `height`, `root_height`, `n_shards` |
| GET | `/api/v1/state/snapshot` | 노드 전용. 노드 부트스트랩용 전체 서명 상태 스냅샷 |
| GET | `/api/v1/checkpoints` | 서명된 체크포인트. `offset`, `limit` |
| GET | `/peers` | 노드 전용. 연결된 피어 |
| GET | `/api/v1/gas/estimate` | `base_fee`, 작업별 가스, `total_burned`, `nft_transfer_fee` — [가스와 수수료](/ko/learn/gas) 참고 |
| GET | `/api/v1/wasm/version` | Gateway 전용. 브라우저 WASM 모듈의 버전 매니페스트 |

## 블록

| 메서드 | 경로 | 비고 |
|--------|------|------|
| GET | `/api/v1/blocks` | `limit`(≤ 100, 기본값 20), `offset`, `page`. 최신순 |
| GET | `/api/v1/blocks/latest` | Gateway 전용. `{ "block": … }` |
| GET | `/api/v1/blocks/:height` | 블록 하나: `height`, `hash`, `parent_hash`, `proposer`, `tx_root`, `state_root`, `tx_count`, `gas_used`, `base_fee`, `fees_burned`, `shard`, `round`, `timestamp` |
| GET | `/api/v1/blocks/:height/transactions` | 블록에 포함된 트랜잭션 |

## 트랜잭션

| 메서드 | 경로 | 서명 대상 | 비고 |
|--------|------|-----------|------|
| POST | `/api/v1/transactions` | 트랜잭션 자체 | 본문은 아래 참고 |
| GET | `/api/v1/transactions` | — | `address`, `hash`, `type`(스테이킹 작업을 나열하려면 `staking`), `limit`(≤ 200), `offset`, `page` |
| GET | `/api/v1/transactions/:hash` | — | `status`, `gas`, `fee`, `fee_human`, `value_human`이 포함된 트랜잭션 하나 |
| GET | `/api/v1/tx/:hash/proof` | — | Merkle 포함 증명: `leaf_index`, `proof`, `tx_root`, `block_height` |
| POST | `/api/v1/transactions/:hash/confirm` | `neuro:system.trust` | 보류된 이체를 승인합니다(소유자의 메인 키만 가능) — [Sentinel](/ko/ai/sentinel) 참고 |
| POST | `/api/v1/transactions/:hash/cancel` | `neuro:system.trust` | 보류된 이체를 취소합니다 |
| GET | `/api/v1/held/:address` | — | 주소의 보류된 이체 |
| GET | `/api/v1/cross-shard/queue` | — | 샤드 간 중계. `status`, `limit`, `offset` |

**`POST /api/v1/transactions` 본문**

| 필드 | 타입 | 필수 | 의미 |
|------|------|------|------|
| `from` | string | 예 | 발신자 주소 |
| `to` | string | 예 | 수신자, 컨트랙트 또는 `neuro:system.deploy` |
| `value` | number | 예 | uNRO |
| `nonce` | number | 예 | 다음 계정 nonce |
| `signature` | string | 예 | `nc-tx-v2|from|to|value|nonce`에 대한 ML-DSA-65 서명, hex |
| `public_key` | string | 예 | ML-DSA-65 공개 키, hex |
| `gas_price` | number | 아니요 | 가스 단위당 uNRO. 기본 수수료 이상이어야 합니다 |
| `data` | string | 아니요 | JSON 문자열로 된 컨트랙트 호출 또는 배포(hex도 허용) — [ABI](/ko/build/abi), [배포](/ko/build/deploy) 참고 |

응답: `tx_hash`, `status: "pending"`, `estimated_block`. Sentinel이 플래그를 지정하면 `sentinel_score`와 `sentinel_warning`이, 정책 계층이 보류하면 `held` 세부 정보가 추가됩니다.

## 계정

| 메서드 | 경로 | 비고 |
|--------|------|------|
| GET | `/api/v1/accounts/:address` | `balance`, `balance_human`, `nonce`, … |
| GET | `/api/v1/accounts/:address/transactions` | 내역. `limit`, `offset` |
| GET | `/api/v1/accounts/:address/token-transfers` | 해당 주소가 관련된 토큰(NRC-20) 전송 |
| GET | `/api/v1/accounts/:address/totals` | 노드 전용. 보낸 총액과 받은 총액 |
| POST | `/api/v1/faucet` | 테스트 네트워크 전용(`CHAIN_ENV=testnet`). 본문: `address`, `public_key`, `amount`(uNRO, 선택) |
| POST | `/api/v1/wallet/derive-address` | 본문: `words`. 구문에서 `.human` 주소를 도출합니다 — **구문을 서버로 보냅니다**. mainnet에서는 꺼져 있으며, 테스트 네트워크에서는 `NEUROCHAIN_ALLOW_SERVER_DERIVE=true`일 때만 동작합니다 |

## 이름과 NFT

| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|--------|------|-----------|-------------|
| POST | `/api/v1/addresses/human` | `neuro:system.name` | 노드 전용. `name`, `owner`, + 서명 필드. 사용자 지정 `.human` 이름을 등록합니다 |
| GET | `/api/v1/addresses/human/price` | — | 노드 전용. `?name=` → 길이에 따른 가격 |
| POST | `/api/v1/nodes/register` | `neuro:system.node` | `name`, `owner`, 선택 사항 `node_address`(`.app` / `.vault` 등록용), + 서명 필드 |
| GET | `/api/v1/nodes` | — | 등록된 노드 |
| GET | `/api/v1/nodes/:address` | — | 노드 레코드 하나 |
| PUT/POST | `/api/v1/nodes/:address/profile` | `neuro:system.node` | `description`, `website`, `commission_bps`, `p2p_endpoint`, `rpc_endpoint` |
| POST | `/api/v1/nodes/:address/unjail` | `neuro:system.node` | jail 기간이 지난 후 검증자 집합에 다시 들어갑니다(소유자가 서명) |
| POST | `/api/v1/nft/transfer` | NFT 주소 | `nft_address`, `from`(현재 소유자), `to`, + 서명 필드. 수수료 100 uNRO |
| GET | `/api/v1/nft/:address` | — | NFT 레코드와 전송 내역 |
| GET | `/api/v1/nft/owner/:address` | — | 주소가 소유한 NFT |
| POST | `/api/v1/agents/register` | `neuro:system.agent` | `name`, `owner`, + 서명 필드. `.agent`를 등록합니다 |
| GET | `/api/v1/agents/:address` | — | 에이전트 레코드 |

## 스테이킹

| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|--------|------|-----------|-------------|
| POST | `/api/v1/staking/stake` | `neuro:system.stake` | `address`, `amount`, + 서명 필드 |
| POST | `/api/v1/staking/unstake` | `neuro:system.stake` | `address`, + 서명 필드 |
| POST | `/api/v1/staking/delegate` | 검증자 주소 | `delegator`, `validator`, `amount`, + 서명 필드 |
| POST | `/api/v1/staking/undelegate` | 검증자 주소 | `delegator`, `validator`, + 서명 필드 |
| GET | `/api/v1/staking/info/:address` | — | 주소의 스테이크, 잠금, 보상 |
| GET | `/api/v1/staking/validators` | — | 스테이크와 위임이 포함된 검증자 |
| GET | `/api/v1/staking/delegations/:validator` | — | 검증자에 대한 위임 |
| GET | `/api/v1/staking/my-delegations/:address` | — | 주소가 한 위임 |
| GET | `/api/v1/staking/rewards/:address` | — | 보상 내역. `source=stake|delegation|commission` |
| GET | `/api/v1/validators` | — | `stake`, `trust_score`, `blocks_proposed`, `votes_cast`, `last_active`가 포함된 합의 검증자 |
| GET | `/api/v1/slashing/history` | — | 노드 전용. 슬래싱 내역. `limit` |

[스테이킹과 위임](/ko/learn/staking)을 참고하십시오.

## 거버넌스

| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|--------|------|-----------|-------------|
| POST | `/api/v1/governance/propose` | `neuro:system.governance` | `proposer`, `title`, `description`, `kind`(`text` / `PARAM_CHANGE`), `payload`, `voting_duration`, + 서명 필드 |
| POST | `/api/v1/governance/:id/vote` | `neuro:system.governance` | `voter`, `accept`(bool), + 서명 필드 |
| GET | `/api/v1/governance/proposals` | — | `status`, `limit`(≤ 100), `offset` |
| GET | `/api/v1/governance/:id` | — | 투표가 포함된 제안 하나 |
| GET | `/api/v1/governance/params` | — | 값과 설명이 포함된 모든 파라미터 |

[거버넌스](/ko/learn/governance)를 참고하십시오.

## 볼트(다중 서명)

| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|--------|------|-----------|-------------|
| GET | `/api/v1/vault/:addr/config` | — | `threshold`, `members` |
| GET | `/api/v1/vault/:addr/proposals` | — | 지급 제안 |
| GET | `/api/v1/vault/member/:addr` | — | 주소가 속한 볼트 |
| POST | `/api/v1/vault/:addr/proposals` | 볼트 주소 | `proposer`, `to`, `amount`, `description`, + 서명 필드 |
| POST | `/api/v1/vault/:addr/proposals/:id/sign` | 볼트 주소 | `signer`, + 서명 필드. 서명 수가 임계값에 도달하면 지급됩니다 |
| POST | `/api/v1/vault/:addr/members` | 볼트 주소 | `member`, `requester`, + 서명 필드 |
| POST | `/api/v1/vault/:addr/threshold` | 볼트 주소 | `threshold`, `requester`, + 서명 필드 |

::: warning 실험적
볼트 작업은 현재 합의가 아니라 요청을 받은 노드가 적용합니다. 이 기능이 합의로 옮겨질 때까지 볼트 하나에는 노드 하나만 사용하십시오.
:::

## 컨트랙트

| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|--------|------|-----------|-------------|
| GET | `/api/v1/contracts` | — | `owner`, `limit`, `offset` |
| GET | `/api/v1/contracts/:address` | — | 메타데이터, `security_score`, 소유자, 코드 해시 |
| GET | `/api/v1/contracts/:address/token-info` | — | Gateway 전용. NRC-20 이름, 심볼, decimals, 공급량 |
| POST | `/api/v1/contracts/:address/call` | — | `function`, `args`, `dry_run`, `gas_limit`, `caller`. `dry_run: true`로 읽기. mainnet에서는 쓰기가 거부됩니다 |
| POST | `/api/v1/contracts/deploy` | `neuro:system.deploy` | 노드 전용. `owner`, `bytecode_hex` 또는 `base64_wasm`, `name`, `description`, `template`, + 서명 필드 |
| POST | `/api/v1/contracts/analyze` | — | 노드 전용. `bytecode_hex` → `risk_score`, `security_score`, `ml_score`, `model`, `violations` |
| POST | `/api/v1/contracts/attest` | — | `bytecode_hex` → ML-DSA-65로 서명된 분석: `score`, `bytecode_hash`, `timestamp`, `signature`, `pubkey` |
| POST | `/api/v1/contracts/audit` | — | Gateway 전용. `bytecode_hex` → 노드 분석(소스 코드는 받지 않습니다) |
| POST | `/api/v1/contracts/reaudit` | — | Gateway 전용. `address` → 배포된 컨트랙트의 분석을 다시 실행합니다 |
| POST | `/api/v1/contracts/generate` | — | Gateway 전용. 컨트랙트 템플릿 생성(SmartForge) |
| POST | `/api/v1/contracts/certify` | `neuro:system.cert` | 보안 인증서 발급(VMGuardian 운영자) |
| POST | `/api/v1/contracts/whitelist` | `neuro:system.whitelist` | 노드 전용. `bytecode_hash` — 신뢰할 수 있는 템플릿 바이트코드 |
| PATCH | `/api/v1/contracts/:address/score` | `neuro:system.score` | 노드 전용. `security_score` |
| GET | `/api/v1/certificates` | — | `owner`, `limit`, `offset` |
| GET | `/api/v1/certificates/:id` | — | 인증서 하나 |
| GET | `/api/v1/certificates/contract/:address` | — | 컨트랙트의 인증서 |
| GET | `/api/v1/templates` | — | 등록된 컨트랙트 템플릿 |
| GET | `/api/v1/templates/:id` | — | ABI가 포함된 템플릿 하나 |
| POST | `/api/v1/templates/register` | `neuro:system.templates` | `author`(`.node`), `name`, `description`, `category`, `bytecode_hex`, `abi_json`, `fee_unro`, + 서명 필드 |
| POST | `/api/v1/templates/deprecate` | `neuro:system.templates` | 노드 전용. `template_id`, `author`, `delete`, + 서명 필드 |

## AI와 모델

| 메서드 | 경로 | 비고 |
|--------|------|------|
| GET | `/api/v1/ai/status` | Gateway 전용. AI 모델 상태 |
| POST | `/api/v1/sentinel/score` | 트랜잭션 형태를 평가합니다: `value`, `gas_price`, `nonce`, `last_nonce`, `balance`, `tx_count_last_10`, `recipient_tx_count`, `is_self_transfer` → `score`, `anomalous`, `category` |
| GET | `/api/v1/oracle/log` | AI 결정 로그. `model`, `kind`, `subject`, `limit`, `offset` |
| GET | `/api/v1/oracle/log/:id` | 결정 하나 |
| GET | `/api/v1/models/registry` | 온체인 모델 레지스트리. `limit`, `offset` |
| GET | `/api/v1/models/registry/:id` | 모델 버전 하나 |
| POST | `/api/v1/models/register` | 검증자 전용. `neuro:models.registry`에 대해 서명합니다. `from`, `name`, `version`, `weights_hash`, `architecture`, `params_count`, `accuracy`, + 서명 필드 |
| GET | `/api/v1/ai/export/{blocks,txs,validators,oracle}` | 학습 데이터 내보내기(JSON Lines) |
| POST | `/api/v1/assistant/ask`, GET `/api/v1/assistant/health` | Gateway 전용. 문서 도우미(`ASSISTANT_ENABLED=1`이 아니면 꺼져 있음) |

## Sentinel 신뢰 목록

| 메서드 | 경로 | 서명 대상 | 본문 |
|--------|------|-----------|------|
| POST | `/api/v1/trust/add` | `neuro:system.trust` | `owner`, `recipient`, + 서명 필드 |
| POST | `/api/v1/trust/remove` | `neuro:system.trust` | `owner`, `recipient`, + 서명 필드 |
| GET | `/api/v1/trust/:owner` | — | 활성화 높이가 포함된 신뢰 수신자 |

## 계정 추상화

| 메서드 | 경로 | 서명 대상 | 본문 |
|--------|------|-----------|------|
| POST | `/api/v1/session/grant` | `neuro:system.session` | `account`, `session_pk`, `scope`, `cap`, `expiry_block`, + 서명 필드 |
| POST | `/api/v1/session/revoke` | `neuro:system.session` | `account`, `session_pk`, + 서명 필드 |
| GET | `/api/v1/session/list/:account` | — | 계정의 세션 키 |
| POST | `/api/v1/sponsor/deposit` | `neuro:system.sponsor` | `address`, `amount`, + 서명 필드 |
| POST | `/api/v1/sponsor/withdraw` | `neuro:system.sponsor` | `address`, `amount`, + 서명 필드 |
| GET | `/api/v1/sponsor/:address` | — | 스폰서 풀 잔액 |

[계정 추상화](/ko/ai/account-abstraction)를 참고하십시오.

## 신원과 복구

이 작업들은 `nc-tx-v2`가 아닌 자체 메시지(예: `nc-rotate|addr|add|remove|nonce`)에 서명합니다. [신원](/ko/ai/identity)을 참고하십시오.

| 메서드 | 경로 | 본문 |
|--------|------|------|
| POST | `/api/v1/identity/rotate` | `owner`, `add`, `remove`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/setup` | `owner`, `guardians`, `threshold`, `timelock`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/request` | `target`, `new_key`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/approve` | `target`, `guardian`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/reject` | `target`, `guardian`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/withdraw` | `target`, + 서명 필드 |
| POST | `/api/v1/identity/recovery/cancel` | `owner`, + 서명 필드 |
| GET | `/api/v1/identity/:addr` | 키와 버전 |
| GET | `/api/v1/identity/recovery/:addr` | 복구 설정과 진행 중인 요청(있는 경우) |
| GET | `/api/v1/identity/guardian-of/:addr` | 이 주소가 보호하는 신원 |

## 네이티브 자산과 거래소

| 메서드 | 경로 | 본문 / 비고 |
|--------|------|-------------|
| GET | `/api/v1/assets` | 발행된 자산 |
| GET | `/api/v1/assets/:id` | 자산 하나 |
| GET | `/api/v1/assets/check-symbol` | `?symbol=` — 티커가 사용 가능하고 유효한지 확인합니다 |
| GET | `/api/v1/assets/balances/:addr` | 자산 잔액 |
| POST | `/api/v1/assets/issue` | `from`, `name`, `symbol`, `decimals`, `initial`, `max_supply`, `reissuable`, `reissue_unlock_height`, `issue_nonce`, + 서명 필드. 수수료 `asset_issue_fee` |
| POST | `/api/v1/assets/transfer` | `from`, `to`, `asset_id`, `amount`, + 서명 필드 |
| GET | `/api/v1/dex/pools`, `/api/v1/dex/pools/:id` | 풀 |
| POST | `/api/v1/dex/pools` | `from`, `asset_x`, `asset_y`, `amount_x`, `amount_y`, + 서명 필드 |
| POST | `/api/v1/dex/liquidity/add` | `from`, `pool_id`, `max_a`, `max_b`, + 서명 필드 |
| POST | `/api/v1/dex/liquidity/remove` | `from`, `pool_id`, `shares`, + 서명 필드 |
| GET | `/api/v1/dex/quote` | 스왑 견적 |
| POST | `/api/v1/dex/swap` | `from`, `pool_id`, `asset_in`, `amount_in`, `min_out`, `deadline_height`, + 서명 필드. 다음 블록이 커밋될 때 배치로 체결됩니다 |
| GET | `/api/v1/dex/window` | 현재 배치 윈도우 |
| POST | `/api/v1/dex/deposit`, `/api/v1/dex/withdraw` | 메인 잔액과 거래소 잔액 간에 자금을 옮깁니다 |
| GET | `/api/v1/dex/balances/:addr`, `/dex/positions/:addr`, `/dex/activity/:addr`, `/dex/transactions` | 거래소 잔액, LP 포지션, 활동 |

| POST | `/api/v1/dex/prepare` | 위 작업 중 하나의 요청에 `route`(예: `dex/swap`), `from`, `nonce`를 더한 것 → `canonical`, `payload`, `summary`. 아무것도 대기열에 들어가지 않습니다 |

모든 자산 및 거래소 작업은 `neuro:system.assets`에 대해 서명하고 합의에서 적용되며, 노드가 준비한 메시지(`nc-asset-op-v1|op|from|fields|nonce`)에 대한 [페이로드 서명](#the-payload-signature)을 `payload_signature`로 포함합니다. 보호되거나 예약된 티커 또는 자산 이름은 거부됩니다.

## 준비된 작업

| 메서드 | 경로 | 본문 / 비고 |
|--------|------|-------------|
| POST | `/api/v1/markers/submit` | `{ tx, auth_to, auth_value, payload_signature }` — 작업 응답의 `prepared` 부분과 그 `sign_payload`에 대한 서명입니다. 두 서명을 모두 확인하고 작업을 대기열에 넣습니다 |

## IBC v2 <Badge type="warning" text="실험적" /> {#ibc-v2}

| 메서드 | 경로 | 본문 / 비고 |
|--------|------|-------------|
| POST | `/api/v1/ibc/channel/open` | `from`, `channel`, `port`, `counterparty_chain`, `allowed_denoms`, + 서명 필드 |
| POST | `/api/v1/ibc/channel/pause` | `from`, `channel`, `paused`, + 서명 필드 |
| POST | `/api/v1/ibc/transfer` | `from`, `channel`, `dest_chain`, `receiver`, `denom`, `amount`, + 서명 필드 |
| POST | `/api/v1/ibc/recv` | `from`, `packet_id`, `receiver`, `denom`, `amount`, + 서명 필드 |
| POST | `/api/v1/ibc/ack` | `from`, `id`, + 서명 필드 |
| POST | `/api/v1/ibc/redeem` | `from`, `channel`, `dest_chain`, `receiver`, `denom`, `amount`, + 서명 필드 |
| POST | `/api/v1/ibc/client/update`, `/api/v1/ibc/attest` | 라이트 클라이언트 업데이트와 증명(릴레이어) |
| GET | `/api/v1/ibc/channels`, `/ibc/packets`, `/ibc/denoms`, `/ibc/client/:chainId`, `/ibc/header/latest`, `/ibc/voucher/:addr`, `/ibc/pq/test-vector` | 상태와 테스트 벡터 |

모든 IBC v2 작업은 `neuro:system.ibc`에 대해 서명합니다. `recv`, `ack`, 채널 및 클라이언트 작업은 IBC 운영자 키로 제한됩니다. [IBC v2와 샤딩](/ko/operate/ibc)을 참고하십시오.
