Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
공급업체 허용목록·지불 한도·30일 상한을 Stellar 스마트 계정이 검증, 금고 이탈 전 확인. 테스트넷 데모
Supplier allowlists, payment limits and a 30-day cap, checked by a Stellar smart account before anything leaves the treasury. Testnet demo.
금융JavaScript · TypeScriptGitHub @Dabuca온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Internal controls for stablecoin treasuries, enforced by the account itself.
Arqueo turns a treasury approval matrix into rules on a Stellar smart account. The account checks who signed, which supplier receives the payment, and whether the amount fits its policy before the transaction can settle.
Testnet only. This demo uses Circle USDC on Stellar testnet and test XLM. They have no real value. Do not use it to hold or move real funds.
Live app: arqueo-arqueo2.vercel.app (testnet only).
Arqueo was built for HackMeridian 2026 · Genesis · Stellar Composed. It
combines Stellar smart accounts and smart-account-kit with OpenZeppelin
account policies and a custom Soroban control policy.
Small companies and associations often keep treasury funds behind one key. Payment approvals happen in chat, and auditors receive screenshots after the fact. Those processes record decisions, but they do not stop a payment that breaks the policy.
Arqueo puts the authorization rules on the treasury account. An ordinary payment needs the employee signer and must meet the account's supplier and spending controls. A large payment uses a separate rule that requires the employee and manager. The account evaluates the transaction; the web app is not the security boundary.
flowchart LR
Faucet["Circle testnet USDC faucet<br/>manual request"]
subgraph App["Web app · React + Vite · testnet only"]
direction TB
Pay["Payments"]
Set["Settings<br/>admin only"]
Ctl["src/controls<br/>limits, suppliers, rule per amount<br/>no network"]
Logs[("Payment journal and<br/>settings change log<br/>local to the browser")]
Aud["Auditor<br/>read-only · CSV"]
end
Stellar["src/lib/stellar.ts<br/>the only door to the network<br/>smart-account-kit 0.6.0"]
subgraph Chain["Stellar testnet"]
direction TB
Account["OpenZeppelin smart account"]
Admin["rule admin<br/>admin passkey<br/>adds and removes rules"]
Ord["rule ordinary<br/>employee key"]
Large["rule large<br/>employee + manager passkey"]
subgraph Pol["Policies on the rules"]
Thr["threshold policy<br/>ordinary 1 of 1 · large 2 of 2"]
CP["control-policy (ours)<br/>suppliers · per-payment max · 30-day cap<br/>max and cap on ordinary only"]
end
SAC["XLM or Circle USDC Stellar Asset Contract<br/>transfer(from, to, amount)"]
Account --- Admin
Account --- Ord
Account --- Large
Ord --> Pol
Large --> Pol
Pol -->|"all checks pass"| SAC
end
Faucet -.->|"test USDC for funding"| Account
Pay --> Ctl
Set --> Ctl
Pay -.->|"every attempt"| Logs
Set -.->|"every change"| Logs
Logs --> Aud
Pay --> Stellar
Set --> Stellar
Stellar --> Account
The same diagram, with a reading guide and a table of what the account enforces, is in docs/architecture.md.
The browser journal records accepted and rejected attempts for this demo. Rejected simulations do not create an on-chain transaction. Accepted rows link to Stellar Expert by transaction hash. The MVP journal is local to the browser; it is not yet reconstructed from chain history.
| Rule | Signers | Account controls |
|---|---|---|
ordinary | Employee | Authorized supplier, per-payment maximum, and 30-day spending policy |
large | Employee + manager | Authorized supplier and two signatures |
admin | Admin passkey | Adds or removes account rules and signers |
The app's default demo amounts are 200, 800, and 100 in the selected asset. The same numeric limits apply independently to XLM and USDC, with a separate on-chain spend total for each asset. Amounts are converted to seven-decimal stroops before contract calls. For USDC, request Circle testnet tokens from its faucet to the treasury's Circle USDC trustline. The app includes an optional funding account and transfer flow when the faucet cannot fund the smart account directly; it never holds an issuer key.
contracts/control-policy/ — Soroban policy contract for supplier allowlists
and per-payment limits.app/src/lib/stellar.ts — the app's only entry point for Stellar network
calls.app/src/controls/ — pure TypeScript control-matrix logic and unit tests.app/src/pages/ — landing page, payment screen, and read-only auditor
journal.docs/submission/ — pitch deck, demo-video script, and draft submission
answers.f7af3add…7ee12a8e.control-policy error 2; the same amount with employee + manager was accepted
at ledger 5,386,036. Transaction:
03784fdb…63f711d2.ordinary rule to a
testnet account outside the supplier list was refused with "Supplier not
authorized" (control-policy error 1). A refused payment never reaches the
chain, so there is no hash; the check and the recipient's unchanged balance
are in docs/evidence-R6-scene3.md./cashout shows how a paid supplier would
withdraw test USDC to a bank account through a Stellar anchor (SEP-24). No
funds move and no anchor is contacted; a real withdrawal needs an asset the
anchor accepts and suppliers who hold their own keys.The employee signing key is stored in this browser as a demo shortcut. In production, every person should sign with their own passkey on their own device. The manager already can: when creating the company account, tick "Register the manager's passkey on a phone" and the browser shows a QR code (the WebAuthn cross-device flow). The manager's passkey is created on their phone, and the second signature of a large payment is a QR scan confirmed with a fingerprint or face. The phone has to be near the computer (Bluetooth); there is no remote approval link yet. The kit's default deployer key is derived from a public seed and is for testnet use only; this app uses a separate random testnet deployer key stored in browser storage.
Requirements: Node.js 22+, npm, Rust/Cargo, Stellar CLI, and Stellar Scaffold CLI.
Install the workspace dependencies:
npm ci
Create the local app environment file:
Copy-Item app/.env.example app/.env.local
In app/.env.local, configure PUBLIC_CONTROL_POLICY_ADDRESS (the new
per-token deployment used for XLM), PUBLIC_USDC_CONTROL_POLICY_ADDRESS
(the existing USDC deployment), and PUBLIC_SUPPLIERS with funded testnet
supplier addresses. Keep any private keys in local-only environment files;
never commit them.
Start the app:
npm run start --workspace app
The account and policy addresses in the example environment are for Stellar testnet. Do not change the network passphrase or RPC to point this demo at mainnet.
npm test --workspace app
npm run build --workspace app
cargo test --manifest-path contracts/control-policy/Cargo.toml
The UI and control tests do not require a wallet or real funds. End-to-end payment tests require testnet configuration and testnet accounts.
Apache-2.0. See LICENSE.