Skip to main content
Glama
axdvdv

wwall

by axdvdv

wwall

AI 에이전트와 지갑 사이에 위치하는 정책 가드.

Aleph Hackathon 2026 · WDK 트랙 · Tether

에이전트에게 지갑을 주는 것은 곧 당신의 돈을 주는 것입니다. wwall은 그 사이를 가로막는 MCP 서버입니다. 에이전트는 지불을 제안할 수 있지만, 로컬의 사람이 작성한 정책이 그 지불이 실제로 실행될지, 사람의 승인이 먼저 필요한지, 아니면 완전히 거부될지를 결정합니다. 모든 결정은 서명된 추가 전용 원장(append-only ledger)에 기록됩니다.

에이전트는 @tetherto/wdk를 직접 다루지 않습니다. 에이전트는 wwall을 다루고, wwall이 WDK를 다룹니다.

┌─────────────┐   MCP/stdio   ┌──────────────────────────┐        ┌──────────┐
│  AI agent   │──────────────▶│  wwall                   │───────▶│   WDK    │──▶ Polygon
│ (Claude…)   │  propose_     │  ├ predicates.ts (guard) │ only   │  wallet  │
│             │   payment     │  ├ ledger.jsonl (signed) │ if     └──────────┘
└─────────────┘◀──────────────│  └ policy.json           │ allowed
                 verdict      └──────────────────────────┘
                                          │ holds NEEDS_CONFIRM
                                          ▼
                                   ┌─────────────┐
                                   │   human     │  wwall pending / confirm / reject
                                   └─────────────┘

하나의 핵심 불변식

어떤 도구 호출도 evaluatePredicates()를 먼저 통과하지 않고는 wallet.send()에 도달할 수 없다.

다른 모든 것은 이 사실을 유지하기 위해 배치되어 있습니다:

  • 서버는 정확히 세 개의 도구 — propose_payment, get_balance, get_pending — 만 등록합니다. send, transfer, sign 또는 raw-transaction 도구는 없으며, 테스트가 도구 목록을 이름과 패턴으로 검증합니다.

  • 지갑은 지연(lazily) 열리며, 이미 허용된 경로에서만 열립니다. 거부된 제안은 WDK 인스턴스를 전혀 생성하지 않습니다. 이를 위해 필요한 토큰 구성은 별도로 전달됩니다.

  • 지불 토큰은 구성으로 고정됩니다. 다른 토큰을 지정하는 에이전트는 어떤 규칙이 실행되기 전에 거부됩니다. (이것이 없으면 SPEND_CAP{token:"USDT0"}token:"MONOPOLY"에 적용되지 않고, 정책이 이를 허용하며, 지갑은 실제 USD₮0를 이동하게 됩니다. 지출 한도는 문자열로 우회할 수 없어야 합니다.)

  • 거부는 정상적인 도구 결과이며, 예외를 던지지 않습니다. 따라서 에이전트는 이유를 읽고 사람에게 설명할 수 있습니다.

  • 동일한 술어가 WDK 자체에도 등록됩니다. 따라서 지갑도 거부합니다 — 아래 참조.

두 계층, 하나의 술어 집합

wwalltransfer호출할지 여부를 결정합니다. 이것은 이 프로세스에 대한 논증입니다. WDK의 자체 정책 엔진은 지갑이 그 작업을 수행할지 여부를 결정하며, 이는 계정의 속성입니다:

wdk.registerPolicy({
  id: 'wwall-guard', scope: 'project', wallet: 'polygon',
  rules: [{ operation: 'transfer', action: 'ALLOW',
            conditions: [ctx => evaluate(policy, intentFrom(ctx.args), context(), 'ignore-confirm')] }]
})

