> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stablenet.network/llms.txt
> Use this file to discover all available pages before exploring further.

# 트랜잭션 풀

> StableNet의 mempool이 블록 포함 전에 트랜잭션을 검증, 저장, 정렬하는 방식 — 그리고 트랜잭션이 pending 상태인 이유.

> StableNet으로 전송된 트랜잭션은 블록에 포함될 때까지 트랜잭션 풀(mempool)에 머뭅니다. 풀을 이해하면 트랜잭션이 대기 중인 이유와 해결 방법을 알 수 있습니다.

## 두 가지 상태: pending과 queued

풀의 모든 트랜잭션은 두 가지 상태 중 하나에 있습니다:

| 상태          | 조건                     | 다음 블록에 포함?          |
| ----------- | ---------------------- | ------------------- |
| **Pending** | 논스가 발신자의 현재 온체인 논스와 일치 | 예 — 즉시 가능           |
| **Queued**  | 논스가 현재 온체인 논스보다 높음     | 아니오 — 낮은 논스를 먼저 기다림 |

같은 발신자의 이전 논스가 모두 확인되면 트랜잭션이 자동으로 queued에서 pending으로 이동합니다.

## 트랜잭션이 pending인 이유

**가장 흔한 이유:**

1. **논스 공백** — 논스 4가 아직 pending인데 논스 5를 전송한 경우. 논스 5는 논스 4가 포함될 때까지 queued 상태로 대기합니다.
2. **가스 팁이 최솟값 미만** — 거버넌스 적용 최소 `maxPriorityFeePerGas`를 충족하지 못한 경우. 트랜잭션이 queued가 아닌 제출 단계에서 거부됩니다.
3. **잔액 부족** — `balance < value + gasLimit × maxFeePerGas`. 트랜잭션이 유효성 검사에서 실패합니다.
4. **풀 가득 참** — 전역 pending 한도(기본값 5,120 슬롯)에 도달했고 내 트랜잭션의 우선순위가 기존 트랜잭션보다 낮은 경우.

## 가스 팁과 우선순위

StableNet에서 가스 팁 경쟁은 이더리움 메인넷과 다르게 작동합니다.

**일반 계정**의 경우 실효 가스 팁은 GovValidator 거버넌스 컨트랙트가 고정합니다. 모든 일반 계정 트랜잭션은 동일한 팁을 납부합니다 — 팁을 높여서 다른 사용자를 앞지를 수 없습니다.

**인증 계정** (GovCouncil이 설정)의 경우 트랜잭션의 `GasTipCap`이 그대로 사용되어 커스텀 우선순위가 가능합니다.

따라서 pending 시간은 팁 금액이 아닌 논스 순서와 풀 용량에 의해 거의 전적으로 결정됩니다.

## 막힌 트랜잭션 교체하기

pending 트랜잭션을 교체하려면 동일한 논스와 원래보다 최소 **10% 높은** 가스 가격으로 새 트랜잭션을 제출하세요:

```typescript theme={null}
const replacement = await wallet.sendTransaction({
  to: originalTx.to,
  value: originalTx.value,
  nonce: originalTx.nonce,               // 동일한 논스
  maxPriorityFeePerGas: ethers.parseUnits("30360", "gwei"),  // 원래보다 ≥ 10% 높게
  maxFeePerGas: ethers.parseUnits("90000", "gwei"),
});
```

10% 범프 요구사항은 사소하게 높은 가스 팁으로 트랜잭션을 스팸 교체하는 것을 방지합니다.

## 풀 상태 검사

`txpool` 네임스페이스로 풀 상태를 검사합니다:

```typescript theme={null}
// 모든 pending 및 queued 트랜잭션
const content = await provider.send("txpool_content", []);

// pending 수와 queued 수
const status = await provider.send("txpool_status", []);
console.log("pending:", parseInt(status.pending, 16));
console.log("queued:", parseInt(status.queued, 16));

// 특정 주소의 트랜잭션
const mine = await provider.send("txpool_contentFrom", [wallet.address]);
```

## 풀 한도

| 한도          | 기본값      | 설명                     |
| ----------- | -------- | ---------------------- |
| 계정별 pending | 16 슬롯    | 발신자당 최대 pending 트랜잭션 수 |
| 계정별 queued  | 64 슬롯    | 발신자당 최대 queued 트랜잭션 수  |
| 전역 pending  | 5,120 슬롯 | 모든 발신자의 총 pending      |
| 전역 queued   | 1,024 슬롯 | 모든 발신자의 총 queued       |

풀이 가득 차면 우선순위가 가장 낮은 트랜잭션이 먼저 제거됩니다. RPC를 통해 로컬에서 제출된 트랜잭션은 보호되어 마지막으로 제거됩니다.

## 블록 포함 이후 처리

새 블록이 추가되면 풀이:

1. 블록에 포함된 트랜잭션을 제거합니다
2. 논스 공백이 채워진 queued 트랜잭션을 pending으로 승격합니다
3. 업데이트된 잔액에 대해 남은 트랜잭션을 재검증합니다
4. GovValidator에서 최신 가스 팁을 조회하고 필터링을 업데이트합니다

## 개발자 이점

* 풀 상태를 조회 가능 — `txpool_contentFrom`으로 내 트랜잭션을 모니터링
* 논스 공백이 막힌 트랜잭션의 주요 원인 — 동시 발신자에서 논스를 신중하게 관리
* 교체가 예측 가능 — 10% 가격 범프로 교체 보장

## 관련 문서

* [가스 및 수수료](/ko/v0.3/learn/gas-and-fees) — 거버넌스 팁 메커니즘
* [아키텍처 개요](/ko/v0.3/learn/architecture-overview) — 풀을 포함한 전체 트랜잭션 생명주기
* [RPC API 레퍼런스](/ko/v0.3/reference/rpc-api) — `txpool_content`, `txpool_status`
