키 하나, RPC 하나.
지갑에 그대로 붙습니다.
자연어를 구조화 인텐트로 파싱하고, 정책 검증을 거쳐, EIP-7702 위임으로 온체인 실행하는 미들웨어 SDK. GIWA 호환 지갑은 LLM API 키와 RPC 하나만 넣으면 통합이 끝납니다.
// 지갑이 SDK에 넘기는 값은 이게 전부입니다.
const config = {
llm: { provider: 'claude', apiKey }, // 'claude' | 'gemini' | 'gpt' 교체 가능
rpcUrl: 'https://sepolia-rpc.giwa.io', // GIWA RPC 하나
deployment, // 배포 주소 매니페스트
};
LLM은 틀릴 수 있습니다. 피해는 틀리지 않습니다.
LLM은 주소를 환각할 수 있고, 플래너는 소수점을 잘못 옮길 수 있습니다. 그래서 Leviosa는 세 겹으로 정확도와 안정성을 가져갑니다 — 표현 불가능하게 만들고, 호출 범위를 좁히고, 최종 상태를 측정합니다.
자연어는 절대 그대로 실행되지 않습니다. 먼저 스키마로 제약된 구조화 인텐트로 파싱됩니다. LLM은 타입이 정해진 스키마를 채울 뿐, 주소나 calldata는 만들 수 없습니다. “주소를 환각했다”가 완화할 리스크가 아니라 표현 불가능한 상태.
허용된 dApp만 호출됩니다. PolicyRegistry 화이트리스트에 등록된 컨트랙트·타깃만 실행 대상이 되므로, 표면이 예측 가능하게 유계됩니다. 검증된 Dapp부터 우선 지원하며 점진적으로 확장합니다.
위임체는 calldata가 “허용된 것처럼 보이는지”가 아니라, 배치 실행 후 실제로 빠져나간 순유출을 측정합니다. multicall 분해·approve 유출 같은 우회 경로가 구조적으로 닫히고, 위반하면 전체 revert.
발화도, 한도도, 가스도 전부 원(₩)
EIP-7702 위임으로 릴레이어가 가스를 대납합니다. 사용자는 ETH를 보유하거나 의식할 필요가 없고, 대납된 가스는 원화 가액으로 원장에 기록됩니다. 발화한 금액 그대로 결제되고, 수수료까지 원화로 환산되어 — 모든 행위가 원화 기준으로 성립합니다.
■ 릴레이어는 ETH로 가스를 지불하고, 원장의 feeKrw 필드에 원화 환산액이 남습니다. 사용자 화면에는 ETH가 등장하지 않습니다.
여섯 개의 레이어
■ 주황 레이어(L4·L5)가 집행 경계입니다. L1–L3에서 무엇이 생성되든, 최종 상태 변화가 L4·L5의 결정론적 방어를 통과하지 못하면 실행되지 않습니다.
설치부터 실행까지, 그대로 복붙
pnpm add @leviosa/sdk viem zod
import { createPublicClient, http } from 'viem';
import {
giwaSepolia, loadDeployment, safeParseIntent,
planIntent, precheckPlan, batchTypedData, Eip7702RelayAdapter,
} from '@leviosa/sdk';
import manifest from '@leviosa/contracts/deployments/91342.json';
const deployment = loadDeployment(manifest);
const publicClient = createPublicClient({ chain: giwaSepolia, transport: http() });
// 1. 파싱 — LLM의 유일한 역할. 주소도 calldata도 만들지 않습니다.
const parsed = safeParseIntent(await llm.classify('영희한테 5,600원 보내줘'));
if (!parsed.ok) throw new Error(parsed.error);
// 2. 플랜 — 연락처를 해석하고 배치를 인코딩. UP.ID는 resolver로 연결됩니다.
const plan = await planIntent(parsed.intent, {
deployment, account, resolver,
krwPerEth: 5_000_000n * 10n ** 18n,
nonce: await readBatchNonce(account),
deadline: BigInt(Math.floor(Date.now() / 1000) + 300),
});
// 3. 검증 — 온체인 가드를 미리 비춰 서명 전에 차단 사유를 설명.
const verdict = precheckPlan(plan, policyState);
if (!verdict.ok) return showBlocked(verdict.reason, verdict.detail);
// 4. 실행 — 사용자는 배치에 서명, 릴레이어가 가스를 대납.
const signature = await wallet.signTypedData(batchTypedData({ account, plan }));
const adapter = new Eip7702RelayAdapter({
publicClient, walletClient, relayer, delegate: deployment.delegate,
});
const { txHash } = await adapter.submitBatch(account, plan, signature);
LLM 구조화 출력을 Intent로 검증. 실패하면 실행 경로로 못 넘어감.
인텐트 → calldata 배치. 상대방은 resolver 조회로만 확정, 절대 생성 안 함. 스왑은 견적 없으면 MISSING_QUOTE로 거부.
온체인 가드의 오프체인 미러. 서명 전에 한국어로 차단 사유를 설명. 게이트가 아니라 설명용.
Eip7702RelayAdapter가 기본 구현. 인터페이스라 메인넷에서 4337 번들러 어댑터로 교체 가능.
모든 거래를 원화 문서로 내보내기
송금·스왑·수취 — 모든 실행이 실행 시점의 원화 가액으로 원장에 기록됩니다. SDK는 전체 tx 리스트를 CSV 문서로 export합니다. DEX 거래 내역과 transfer 이력이 한 장에 모여, 세무·회계 소프트웨어로 그대로 넘길 수 있습니다.
import { toCsv, summarise } from '@leviosa/sdk';
const rows = await ledger.rows(account); // 송금 · 스왑 · 수취 전부
const totals = summarise(rows); // 총 유출/유입/수수료 (원화)
const csv = toCsv(rows); // 세무·회계 인계용 문서
GIWA Sepolia · Chain ID 91342
RPC https://sepolia-rpc.giwa.io · 익스플로러 sepolia-explorer.giwa.io ↗ · Faucet faucet.giwa.io ↗