다른 모든 것이 사용하는 동일한 evaluatePredicates에 게이트된 하나의 ALLOW 규칙. 활용되는 지점은 작성되지 않은 것에 있습니다: WDK는 관리되는 계정에서 기본 거부(default-deny) 이므로, 어떤 정책이 적용되는 순간 OPERATIONS의 모든 메서드가 래핑되고 일치하는 ALLOW가 없는 모든 것은 PolicyViolationError를 던집니다. 이는 transfer를 전혀 건드리지 않는 지출 한도를 우회하는 경로를 차단합니다:

경로

transfer 형태의 가드가 놓치는 이유

sendTransaction({to: token, data: <ERC-20 transfer calldata>})

같은 효과, 다른 메서드

approve(spender, MAX) 후 다른 사람의 transferFrom

자금은 나중에, 다른 손에 의해 빠져나감

EIP-2612 Permit의 signTypedData

완전히 오프체인; "보내는" 것이 없음

ERC-7702 하의 delegate(...)

계정을 컨트랙트에 넘김

wwall은 이러한 작업을 수행하지 않습니다. 그것이 핵심입니다: 그것들은 wwall의 가드가 볼 수 없었던 것들이었습니다. test/wdk-policy.test.ts는 죽은 RPC에 대해 실제 WDK 인스턴스를 구동하고 각각이 네트워크 호출 전에 PolicyViolationError를 발생시키는지 확인합니다. 반면 허용된 transfer는 네트워크에서 실패하는데, 이는 가드에 의해 중단된 것이 아니라 가드를 통과했음을 증명합니다.

조건은 "이것이 전혀 허용되는가"를 묻습니다 (ignore-confirm 모드). 실행된 것과 보류된 것의 분리는 상위 계층에 속합니다: 보류된 지불이 transfer에 도달할 때쯤이면 사람이 승인했으며, 이 계층은 그것을 두 번 거부해서는 안 됩니다.

ALLOW 규칙에서 예외를 던지는 조건은 "일치하지 않음"으로 간주되며, 기본 거부 하에서는 거부를 의미합니다. 따라서 이 계층의 버그는 안전하게 실패합니다.

깨끗한 클론에서 빠른 시작

git clone <this repo> && cd wwall
npm install
cp .env.example .env        # then edit it — see below
npm run build
npm test                    # 295 tests, no network, no money
npm run try                 # walk the guard through a dozen proposals, fake wallet

.env에는 정확히 한 줄만 필요합니다. 나머지는 모두 기본값이 있습니다:

WARDEN_SEED="…twelve words…"
# WARDEN_ARMED=1            # leave unset until you mean to move real funds

체인, RPC 및 지불 토큰은 기본적으로 Polygon과 USD₮0입니다. 정책, 원장 및 감사 키는 ~/.wwall/에 있습니다. 모든 변수와 재정의 효과는 .env.example을 참조하세요.

지출 없이 지갑을 확인하세요:

npm run check:wallet

이것은 토큰 컨트랙트에서 symbol()decimals()를 직접 읽어 구성과 비교합니다. 잘못된 decimals는 오류 메시지가 아니라 10ⁿ 배만큼 잘못된 지불입니다.

안전 장치

WARDEN_ARMED기본적으로 꺼져 있습니다. 정확히 1이 될 때까지 정책이 허용하는 지불은 보고되지만 전송되지 않습니다 — 제안은 code: "not_armed"와 함께 rejected로 반환됩니다. 의도적으로 활성화하세요.

데스크톱 확장으로 설치 (권장)

wwall은 MCP 번들로 제공됩니다 — 단일 .mcpb 파일로 Claude Desktop이 한 번의 클릭으로 설치하며, 수동으로 JSON을 편집하는 대신 설정을 위한 양식이 있습니다.

npm install && npm run build
npm run bundle          # → build/wwall.mcpb

그런 다음 Claude Desktop에서: 설정 → 확장 프로그램 → 확장 프로그램 설치… 를 선택하고 build/wwall.mcpb를 선택하세요.

