// the_machine

How it works

alvinmunk turns trust into something you can see — and other apps can read. Here's the whole machine, including the limits.

The vouch loop

scroll ↓
01

Vouch

Pick someone you trust and add one line — why. No address needed; you get a share link that lights a star for them.

mint · one line
02

Claim

They open the link, connect in a single tap (fees sponsored), and claim their half. Two halves become one card; both earn Social XP.

one tap · sponsored
03

Constellation

Every claimed vouch adds a star. Your profile is a living constellation that grows with the people who back you — readable by any app.

on-chain · forever

Two kinds of XP

track // socialA
CLOUT · NOT CASH

Social XP

Earned from vouches. Powers your rank, leaderboard, and clout. It is never cashable — and that's on purpose.

track // earnedB
UNLOCKS USDC

Earned XP

Earned only from attester-verified quests. It is the only track that can unlock USDC rewards.

Anti-sybil, honestly

We'd rather show you the limits than pretend they don't exist.

constraints // enforced06
LIM-01

First-pair-only

A repeated A→B vouch mints the card but grants 0 extra XP — no back-and-forth pumping.

LIM-02

Daily cap

A wallet can only mint so many vouches per day (on-chain counter).

LIM-03

Two-track split

Vouches earn clout, not cash. Only verified quests touch the treasury.

LIM-04

Ring detection

Reciprocal rings (A↔B) are flagged off-chain and can be frozen.

LIM-05

Circuit breaker

A per-reward amount + a global daily cap bound every payout.

LIM-06

Proof-of-funding

On mainnet, a wallet must have received external value before it can cash out.

For developers

alvinmunk emits a canonical attestation primitive. Any app can read a wallet's reputation straight from the contract, with no API key and no backend.

read-reputation.mjs
import {
  Account,
  Address,
  Contract,
  Keypair,
  Networks,
  TransactionBuilder,
  rpc,
  scValToNative,
} from '@stellar/stellar-sdk';

const server = new rpc.Server('https://soroban-testnet.stellar.org');
const contractId = 'CBP34OU4D2RN22PVGH5G5EN4HDWHAD5I7VCOLPPB4RD6NMKBJMXY6KT5'; // reputation contract (testnet)
const address = 'GDIS5BDXSI2DDJNTKRZPI6MNB5XCLMN4Z6PPRPM4RQLZ3PSQ2YTERLFA';

// A read-only view is simulated: nothing is signed or paid, so any well-formed
// source account works.
async function read(method) {
  const source = new Account(Keypair.random().publicKey(), '0');
  const tx = new TransactionBuilder(source, { fee: '100', networkPassphrase: Networks.TESTNET })
    .addOperation(new Contract(contractId).call(method, new Address(address).toScVal()))
    .setTimeout(30)
    .build();
  const sim = await server.simulateTransaction(tx);
  if (rpc.Api.isSimulationError(sim)) throw new Error(sim.error);
  return scValToNative(sim.result.retval);
}

const social = await read('get_score'); // Social XP: from vouches, never cashable
const earned = await read('get_earned'); // Earned XP: from verified quests, the USDC-eligible track
console.log({ social, earned }); // u64 decodes to BigInt, e.g. { social: 15n, earned: 0n }