Created
June 24, 2026 19:02
-
-
Save 0xRampey/2f7da1e9aa3c7e064d3c7f5752d84dd9 to your computer and use it in GitHub Desktop.
emv-validator #16 — merchant-chosen merchant IDs (visual summary)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!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);">−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 — 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 → zero-fill → <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, …)</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);">− 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);">− function removeMerchant()</div> | |
| <div style="color:var(--color-text-success);">+ function removeMerchant(uint120 merchantId)</div> | |
| <div style="color:var(--color-text-danger);">− function getMerchantId(address) <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 → 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 —</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