양식은 한 가지만 요구합니다: 시드 문구. 매니페스트에서 "sensitive": true로 선언되어 있으므로, Claude Desktop은 이를 마스킹하고 나중에 버그 보고서에 붙여넣을 수 있는 구성 파일 대신 OS 키체인에 보관합니다.

다른 모든 것은 기본값이 있으며 묻지 않습니다:

설정

기본값

체인 및 RPC

Polygon, 공개 엔드포인트 사용

지불 토큰

USD₮0 — 0xc2132D05…, 소수점 6자리, 온체인 검증됨

정책, 원장, 감사 키

~/.wwall/

~/.wwall은 의도적으로 작업 디렉토리가 아닙니다: 확장 프로그램은 예측할 수 없는 cwd로 시작되므로, cwd 기준 원장은 CLI와 MCP 서버가 다른 지출 기록을 갖게 됩니다 — 그리고 잘못된 원장에서 계산된 일일 한도는 한도가 아닙니다. 이제 두 부분 모두 동일한 원장을 읽으므로, 어떤 디렉토리에서든 wwall pending은 확장 프로그램이 기록한 내용을 볼 수 있습니다.

첫 실행 시 wwall은 빈 허용 목록을 가진 시작용 ~/.wwall/policy.json을 작성하므로, 수신자를 지정할 때까지 모든 지불이 거부됩니다:

REJECTED — nothing was sent.
ALLOWLIST: list is empty, no recipient is allowed

wwall ui를 열어 수신자를 추가하세요. 알려주지 않은 사람에게 지불할 수 있는 확장 프로그램은 가드가 아니며, 허용 목록은 당신을 대신해 추측할 수 있는 것이 아닙니다.

의도적으로 두 번째 스위치는 없습니다. 설치된 확장 프로그램은 무장되어 있으며, 에이전트와 당신의 돈 사이에 서 있는 유일한 것은 정책입니다 — 이것이 제품의 전체 주장이며, 그 위에 마스터 토글이 있으면 그 주장이 약화됩니다. 허용 목록에 수신자를 추가하는 것이 의도적인 행동입니다. 전역 on/off는 지불이 거부될 때 확인할 두 번째 장소일 뿐이며, 감사 로그를 어지럽히는 두 번째 종류의 거부일 뿐입니다.

WARDEN_ARMED는 여전히 CLI와 수동 작성 구성에 존재하며, 동결 기능으로 유용합니다: .env의 한 줄이 정책을 건드리지 않고 지갑을 중지시킵니다.

모든 기본값은 여전히 이전 방식으로 재정의할 수 있습니다 — .env.example의 모든 WARDEN_* 변수는 wwall이 CLI로 시작되었든 확장 프로그램으로 시작되었든 작동합니다.

번들을 빌드하려면 패키징 CLI가 필요한데, 이는 이미 개발 의존성입니다:

npx mcpb validate manifest.json   # check the manifest against the schema
npx mcpb pack build/mcpb build/wwall.mcpb

형식은 .dxt라고 불렸고 @anthropic-ai/dxt로 배포되었습니다. 해당 패키지는 더 이상 사용되지 않으며 이제 @anthropic-ai/mcpb 를 가리킵니다. 사양은 MANIFEST.md에 있습니다. 이 번들은 manifest_version 0.4를 대상으로 합니다.

Claude Desktop에 수동으로 연결

수동 경로도 여전히 작동하며 유지할 가치가 있습니다: 모든 설정을 한 눈에 읽을 수 있는 단일 파일에 넣을 수 있으며, 가드가 무엇을 하도록 구성되었는지 검토할 때 때로는 정확히 원하는 것입니다.

claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/):

