Skip to content

Instantly share code, notes, and snippets.

@0xRampey
Created June 24, 2026 19:02
Show Gist options
  • Select an option

  • Save 0xRampey/2f7da1e9aa3c7e064d3c7f5752d84dd9 to your computer and use it in GitHub Desktop.

Select an option

Save 0xRampey/2f7da1e9aa3c7e064d3c7f5752d84dd9 to your computer and use it in GitHub Desktop.
emv-validator #16 — merchant-chosen merchant IDs (visual summary)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>emv-validator #16 — merchant-chosen merchant IDs</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.7.0/dist/tabler-icons.min.css">
<style>
:root{
--color-background-primary:#ffffff; --color-background-secondary:#f4f3ee; --color-background-tertiary:#faf9f5;
--color-background-success:#EAF3DE; --color-background-danger:#FCEBEB; --color-background-warning:#FAEEDA;
--color-text-primary:#1d1c1a; --color-text-secondary:#6f6e69; --color-text-tertiary:#9a9994;
--color-text-success:#27500A; --color-text-danger:#791F1F; --color-text-warning:#633806;
--color-border-tertiary:rgba(0,0,0,0.12); --color-border-secondary:rgba(0,0,0,0.22);
--font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
--font-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
--border-radius-md:8px; --border-radius-lg:12px;
}
@media (prefers-color-scheme: dark){:root{
--color-background-primary:#2b2a24; --color-background-secondary:#34332c; --color-background-tertiary:#1f1e19;
--color-background-success:#1c2b12; --color-background-danger:#3a1717; --color-background-warning:#33260a;
--color-text-primary:#ecebe6; --color-text-secondary:#a9a89f; --color-text-tertiary:#7d7c74;
--color-text-success:#C0DD97; --color-text-danger:#F09595; --color-text-warning:#FAC775;
--color-border-tertiary:rgba(255,255,255,0.14); --color-border-secondary:rgba(255,255,255,0.24);
}}
*{box-sizing:border-box}
body{background:var(--color-background-tertiary);color:var(--color-text-primary);font-family:var(--font-sans);margin:0;padding:28px 16px;line-height:1.5}
.wrap{max-width:720px;margin:0 auto}
h1{font-weight:500;color:var(--color-text-primary)}
a{color:#185FA5;text-decoration:none}
a:hover{text-decoration:underline}
</style>
</head>
<body>
<div class="wrap">
<div style="display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:1.1rem;">
<div>
<div style="display:flex; align-items:center; gap:6px; color:var(--color-text-secondary); font-size:13px;">
<i class="ti ti-git-pull-request" style="font-size:15px" aria-hidden="true"></i>
<span>colossus-credit/emv-validator · #16 · AcquirerConfig.sol</span>
</div>
<h1 style="margin:6px 0 0; font-size:22px;">Merchant-chosen merchant IDs</h1>
<p style="margin:2px 0 0; color:var(--color-text-secondary); font-size:14px;">Decouple the on-chain merchant ID from the merchant address</p>
</div>
<span style="white-space:nowrap; background:var(--color-background-success); color:var(--color-text-success); font-size:12px; padding:4px 12px; border-radius:var(--border-radius-md);"><i class="ti ti-check" style="font-size:13px; vertical-align:-1px;" aria-hidden="true"></i> mergeable</span>
</div>
<div style="display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; margin-bottom:1.25rem;">
<div style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:0.85rem 1rem;">
<div style="font-size:13px; color:var(--color-text-secondary);">forge tests</div>
<div style="font-size:24px; font-weight:500;">92 <span style="font-size:13px; color:var(--color-text-secondary); font-weight:400;">passed</span></div>
</div>
<div style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:0.85rem 1rem;">
<div style="font-size:13px; color:var(--color-text-secondary);">files changed</div>
<div style="font-size:24px; font-weight:500;">2</div>
</div>
<div style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:0.85rem 1rem;">
<div style="font-size:13px; color:var(--color-text-secondary);">diff</div>
<div style="font-size:24px; font-weight:500;"><span style="color:var(--color-text-success);">+28</span> <span style="color:var(--color-text-danger);">&minus;34</span></div>
</div>
</div>
<div style="display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-bottom:1.25rem;">
<div style="background:var(--color-background-primary); border:0.5px solid var(--color-border-tertiary); border-radius:var(--border-radius-lg); padding:1rem 1.1rem;">
<div style="display:flex; align-items:center; gap:6px; margin-bottom:10px;">
<i class="ti ti-alert-triangle" style="font-size:16px; color:var(--color-text-danger);" aria-hidden="true"></i>
<span style="font-size:13px; font-weight:500; color:var(--color-text-danger);">Before · v0.0.4</span>
</div>
<div style="font-family:var(--font-mono); font-size:12px; background:var(--color-background-secondary); padding:6px 8px; border-radius:var(--border-radius-md); margin-bottom:10px;">merchantId = uint120(uint160(addr))</div>
<p style="margin:0; font-size:13px; color:var(--color-text-secondary); line-height:1.6;">ID = low 15 bytes of the address &mdash; binary. EMV <span style="font-family:var(--font-mono);">9F16</span> is <span style="font-family:var(--font-mono);">ans</span>/15 (ASCII), so kernels mangle it: PAX <span style="font-family:var(--font-mono);">792B</span> hex-encoded it &rarr; zero-fill &rarr; <span style="font-family:var(--font-mono); color:var(--color-text-danger);">InvalidAcquirerId</span>.</p>
</div>
<div style="background:var(--color-background-primary); border:0.5px solid var(--color-border-tertiary); border-radius:var(--border-radius-lg); padding:1rem 1.1rem;">
<div style="display:flex; align-items:center; gap:6px; margin-bottom:10px;">
<i class="ti ti-circle-check" style="font-size:16px; color:var(--color-text-success);" aria-hidden="true"></i>
<span style="font-size:13px; font-weight:500; color:var(--color-text-success);">After · #16</span>
</div>
<div style="font-family:var(--font-mono); font-size:12px; background:var(--color-background-secondary); padding:6px 8px; border-radius:var(--border-radius-md); margin-bottom:10px;">setMerchant(uint120 merchantId, &hellip;)</div>
<p style="margin:0; font-size:13px; color:var(--color-text-secondary); line-height:1.6;">Merchant registers its own 15-byte id. A clean 15-char ASCII id (<span style="font-family:var(--font-mono);">MERCHANT0000001</span>) fits <span style="font-family:var(--font-mono);">9F16</span> exactly. Registry + <span style="font-family:var(--font-mono);">EMVSettlement</span> unchanged; still card-signed.</p>
</div>
</div>
<div style="margin-bottom:1.25rem;">
<div style="font-size:13px; color:var(--color-text-secondary); margin-bottom:6px;">the change</div>
<div style="font-family:var(--font-mono); font-size:12.5px; background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:10px 12px; line-height:1.75; overflow-x:auto; white-space:nowrap;">
<div style="color:var(--color-text-danger);">&minus; function setMerchant(uint48 acquirerId)</div>
<div style="color:var(--color-text-success);">+ function setMerchant(uint120 merchantId, uint48 acquirerId)</div>
<div style="color:var(--color-text-danger);">&minus; function removeMerchant()</div>
<div style="color:var(--color-text-success);">+ function removeMerchant(uint120 merchantId)</div>
<div style="color:var(--color-text-danger);">&minus; function getMerchantId(address)&nbsp;&nbsp;<span style="color:var(--color-text-tertiary);">// removed</span></div>
</div>
</div>
<div style="font-size:13px; color:var(--color-text-secondary); margin-bottom:6px;">routing (unchanged, still card-signed)</div>
<div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:1.25rem;">
<span style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:6px 10px; font-size:12.5px;"><i class="ti ti-credit-card" style="font-size:14px; vertical-align:-2px; margin-right:4px;" aria-hidden="true"></i>card signs 9F16</span>
<i class="ti ti-arrow-right" style="color:var(--color-text-tertiary); font-size:15px;" aria-hidden="true"></i>
<span style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:6px 10px; font-size:12.5px; font-family:var(--font-mono);">EMVSettlement &rarr; uint120(bytes15)</span>
<i class="ti ti-arrow-right" style="color:var(--color-text-tertiary); font-size:15px;" aria-hidden="true"></i>
<span style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:6px 10px; font-size:12.5px; font-family:var(--font-mono);">merchantData[id]</span>
<i class="ti ti-arrow-right" style="color:var(--color-text-tertiary); font-size:15px;" aria-hidden="true"></i>
<span style="background:var(--color-background-secondary); border-radius:var(--border-radius-md); padding:6px 10px; font-size:12.5px;"><i class="ti ti-building-store" style="font-size:14px; vertical-align:-2px; margin-right:4px;" aria-hidden="true"></i>merchant payout</span>
</div>
<div style="background:var(--color-background-warning); border-radius:var(--border-radius-md); padding:10px 14px; display:flex; gap:8px; align-items:flex-start;">
<i class="ti ti-flag" style="font-size:16px; color:var(--color-text-warning); margin-top:2px;" aria-hidden="true"></i>
<p style="margin:0; font-size:13px; color:var(--color-text-warning); line-height:1.6;"><span style="font-weight:500;">Pilot tradeoff &mdash;</span> free-choice id is first-come, so squatting is possible. Acceptable here (merchants self-register and self-configure their terminals). Anti-squat via acquirer-gated onboarding is a deferred follow-up.</p>
</div>
<div style="margin-top:1rem; font-size:13px;">
<a href="https://github.com/colossus-credit/emv-validator/pull/16"><i class="ti ti-external-link" style="font-size:14px; vertical-align:-2px; margin-right:4px;" aria-hidden="true"></i>github.com/colossus-credit/emv-validator/pull/16</a>
</div>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment