跳到主要内容

Shrinemaps

把一个代币最大的持有人画成一张气泡地图:彼此相关的钱包之间连线,并归入集群,即很可能属于同一个人的钱包。用一个 iframe 就能放到你自己的网站上。

8.4%集群:14.1%共同资金方捆绑器KOL5.2%持有人地图每个持有人一个气泡,大小按其持有的供应量份额

放到你的页面上​

粘贴这个框架,把代币的 mint 填进地址:

<iframe
src="https://maps.shrine.trade/embed/sol/<mint>"
title="Holder map"
width="100%"
height="600"
style="border:0"
loading="lazy"
allow="clipboard-write"
referrerpolicy="no-referrer"
sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox"
></iframe>

或者向 API 要一个代币现成可粘贴的框架:

const res = await fetch("https://sol.shrine.trade/api/maps/<mint>/embed");
const { url, page, iframe } = await res.json();
document.querySelector("#holders").innerHTML = iframe;
{
"mint": "<mint>",
"url": "https://maps.shrine.trade/embed/sol/<mint>",
"page": "https://maps.shrine.trade/sol/<mint>",
"iframe": "<iframe src=\"https://maps.shrine.trade/embed/sol/<mint>\" …></iframe>"
}

page 是同一张地图在 maps.shrine.trade 上的独立页面,可用作"完整地图"链接。两者都不需要密钥。

选项取值
?n=50、100、200地图一开始显示多少个最大持有人。默认 100;访客可以在地图里修改。

尺寸。 地图会填满它的框架:给它整列宽度,高度至少 480 px;代币页用 600 合适。手机上也能用。

怎么看这张地图​

  • 气泡。 每个持有人一个,大小按其持有的供应量份额。悬停或点按一个气泡,可以看到钱包、份额以及它与谁相连。
  • 连线。 一条线连接两个彼此相关的钱包:一个给另一个转了第一笔 SOL;两者的第一笔 SOL 来自同一个地址(中间有一个小的资金方圆点);两者和开发者在发射的那个 slot 一起买入;或者两者都通过捆绑器交易(一个红色的捆绑器圆点)。
  • 集群。 相连的钱包共用一个颜色,算作一个集群:很可能是同一个人。侧边栏列出各个集群及其合计份额。
  • 知名交易者。 KOL 以头像显示,并标出名字和份额。
  • 交易所。 交易所给所有人转账,所以只作为标签显示,从不作为连线。
  • 实时。 地图打开期间每隔几秒刷新一次。

持仓按 Shrine 看到的该代币交易计算:在 Shrine 开始之前发射的代币会标为不完整。随着该代币更多钱包被查看,连线会逐渐补全,所以新代币的地图会在最初几分钟里慢慢长出来。

高级捆绑检测嵌入随 Developer 套餐提供。

与地图通信(可选)​

地图和你的页面可以通过 postMessage 交换几条消息。它只告诉你公开的信息:显示的是哪个代币,以及有人点了哪个钱包。

来自消息含义
地图{ type: "shrinemaps:ready" }地图已加载。
地图{ type: "shrinemaps:coin", mint, symbol }它显示的代币,可用于你页面的标题。
你的页面{ type: "shrinemaps:host" }由你的页面自己打开钱包:地图里的钱包按钮会变成"打开钱包",并告诉你是哪一个。
地图{ type: "shrinemaps:wallet", wallet }有人要求打开这个钱包。
const MAPS = "https://maps.shrine.trade";
const frame = document.querySelector(`iframe[src^="${MAPS}/embed/"]`);

window.addEventListener("message", (e) => {
if (e.origin !== MAPS || e.source !== frame.contentWindow) return;
const m = e.data;
if (m?.type === "shrinemaps:ready") frame.contentWindow.postMessage({ type: "shrinemaps:host" }, MAPS);
if (m?.type === "shrinemaps:coin") document.title = `${m.symbol} holders`;
if (m?.type === "shrinemaps:wallet") window.open(`https://solscan.io/account/${m.wallet}`, "_blank", "noopener");
});

放心嵌入​

  • 只运行自己的脚本。 框架运行的是 Shrinemaps 自己的代码、读取 Shrine 的数据;它无法修改或跳转你的页面。
  • 你的地址只属于你。 有了 referrerpolicy="no-referrer",地图永远不知道自己在哪个页面上。
  • 无需签名。 不连接钱包,没有账户,也没有替访客执行操作的按钮。