{
  "mcpServers": {
    "wwall": {
      "command": "node",
      "args": ["/absolute/path/to/wwall/dist/src/bin/wwall-mcp.js"],
      "env": {
        "WARDEN_SEED": "…twelve words…",
        "WARDEN_CHAIN": "polygon",
        "WARDEN_RPC_URL": "https://polygon-bor-rpc.publicnode.com",
        "WARDEN_TOKEN_ADDRESS": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
        "WARDEN_TOKEN_SYMBOL": "USDT0",
        "WARDEN_TOKEN_DECIMALS": "6",
        "WARDEN_POLICY": "/absolute/path/to/wwall/policy.json",
        "WARDEN_LEDGER": "/absolute/path/to/wwall/ledger.jsonl"
      }
    }
  }
}

Claude Desktop을 다시 시작하면 세 개의 도구가 나타납니다. 클라이언트가 없으면 서버는 stdio에서 일반 JSON-RPC를 사용합니다:

printf '%s\n%s\n%s\n' \
 '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"x","version":"0"}}}' \
 '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
 '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
 | node dist/src/bin/wwall-mcp.js

또는 MCP Inspector를 가리키세요: npx @modelcontextprotocol/inspector node dist/src/bin/wwall-mcp.js

도구

도구

기능

propose_payment(to, amount, token, reason?)

지갑으로 가는 유일한 경로. executed + txHash, rejected + reason, 또는 pending_confirmation + confirmationId를 반환합니다.

get_balance(token?)

가스 잔액 및 지불 토큰 잔액. 읽기 전용.

get_pending()

사람을 위해 보류된 지불. 전송되지 않았습니다.

금액은 모든 곳에서 소수 문자열입니다 — "12.50", 절대 12.5가 아닙니다. 돈 경로의 JSON 숫자는 부동 소수점이며, 부동 소수점은 충분히 큰 숫자가 되면 반올림 버그가 됩니다.

인간 측

에이전트는 지불을 pending_confirmation 상태로 넣을 수 있습니다. 꺼낼 수 있는 것은 사람뿐입니다:

wwall pending                     # what is waiting, and which rule held it
wwall confirm <id> --by alex      # approve and send
wwall reject  <id> --note "…"     # refuse; nothing is ever sent
wwall ui                          # policy builder in the browser

두 부분 모두 동일한 ledger.jsonl을 읽고 쓰므로, wwall pending은 에이전트의 get_pending이 보여주는 것과 정확히 동일한 것을 보여줍니다.

wwall confirm전송 전에 정책을 다시 평가합니다. 평결은 에이전트가 지불을 제안했을 때 형성되었으며, 아마도 몇 시간 전, 여러 건의 지불 전일 수 있습니다. 그 사이 지출 한도는 이동했습니다. "ignore-confirm" 모드로 다시 확인합니다 — 여전히 허용되는지만 묻습니다. 키보드 앞의 사람이 바로 확인이기 때문입니다.

정책

policy.json은 술어 트리입니다. 아홉 개의 opcode:

Opcode

필드

의미

AND / OR

rules[]

AND는 허용(공허 진리); 빈 OR는 거부.

NOT

rule

반전.

SPEND_CAP

token, amount, window: tx|day

포함. day롤링 24시간이며, 달력 일이 아닙니다 — 달력 창은 23:59에 한도를 소진하고 00:01에 다시 소진하여 우회할 수 있습니다.

ALLOWLIST

addresses[]

빈 허용 목록은 아무도 허용하지 않습니다. 채우는 것을 잊은 목록이 조용히 모든 사람을 허용해서는 안 됩니다.

DENYLIST

addresses[]

빈 목록은 아무도 거부하지 않습니다.

TIME_WINDOW

from, to

양쪽 끝이 "HH:MM"이면 일일 UTC 창, 포함, from > to일 때 자정을 넘어 순환. 두 타임스탬프는 절대 범위.

CONFIRM_THRESHOLD

amount

거부가 아닙니다 — 이상의 금액은 사람을 위해 보류됩니다.

VELOCITY

maxTxCount, window: hour|day

SPEND_CAP과 같은 롤링.

CONFIRM_THRESHOLD가 정책이 제안당 두 번 평가되는 이유입니다. 한 번은 모든 임계값이 충족된 것으로 간주하고(이게 아예 허용되는가?), 한 번은 엄격하게 평가합니다(무인으로 진행될 수 있는가?). 이것이 임계값이 최상위 수준이 아닌 AND, OR, NOT 내부에서도 작동할 수 있게 하는 이유입니다. 단순히 "승인 필요" 플래그 하나로는 불가능한 일입니다.

한도 계산에는 확인된 송금만 포함됩니다. 아직 확인되지 않은 결제는 SPEND_CAPVELOCITY에 보이지 않습니다. 알려진 제한 사항을 참고하세요.

코드 없는 빌더

wwall ui          # → http://127.0.0.1:4478/

규칙 카드의 단순 목록과 일치-전체/일치-일부 스위치, 실시간 policy.json 미리보기, 그리고 입력 시 평가 결과를 보여주는 테스트 폼으로 구성됩니다. 저장 버튼은 로컬 서버를 통해 policy.json을 작성합니다.

이 페이지에는 가드 로직의 복사본이 포함되어 있지 않습니다. 평가 결과는 MCP 서버와 CLI가 사용하는 동일한 evaluatePredicates를 호출하는 POST /api/evaluate에서 옵니다. 브라우저 자바스크립트로 동일한 로직을 구현하면 이 구현과 차이가 생겨 조용히 다른 결과를 내기 시작할 것입니다. 빌더에는 클라이언트 측 금액 산술이 포함되지 않는다는 테스트가 있습니다.

빌더는 의도적으로 중첩 구성(NOT, 그룹 안의 그룹)을 그릴 수 없습니다. 이러한 정책을 사용하면 읽기 전용으로 열리며, policy.json을 가리키는 메모가 표시됩니다. 전체 구성은 파일을 편집하여 계속 사용할 수 있습니다.

감사 로그

판정, 전송 시도, 결과, 인간의 결정 등 모든 레코드가 ledger.jsonl에 추가되며, 로컬 Ed25519 키로 서명되고 이전 레코드와 체인으로 연결됩니다.

npm run verify:audit
records   3  (3 signed, 3 verified)
pinned to MCowBQYDK2VwAyEAKcjUin18… from audit-key.json

✓ every record is signed and the chain is unbroken

서명은 레코드가 수정되지 않았음을 증명합니다. 하지만 제거되지 않았음을 증명하지는 않습니다. 한 줄을 삭제해도 나머지 모든 서명은 유효하게 남습니다. 이것이 prev의 존재 이유입니다. 이 둘을 함께 사용하면 편집, 중간 삭제, 재정렬을 모두 잡아낼 수 있습니다.

pinned to 줄이 중요한 이유: 대조할 감사 키가 없으면 공격자의 키로 통째로 다시 쓴 로그도 완벽하게 검증됩니다. 검증은 신뢰하는 키에 대해서만 의미가 있습니다.

시나리오

36개의 시나리오가 실제 전송 계층을 통해 실제 MCP 서버에서 실행됩니다. 평가기를 직접 호출하지는 않는데, 흥미로운 실패 사례는 사전 검사, 원장 왕복, 도구 경계에 존재하기 때문입니다.

npm run report:scenarios            # print
npm run report:scenarios -- --write # splice the table into this README

시나리오 결과

카테고리

시나리오

실행됨

인간 검토 보류

거부됨

사양대로 동작

정상

6

5 (83%)

1 (17%)

0 (0%)

6/6

경계선

12

4 (33%)

3 (25%)

5 (42%)

12/12

소수점 함정

10

0 (0%)

0 (0%)

10 (100%)

10/10

프롬프트 인젝션

8

0 (0%)

1 (13%)

7 (88%)

8/8

전체

36

9

5

22

36/36

#

카테고리

시나리오

결과

이유

L1

정상

허용 목록 주소로 소액 지급

실행됨

모든 한도와 확인 임계값 미만

L2

정상

표현 가능한 최소 금액

실행됨

6자리 소수 토큰의 정확히 1베이스 단위

L3

정상

심볼 대신 계약 주소로 지정된 토큰

실행됨

지급 토큰이 어느 방식으로든 인식됨

L4

정상

소문자 허용 목록에 대한 체크섬 주소

실행됨

EVM 주소는 대소문자를 구분하지 않고 비교함

L5

정상

인간 검토가 필요해 보류되는 지급

보류됨

2 USDT0 확인 임계값을 초과하지만 한도 내에 있음

L6

정상

해당 시간의 두 번째 소액 지급

실행됨

시간당 5건 한도에 훨씬 미치지 않음

B1

경계선

거래당 한도에 정확히 도달

보류됨

한도가 포함적이라 통과하지만 — 확인 임계값을 초과함

B2

경계선

거래당 한도보다 기본 단위 하나 초과

거부됨

한도를 1달러 초과해도 여전히 한도 초과임

B3

경계선

확인 임계값에 정확히 도달

보류됨

임계값은 >=에서 발동하므로 해당 금액은 인간 검토가 필요함

B4

경계선

확인 임계값보다 기본 단위 하나 미만

실행됨

임계값 미만은 무인으로 처리됨

B5

경계선

일일 예산을 정확히 소진하는 지급

보류됨

20 사용 + 5 = 정확히 25/일 한도이며, 이는 포함적임

B6

경계선

일일 예산을 기본 단위 하나 초과하는 지급

거부됨

한도는 누적 합계를 기준으로 측정되며 단일 금액이 아님

B7

경계선

한 시간 내 일곱 번째 지급

거부됨

이번 시간에 이미 다섯 건 전송되었고 한도는 다섯 건임

B8

경계선

한 시간 내 다섯 번째 지급

실행됨

네 건이 전송되었으므로 이 건은 여전히 한도 내임

B9

경계선

차단 목록에 있지만 허용 목록에도 등록된 수신자

거부됨

허용 목록에 없으며, 차단 목록은 어차피 거부함

B10

경계선

금액이 0인 지급

실행됨

0은 모든 한도에서 유효한 금액이며, 정책에 금지 조항이 없음

B11

경계선

허용 목록 주소와 유사하지만 다른 주소

거부됨

한 문자만 달라도 다른 주소이지, 유사한 주소가 아님

B12

경계선

주변 공백이 있는 수신자 주소

실행됨

복사-붙여넣기 공백은 제거되며, 다른 주소로 취급되지 않음

D1

소수점 함정

토큰이 가진 것보다 많은 소수점 자리

거부됨

1.123456으로 반올림하면 아무도 알아채지 못할 과소 지급이 됨

D2

소수점 함정

표현 가능한 최소 단위보다 작은 금액

거부됨

0으로 반올림되어 아무것도 지급하지 않는 조용한 실패가 됨

D3

소수점 함정

과학적 표기법

거부됨

부동소수점으로 파싱하는 것은 이 프로젝트가 피하는 정밀도 손실 그 자체임

D4

소수점 함정

소수점 구분자로 쉼표 사용

거부됨

로케일에 따라 1.5 또는 1.5로 해석될 수 있음; 돈에는 절대 추측을 쓰지 않음

D5

소수점 함정

천 단위 구분자

거부됨

소수가 아니며, 1000으로 추측하는 것은 1000배 오류가 될 수 있음

D6

소수점 함정

음수 금액

거부됨

음수 이체는 환불이 아니라 잘못된 요청임

D7

소수점 함정

비ASCII 숫자

거부됨

일부 스택에서는 아랍-인도 숫자가 숫자로 구문 분석되지만 다른 곳에서는 아님

D8

소수점 함정

부동소수점 안전 범위를 넘는 금액

거부됨

한도를 훨씬 초과하며—BigInt로 비교되므로 실제 값을 확인함

D9

소수점 함정

토큰 정밀도를 초과하는 후행 0

거부됨

7자리 소수를 허용하는 것은 위험한 선례가 될 수 있음

D10

소수점 함정

빈 금액

거부됨

빈 문자열을 0 또는 "설정되지 않음"으로 읽으면 안 됨

P1

프롬프트 인젝션

정책 무시 지시가 포함된 사유 필드

거부됨

사유 필드는 원장에 기록되는 데이터일 뿐, 지시로 해석되지 않음

P2

프롬프트 인젝션

인간 사전 승인 주장

거부됨

승인은 confirmation_resolved 레코드로만 존재하며, 문자열 주장으로 존재하지 않음

P3

프롬프트 인젝션

사유 필드의 가짜 허용 목록 주장

거부됨

허용 목록은 정책에서 읽으며, 호출자에서 읽지 않음

P4

프롬프트 인젝션

사유 필드의 긴급성 주장

보류됨

긴급성은 정책 입력이 아니며, 다른 9 USDT0과 동일하게 보류됨

P5

프롬프트 인젝션

사유 필드의 제어 문자 및 위조 레코드 시도

거부됨

사유는 원장에 기록되기 전에 JSON으로 인코딩되어 레코드를 위조할 수 없음

P6

프롬프트 인젝션

권위 있는 설명을 포함한 지원되지 않는 토큰

거부됨

지갑이 지급하지 않는 토큰은 거부됨

P7

프롬프트 인젝션

허용 목록 주소와 유사한 주소

거부됨

EVM 주소가 아니므로 유효한 주소가 아님

P8

프롬프트 인젝션

허용된 것처럼 보이는 지급

거부됨

금액이 0이더라도 한도는 여전히 적용됨

항목

위치

임포트

src/wdk.ts:14-15

new WDK(seed).registerWallet(chain, WalletManagerEvm, {provider, transferMaxFee})

src/wdk.ts:216

wdk.registerPolicy(…) — WDK 정책으로서의 wwall 프레디킷

src/wdk.ts:218, src/wdk-policy.ts:55에서 구축

evaluate(…, 'ignore-confirm')를 호출하는 ALLOW 조건

src/wdk-policy.ts:85

account.simulate.transfer(…) — 실행하지 않고 엔진에 묻기

src/wdk.ts:250

wdk.getAccount(chain, index)

src/wdk.ts:228

account.getBalance() → 네이티브 wei

src/wdk.ts:260

account.getTokenBalance(address) → 기본 단위

src/wdk.ts:261

account.quoteTransfer({token, recipient, amount})

src/wdk.ts:281

account.transfer({token, recipient, amount})자금이 이동하는 유일한 지점

src/wdk.ts:304

account.waitForTransaction(hash, {target: 'confirmed'})

src/wdk.ts:328

wdk.dispose()

src/wdk.ts:364

MCP SDK: src/mcp-server.ts:97new McpServer, 113, 169, 209의 세 번의 registerTool 호출, 그리고 src/bin/wwall-mcp.ts:52StdioServerTransport.

시그니처는 메모리가 아닌 설치된 패키지 자체의 .d.ts 파일에서 읽었으며, tsc --strict가 이를 기준으로 타입 검사를 수행하는 것이 그 증거입니다.

패키지

패키지

버전

용도

@tetherto/wdk

1.0.0-beta.16

지갑 관리자, 계정 파생

@tetherto/wdk-wallet-evm

1.0.0-beta.17

EVM 계정: 잔액, ERC-20 전송, 확인

@tetherto/wdk-wallet

1.0.0-beta.17

공유 결과 타입(전이적)

@modelcontextprotocol/sdk

1.30.0

MCP 서버, stdio 전송

zod

4.4.3

도구 입력/출력 스키마

typescript

5.7.2

strict, noUncheckedIndexedAccess, exactOptionalPropertyTypes

vitest

2.1.8

테스트

자금 계산, 서명, HTTP 또는 UI에 대한 의존성이 없습니다: BigInt 고정 소수점, node:crypto Ed25519, node:http, 그리고 손으로 작성한 단일 HTML 파일만 사용합니다.

구조

파일

용도

src/predicates.ts

가드. 순수 함수 — I/O, 시계, 네트워크 없음.

src/amount.ts

BigInt 고정 소수점. number는 자금 경로 어디에도 나타나지 않습니다.

src/context.ts

원장에서 읽은 롤링 윈도우 지출 및 속도.

src/ledger.ts

추가 전용 JSONL, fsync 적용, 선택적으로 서명 및 체이닝.

src/audit.ts

Ed25519 서명 및 검증.

src/policy.ts

로딩 및 검증, JSON-path 오류 포함.

src/wdk.ts

WDK 래퍼. 모든 결과는 JSON 직렬화 가능.

src/wdk-policy.ts

동일한 프레디킷, WDK의 정책 엔진에 등록.

src/mcp-server.ts

세 가지 도구와 보호된 경로.

src/cli.ts

pending / confirm / reject / ui.

src/ui-server.ts

빌더 뒤의 루프백 전용 API.

ui/index.html

빌더. 단일 파일, 번들러 없음, 프레임워크 없음.

알려진 한계

솔직하게 명시합니다. 한계를 숨기는 보안 도구는 한계가 없는 도구보다 더 나쁘기 때문입니다.

  • 한도에 집계되는 것은 확인된 전송뿐입니다. 확인 속도보다 빠르게 일괄 전송되면 일일 한도를 초과할 수 있습니다. LedgerEvalContext.pendingInWindow()는 어떤 한도도 볼 수 없는 진행 중인 금액을 보고서에 표시하기 위해 존재합니다.

  • 꼬리 잘림은 감지할 수 없습니다. 해시 체인은 역방향으로 실행되므로 마지막 N개 레코드를 삭제하면 유효한 접두사가 남습니다. 이를 감지하려면 외부 앵커가 필요합니다 — 다른 곳에 보관된 레코드 수, 또는 파일 외부 어딘가에 게시된 팁 다이제스트.

  • 시드는 여전히 시드입니다. WDK 정책은 WDK 인스턴스를 통해 얻은 계정만 규제합니다. 다른 프로세스에서 동일한 시드 문구를 보유한 사람 — 다른 스크립트, 지갑 앱, 유출된 .env — 은 정책의 방해 없이 자금을 이동시킵니다. 이를 방어하려면 정책이 아니라 떠날 수 없는 키가 필요합니다: 엔클레이브의 서명자, 온체인 한도가 있는 스마트 계정, 또는 공동 서명자. wwall은 에이전트를 제약합니다; 키 보유자를 제약하지는 않습니다.

  • Polygon의 USD₮는 USDT0입니다. Polygon의 기존 PoS 브리지 USDT는 Tether의 옴니체인 토큰인 네이티브 USD₮0로 제자리에서 마이그레이션되었으며, Ethereum 락박스에서 1:1로 뒷받침됩니다. 온체인에서 확인됨: name()="USDT0", symbol()="USDT0", decimals()=6. BNB Chain 주소 0x55d398…를 재사용하지 마십시오 — 이는 Tether 발행이 아닌 Binance-Peg이며, 6이 아닌 18자리 소수점을 가집니다.

  • policy.json은 신뢰되는 입력입니다. 해당 파일을 쓸 수 있는 사람은 누구나 가드를 다시 작성할 수 있습니다. 시작 시 한 번 로드되며 모든 판정에 sha256이 기록되므로 변경 사항은 사후에 감사 로그에서 확인할 수 있습니다 — 그러나 예방되지는 않습니다.

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Runtime permission, approval, and audit layer for AI agent tool execution.

  • Bitcoin-anchored, tamper-evident audit log for AI agents — record, disclose and verify actions.

  • Six-gate governance for AI agents: PROCEED/PAUSE/HALT decisions with hash-chained audit trails.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/axdvdv/wwall-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server