Walrus blob · mainnet
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!--
The icon is a data URI, and it has to be.
Every path under a .epoch name serves that name's single blob, so a
/favicon.ico would not 404 — it would return this whole page, and the
browser would try to decode an HTML document as an image. There is no
second file to point at, so the icon travels inside the one there is.
-->
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'><rect width='64' height='64' rx='14' fill='%230b1c34'/><path d='M32 9 L55 22 L32 35 L9 22 Z' fill='%23eaf7ff'/><path d='M9 24 L32 37 L32 56 L9 43 Z' fill='%237fc0ee'/><path d='M55 24 L32 37 L32 56 L55 43 Z' fill='%233d7ba8'/></svg>" />
<title>PermaFrost — frozen liquidity you can actually verify</title>
<meta
name="description"
content="Verify Epoch locks and vesting vaults live on Sui, freeze your own, and share a proof card nobody can forge — because the link on it re-reads the chain."
/>
<meta name="theme-color" content="#040d1a" />
<meta name="color-scheme" content="dark" />
<!--
Defence in depth. Vercel sets the real policy as a header (with
frame-ancestors, which a meta tag cannot express), but this build is also
published as a single Walrus blob served by a gateway that sets no
headers at all — and that copy is the one people embed. The tightest part
is `connect-src`: this page talks to exactly one host, and anything that
ever tried to send a wallet address anywhere else would simply not
connect.
-->
<meta
http-equiv="Content-Security-Policy"
content="default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com data:; img-src 'self' data:; connect-src https://graphql.mainnet.sui.io; frame-src 'self'; base-uri 'none'; form-action 'none'; object-src 'none'"
/>
<meta name="referrer" content="no-referrer" />
<meta property="og:type" content="website" />
<meta property="og:title" content="PermaFrost — frozen liquidity you can actually verify" />
<meta
property="og:description"
content="Read any Epoch lock straight from Sui. Freeze your own. Get a badge your visitors can trust, because you cannot edit what it says."
/>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap"
/>
<link rel="preconnect" href="https://graphql.mainnet.sui.io" crossorigin />
<script>
// Before first paint: a page that flashes the wrong appearance and then
// corrects itself looks broken, and this one is asking to be trusted.
try {
var a = localStorage.getItem('permafrost:appearance')
document.documentElement.dataset.appearance = a === 'aqua' ? 'aqua' : 'graphite'
} catch (e) {
document.documentElement.dataset.appearance = 'graphite'
}
</script>
<script type="module">var kn,L,Ks,Ke,Qr,Hs,qs,In,Qt,Et,Ys,yr,Yn,Qn,ln={},dn=[],Co=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,_n=Array.isArray;function ze(e,t){for(var n in t)e[n]=t[n];return e}function wr(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function jo(e,t,n){var s,i,o,c={};for(o in t)o=="key"?s=t[o]:o=="ref"?i=t[o]:c[o]=t[o];if(arguments.length>2&&(c.children=arguments.length>3?kn.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(o in e.defaultProps)c[o]===void 0&&(c[o]=e.defaultProps[o]);return Zt(e,c,s,i,null)}function Zt(e,t,n,s,i){var o={type:e,props:t,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Ks,__i:-1,__u:0};return i==null&&L.vnode!=null&&L.vnode(o),o}function N(e){return e.children}function Jt(e,t){this.props=e,this.context=t}function it(e,t){if(t==null)return e.__?it(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?it(e):null}function Io(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,s=[],i=[],o=ze({},t);o.__v=t.__v+1,L.vnode&&L.vnode(o),vr(e.__P,o,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,s,n??it(t),!!(32&t.__u),i),o.__v=t.__v,o.__.__k[o.__i]=o,ei(s,o,i),t.__e=t.__=null,o.__e!=n&&Qs(o)}}function Qs(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),Qs(e)}function Zr(e){(!e.__d&&(e.__d=!0)&&Ke.push(e)&&!un.__r++||Qr!=L.debounceRendering)&&((Qr=L.debounceRendering)||Hs)(un)}function un(){try{for(var e,t=1;Ke.length;)Ke.length>t&&Ke.sort(qs),e=Ke.shift(),t=Ke.length,Io(e)}finally{Ke.length=un.__r=0}}function Zs(e,t,n,s,i,o,c,a,l,u,h){var p,f,m,g,v,_,E=s&&s.__k||dn,y=t.length;for(l=Ao(n,t,E,l,y),p=0;p<y;p++)(m=n.__k[p])!=null&&(f=m.__i!=-1&&E[m.__i]||ln,m.__i=p,_=vr(e,m,f,i,o,c,a,l,u,h),g=m.__e,m.ref&&f.ref!=m.ref&&(f.ref&&kr(f.ref,null,m),h.push(m.ref,m.__c||g,m)),v==null&&g!=null&&(v=g),4&m.__u?(l=Js(m,l,e),f.__e&&(f.__e=null)):typeof m.type=="function"&&_!==void 0?l=_:g&&(l=g.nextSibling),m.__u&=-7);return n.__e=v,l}function Ao(e,t,n,s,i){var o,c,a,l,u,h=n.length,p=h,f=0;for(e.__k=new Array(i),o=0;o<i;o++)(c=t[o])!=null&&typeof c!="boolean"&&typeof c!="function"?(typeof c=="string"||typeof c=="number"||typeof c=="bigint"||c.constructor==String?c=e.__k[o]=Zt(null,c,null,null,null):_n(c)?c=e.__k[o]=Zt(N,{children:c},null,null,null):c.constructor===void 0&&c.__b>0?c=e.__k[o]=Zt(c.type,c.props,c.key,c.ref?c.ref:null,c.__v):e.__k[o]=c,l=o+f,c.__=e,c.__b=e.__b+1,a=null,(u=c.__i=$o(c,n,l,p))!=-1&&(p--,(a=n[u])&&(a.__u|=2)),a==null||a.__v==null?(u==-1&&(i>h?f--:i<h&&f++),typeof c.type!="function"&&(c.__u|=4)):u!=l&&(u==l-1?f--:u==l+1?f++:(u>l?f--:f++,c.__u|=4))):e.__k[o]=null;if(p)for(o=0;o<h;o++)(a=n[o])!=null&&(2&a.__u)==0&&(a.__e==s&&(s=it(a)),ni(a,a));return s}function Js(e,t,n){var s,i;if(typeof e.type=="function"){for(s=e.__k,i=0;s&&i<s.length;i++)s[i]&&(s[i].__=e,t=Js(s[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=it(e)),t=n.insertBefore(e.__e,t||null));do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function $o(e,t,n,s){var i,o,c,a=e.key,l=e.type,u=t[n],h=u!=null&&(2&u.__u)==0;if(u===null&&a==null||h&&a==u.key&&l==u.type)return n;if(s>(h?1:0)){for(i=n-1,o=n+1;i>=0||o<t.length;)if((u=t[c=i>=0?i--:o++])!=null&&(2&u.__u)==0&&a==u.key&&l==u.type)return c}return-1}function Jr(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||Co.test(t)?n:n+"px"}function Gt(e,t,n,s,i){var o,c;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof s=="string"&&(e.style.cssText=s=""),s)for(t in s)n&&t in n||Jr(e.style,t,"");if(n)for(t in n)s&&n[t]==s[t]||Jr(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")o=t!=(t=t.replace(Ys,"$1")),c=t.toLowerCase(),t=c in e||t=="onFocusOut"||t=="onFocusIn"?c.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+o]=n,n?s?n[Et]=s[Et]:(n[Et]=yr,e.addEventListener(t,o?Qn:Yn,o)):e.removeEventListener(t,o?Qn:Yn,o);else{if(i=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Xr(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[Qt]==null)t[Qt]=yr++;else if(t[Qt]<n[Et])return;return n(L.event?L.event(t):t)}}}function vr(e,t,n,s,i,o,c,a,l,u){var h,p,f,m,g,v,_,E,y,M,A,P,j,V,F,S,b=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(l=!!(32&n.__u),o=[a=t.__e=n.__e]),(h=L.__b)&&h(t);e:if(typeof b=="function"){p=c.length;try{if(y=t.props,M=b.prototype&&b.prototype.render,A=(h=b.contextType)&&s[h.__c],P=h?A?A.props.value:h.__:s,n.__c?E=(f=t.__c=n.__c).__=f.__E:(M?t.__c=f=new b(y,P):(t.__c=f=new Jt(y,P),f.constructor=b,f.render=Ro),A&&A.sub(f),f.state||(f.state={}),f.__n=s,m=f.__d=!0,f.__h=[],f._sb=[]),M&&f.__s==null&&(f.__s=f.state),M&&b.getDerivedStateFromProps!=null&&(f.__s==f.state&&(f.__s=ze({},f.__s)),ze(f.__s,b.getDerivedStateFromProps(y,f.__s))),g=f.props,v=f.state,f.__v=t,m)M&&b.getDerivedStateFromProps==null&&f.componentWillMount!=null&&f.componentWillMount(),M&&f.componentDidMount!=null&&f.__h.push(f.componentDidMount);else{if(M&&b.getDerivedStateFromProps==null&&y!==g&&f.componentWillReceiveProps!=null&&f.componentWillReceiveProps(y,P),t.__v==n.__v||!f.__e&&f.shouldComponentUpdate!=null&&f.shouldComponentUpdate(y,f.__s,P)===!1){t.__v!=n.__v&&(f.props=y,f.state=f.__s,f.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(O){O&&(O.__=t)}),dn.push.apply(f.__h,f._sb),f._sb=[],f.__h.length&&c.push(f),a=it(n);break e}f.componentWillUpdate!=null&&f.componentWillUpdate(y,f.__s,P),M&&f.componentDidUpdate!=null&&f.__h.push(function(){f.componentDidUpdate(g,v,_)})}if(f.context=P,f.props=y,f.__P=e,f.__e=!1,j=L.__r,V=0,M)f.state=f.__s,f.__d=!1,j&&j(t),h=f.render(f.props,f.state,f.context),dn.push.apply(f.__h,f._sb),f._sb=[];else do f.__d=!1,j&&j(t),h=f.render(f.props,f.state,f.context),f.state=f.__s;while(f.__d&&++V<25);f.state=f.__s,f.getChildContext!=null&&(s=ze(ze({},s),f.getChildContext())),M&&!m&&f.getSnapshotBeforeUpdate!=null&&(_=f.getSnapshotBeforeUpdate(g,v)),F=h!=null&&h.type===N&&h.key==null?ti(h.props.children):h,a=Zs(e,_n(F)?F:[F],t,n,s,i,o,c,a,l,u),f.base=t.__e,t.__u&=-161,f.__h.length&&c.push(f),E&&(f.__E=f.__=null)}catch(O){if(c.length=p,t.__v=null,l||o!=null){if(O.then){for(t.__u|=l?160:128;a&&a.nodeType==8&&a.nextSibling;)a=a.nextSibling;o!=null&&(o[o.indexOf(a)]=null),t.__e=a}else if(o!=null)for(S=o.length;S--;)wr(o[S])}else t.__e=n.__e;t.__k==null&&(t.__k=n.__k||[]),O.then||Xs(t),L.__e(O,t,n)}}else o==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):a=t.__e=Po(n.__e,t,n,s,i,o,c,l,u);return(h=L.diffed)&&h(t),128&t.__u?void 0:a}function Xs(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(Xs))}function ei(e,t,n){for(var s=0;s<n.length;s++)kr(n[s],n[++s],n[++s]);L.__c&&L.__c(t,e),e.some(function(i){try{e=i.__h,i.__h=[],e.some(function(o){o.call(i)})}catch(o){L.__e(o,i.__v)}})}function ti(e){return typeof e!="object"||e==null||e.__b>0?e:_n(e)?e.map(ti):e.constructor!==void 0?null:ze({},e)}function Po(e,t,n,s,i,o,c,a,l){var u,h,p,f,m,g,v,_=n.props||ln,E=t.props,y=t.type;if(y=="svg"?i="http://www.w3.org/2000/svg":y=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),o!=null){for(u=0;u<o.length;u++)if((m=o[u])&&"setAttribute"in m==!!y&&(y?m.localName==y:m.nodeType==3)){e=m,o[u]=null;break}}if(e==null){if(y==null)return document.createTextNode(E);e=document.createElementNS(i,y,E.is&&E),a&&(L.__m&&L.__m(t,o),a=!1),o=null}if(y==null)_===E||a&&e.data==E||(e.data=E);else{if(o=y=="textarea"&&E.defaultValue!=null?null:o&&kn.call(e.childNodes),!a&&o!=null)for(_={},u=0;u<e.attributes.length;u++)_[(m=e.attributes[u]).name]=m.value;for(u in _)m=_[u],u=="dangerouslySetInnerHTML"?p=m:u=="children"||u in E||u=="value"&&"defaultValue"in E||u=="checked"&&"defaultChecked"in E||Gt(e,u,null,m,i);for(u in E)m=E[u],u=="children"?f=m:u=="dangerouslySetInnerHTML"?h=m:u=="value"?g=m:u=="checked"?v=m:a&&typeof m!="function"||_[u]===m||Gt(e,u,m,_[u],i);if(h)a||p&&(h.__html==p.__html||h.__html==e.innerHTML)||(e.innerHTML=h.__html),t.__k=[];else if(p&&(e.innerHTML=""),Zs(t.type=="template"?e.content:e,_n(f)?f:[f],t,n,s,y=="foreignObject"?"http://www.w3.org/1999/xhtml":i,o,c,o?o[0]:n.__k&&it(n,0),a,l),o!=null)for(u=o.length;u--;)wr(o[u]);a&&y!="textarea"||(u="value",y=="progress"&&g==null?e.removeAttribute("value"):g!=null&&(g!==e[u]||y=="progress"&&!g||y=="option"&&g!=_[u])&&Gt(e,u,g,_[u],i),u="checked",v!=null&&v!=e[u]&&Gt(e,u,v,_[u],i))}return e}function kr(e,t,n){try{if(typeof e=="function"){var s=typeof e.__u=="function";s&&e.__u(),s&&t==null||(e.__u=e(t))}else e.current=t}catch(i){L.__e(i,n)}}function ni(e,t,n){var s,i;if(L.unmount&&L.unmount(e),(s=e.ref)&&(s.current&&s.current!=e.__e||kr(s,null,t)),(s=e.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(o){L.__e(o,t)}s.base=s.__P=s.__n=null}if(s=e.__k)for(i=0;i<s.length;i++)s[i]&&ni(s[i],t,n||typeof e.type!="function");n||wr(e.__e),e.__c=e.__=e.__e=void 0}function Ro(e,t,n){return this.constructor(e,n)}function Uo(e,t,n){var s,i,o,c;t==document&&(t=document.documentElement),L.__&&L.__(e,t),i=(s=!1)?null:t.__k,o=[],c=[],vr(t,e=t.__k=jo(N,null,[e]),i||ln,ln,t.namespaceURI,i?null:t.firstChild?kn.call(t.childNodes):null,o,i?i.__e:t.firstChild,s,c),ei(o,e,c),e.props.children=null}kn=dn.slice,L={__e:function(e,t,n,s){for(var i,o,c;t=t.__;)if((i=t.__c)&&!i.__)try{if((o=i.constructor)&&o.getDerivedStateFromError!=null&&(i.setState(o.getDerivedStateFromError(e)),c=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,s||{}),c=i.__d),c)return i.__E=i}catch(a){e=a}throw e}},Ks=0,Jt.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=ze({},this.state),typeof e=="function"&&(e=e(ze({},n),this.props)),e&&ze(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Zr(this))},Jt.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Zr(this))},Jt.prototype.render=N,Ke=[],Hs=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,qs=function(e,t){return e.__v.__b-t.__v.__b},un.__r=0,In=Math.random().toString(8),Qt="__d"+In,Et="__a"+In,Ys=/(PointerCapture)$|Capture$/i,yr=0,Yn=Xr(!1),Qn=Xr(!0);var Lo=0;function r(e,t,n,s,i,o){t||(t={});var c,a,l=t;if("ref"in l)for(a in l={},t)a=="ref"?c=t[a]:l[a]=t[a];var u={type:e,props:l,key:n,ref:c,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Lo,__i:-1,__u:0,__source:i,__self:o};if(typeof e=="function"&&(c=e.defaultProps))for(a in c)l[a]===void 0&&(l[a]=c[a]);return L.vnode&&L.vnode(u),u}var It,Y,An,es,At=0,ri=[],Q=L,ts=Q.__b,ns=Q.__r,rs=Q.diffed,ss=Q.__c,is=Q.unmount,os=Q.__;function _r(e,t){Q.__h&&Q.__h(Y,e,At||t),At=0;var n=Y.__H||(Y.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function x(e){return At=1,No(ii,e)}function No(e,t,n){var s=_r(It++,2);if(s.t=e,!s.__c&&(s.__=[ii(void 0,t),function(a){var l=s.__N?s.__N[0]:s.__[0],u=s.t(l,a);l!==u&&(s.__N=[u,s.__[1]],s.__c.setState({}))}],s.__c=Y,!Y.__f)){var i=function(a,l,u){if(!s.__c.__H)return!0;var h=!1,p=s.__c.props!==a;if(s.__c.__H.__.some(function(m){if(m.__N){h=!0;var g=m.__[0];m.__=m.__N,m.__N=void 0,g!==m.__[0]&&(p=!0)}}),o){var f=o.call(this,a,l,u);return h?f||p:f}return!h||p};Y.__f=!0;var o=Y.shouldComponentUpdate,c=Y.componentWillUpdate;Y.componentWillUpdate=function(a,l,u){if(this.__e){var h=o;o=void 0,i(a,l,u),o=h}c&&c.call(this,a,l,u)},Y.shouldComponentUpdate=i}return s.__N||s.__}function K(e,t){var n=_r(It++,3);!Q.__s&&si(n.__H,t)&&(n.__=e,n.u=t,Y.__H.__h.push(n))}function ot(e){return At=5,Sr(function(){return{current:e}},[])}function Sr(e,t){var n=_r(It++,7);return si(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Tt(e,t){return At=8,Sr(function(){return e},t)}function Bo(){for(var e;e=ri.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Xt),t.__h.some(Zn),t.__h=[]}catch(n){t.__h=[],Q.__e(n,e.__v)}}}Q.__b=function(e){Y=null,ts&&ts(e)},Q.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),os&&os(e,t)},Q.__r=function(e){ns&&ns(e),It=0;var t=(Y=e.__c).__H;t&&(An===Y?(t.__h=[],Y.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.some(Xt),t.__h.some(Zn),t.__h=[],It=0)),An=Y},Q.diffed=function(e){rs&&rs(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ri.push(t)!==1&&es===Q.requestAnimationFrame||((es=Q.requestAnimationFrame)||Do)(Bo)),t.__H.__.some(function(n){n.u&&(n.__H=n.u,n.u=void 0)})),An=Y=null},Q.__c=function(e,t){t.some(function(n){try{n.__h.some(Xt),n.__h=n.__h.filter(function(s){return!s.__||Zn(s)})}catch(s){t.some(function(i){i.__h&&(i.__h=[])}),t=[],Q.__e(s,n.__v)}}),ss&&ss(e,t)},Q.unmount=function(e){is&&is(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(s){try{Xt(s)}catch(i){t=i}}),n.__H=void 0,t&&Q.__e(t,n.__v))};var as=typeof requestAnimationFrame=="function";function Do(e){var t,n=function(){clearTimeout(s),as&&cancelAnimationFrame(t),setTimeout(e)},s=setTimeout(n,35);as&&(t=requestAnimationFrame(n))}function Xt(e){var t=Y,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),Y=t}function Zn(e){var t=Y;e.__c=e.__(),Y=t}function si(e,t){return!e||e.length!==t.length||t.some(function(n,s){return n!==e[s]})}function ii(e,t){return typeof t=="function"?t(e):t}const zo="https://graphql.mainnet.sui.io/graphql",Er="0x6",Ie={TYPE_PKG:"0xe0f23402fae139961a3d5ffa99d054a7821b82295eb5988957053f0c9a4dd14d",CALL_PKG:"0x0267556b54173e71b4eefce7c2466770fa52842d0b4242dae49f023022636e89",MODULE:"object_lock"},Ae={TYPE_PKG:"0x848cb7edf8b5f7650b3188dec459394472c8ccf206a031497bf55fe40c165da2",CALL_PKG:"0x848cb7edf8b5f7650b3188dec459394472c8ccf206a031497bf55fe40c165da2",MODULE:"vesting",TREASURY:"0x31bd863db14dd552a28f85641888b7ddc3a4866c4ffde286b30eaf7ac2841553"},Jn={OBJECT:"0x75da1b355776cb2bbb7a5eed89710a63dffb5ff43a1f440bb058c4d31c2fbab3"},pt={TYPE_PKG:"0x5dd1fb9f784129f0815c8e54ed917ad698401c0900ebeb1525f37fac98a94dda",CALL_PKG:"0xc868bfcfc7aeee0fc3938b632fce15856882092554d1068ce4cdddbd7b23fcd8",MODULE:"walrus_names",REGISTRY:"0xa6d9e91daa40dbff259838c9f5bd6448d8f08e9b2a3da02c5d4d3c88ce5666d1"},Sn=`${Ie.TYPE_PKG}::${Ie.MODULE}::ObjectLock`,Tr=`${Ae.TYPE_PKG}::${Ae.MODULE}::VestingVault`,xr=`${Ae.TYPE_PKG}::${Ae.MODULE}::MultiVestingVault`,oi=10000n,En=e=>`https://suiscan.xyz/mainnet/object/${e}`,Vo=4,Fo=55,Go=2e4,ai=5,Wo=12e3,Ko=240;class xe extends Error{constructor(t,n,s=!1){super(t),this.detail=n,this.retryable=s,this.name="ChainError"}detail;retryable}class cs extends Error{constructor(){super("Aborted"),this.name="AbortError"}}const Xn=[];let er=0,ls=0;function tr(){if(er>=Vo||Xn.length===0)return;const e=Fo-(Date.now()-ls);if(e>0){setTimeout(tr,e);return}const t=Xn.shift();t&&(er++,ls=Date.now(),t())}function Ho(e){return new Promise((t,n)=>{Xn.push(()=>{e().then(t,n).finally(()=>{er--,tr()})}),tr()})}let hn=0,Mr=0;const qo=()=>hn>=ai&&Date.now()-Mr<Wo;function Yo(){hn++,hn===ai&&(Mr=Date.now())}function Qo(){hn=0,Mr=0}const Ye=new Map,Wt=new Map;function Zo(e,t){const n=Ye.get(e);return!n||Date.now()-n.at>t?{hit:!1}:(Ye.delete(e),Ye.set(e,n),{hit:!0,value:n.value})}function Jo(e,t){for(Ye.set(e,{at:Date.now(),value:t});Ye.size>Ko;){const n=Ye.keys().next().value;if(n===void 0)break;Ye.delete(n)}}function Xo(){Ye.clear()}function ds(e,t){return t?t.aborted?Promise.reject(new cs):new Promise((n,s)=>{const i=()=>s(new cs);t.addEventListener("abort",i,{once:!0}),e.then(n,s).finally(()=>t.removeEventListener("abort",i))}):e}const ea=e=>new Promise(t=>setTimeout(t,e)),ta=(e,t)=>{const n=Math.min(8e3,400*2**e);return Math.max(t??0,Math.round(n*(.5+Math.random()*.5)))};function na(e){const t=e.headers.get("retry-after");if(!t)return;const n=Number(t);if(Number.isFinite(n))return Math.min(3e4,n*1e3);const s=Date.parse(t);return Number.isFinite(s)?Math.min(3e4,Math.max(0,s-Date.now())):void 0}async function ra(e,t,n,s={}){const{signal:i,cacheMs:o=0,retries:c=2}=s,a=`${t} ${JSON.stringify(n)}`;if(o>0){const h=Zo(a,o);if(h.hit)return h.value}const l=Wt.get(a);if(l)return ds(l,i);const u=sa(e,t,n,c,o,a);return Wt.set(a,u),u.catch(()=>{}).finally(()=>{Wt.get(a)===u&&Wt.delete(a)}),ds(u,i)}async function sa(e,t,n,s,i,o){let c=null;for(let a=0;a<=s;a++){if(qo())throw new xe("Sui is not answering right now. Give it a few seconds and try again.",void 0,!0);try{const l=await Ho(()=>ia(e,t,n));return Qo(),i>0&&Jo(o,l),l}catch(l){const u=l instanceof xe?l:new xe("Chain read failed.",l,!1);if(c=u,u.retryable&&Yo(),!u.retryable||a===s)throw u;const h=u.detail?.retryAfterMs;await ea(ta(a,h))}}throw c??new xe("Chain read failed.")}async function ia(e,t,n){const s=new AbortController,i=setTimeout(()=>s.abort(),Go);let o;try{o=await fetch(e,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({query:t,variables:n}),signal:s.signal,credentials:"omit",referrerPolicy:"no-referrer",mode:"cors",cache:"no-store"})}catch(a){throw new xe("Could not reach the Sui network.",a,!0)}finally{clearTimeout(i)}if(o.status===429)throw new xe("Sui is rate limiting this browser. Backing off and retrying.",{retryAfterMs:na(o)},!0);if(o.status>=500)throw new xe(`Sui GraphQL is unavailable (HTTP ${o.status}).`,void 0,!0);if(!o.ok)throw new xe(`Sui GraphQL returned HTTP ${o.status}.`,void 0,!1);const c=await o.json();if(c.errors?.length)throw new xe(c.errors.map(a=>a.message).join("; "),c.errors,!1);if(!c.data)throw new xe("Sui GraphQL returned an empty response.");return c.data}const ci=6e4,oa=30*6e4,aa=1e4;async function Se(e,t={},n,s={}){return ra(zo,e,t,{...s,signal:n})}const ca=`
query Obj($address: SuiAddress!) {
object(address: $address) {
address
version
asMoveObject {
contents {
json
type { repr }
}
}
}
}
`;async function nr(e,t){const n=await Se(ca,{address:e},t,{cacheMs:ci}),s=n.object?.asMoveObject?.contents;return s?{address:n.object.address,version:n.object.version,type:s.type.repr,json:s.json}:null}const la=`
query Objs($keys: [ObjectKey!]!) {
multiGetObjects(keys: $keys) {
address
version
asMoveObject {
contents {
json
type { repr }
}
}
}
}
`,us=25;async function da(e,t){const n=[];for(let s=0;s<e.length;s+=us){const i=e.slice(s,s+us).map(c=>({address:c})),o=await Se(la,{keys:i},t,{cacheMs:ci});for(const c of o.multiGetObjects??[]){const a=c?.asMoveObject?.contents;!c||!a||n.push({address:c.address,version:c.version,type:a.type.repr,json:a.json})}}return n}const ua=`
query Now { checkpoint { timestamp } }
`;async function Lt(e){try{const n=(await Se(ua,{},e,{cacheMs:aa,retries:1})).checkpoint?.timestamp;if(n)return new Date(n).getTime()}catch{}return Date.now()}const ha=oa,fa=`
query Fx($digest: String!) {
transactionEffects(digest: $digest) {
status
objectChanges(first: 30) {
nodes {
address
idCreated
outputState { asMoveObject { contents { type { repr } } } }
}
}
}
}
`;async function pa(e,t,n){const i=(await Se(fa,{digest:e},n,{retries:0})).transactionEffects;return!i||i.status!=="SUCCESS"?[]:i.objectChanges.nodes.filter(o=>o.idCreated).filter(o=>o.outputState?.asMoveObject?.contents?.type.repr.startsWith(t)).map(o=>o.address)}function Nt(e){return e.lockedAmount===0n&&e.phase!=="thawed"}const hs={kind:"lock",id:"",phase:"absent",progress:0,released:0,lockedAtMs:0,unlockMs:0,creator:"",beneficiary:null,innerType:"",nowMs:0};function Bt(e,t=0){return e.unlockMs-(e.nowMs+t)}function Or(e,t,n){if(t<=e)return n>=t?1:0;const s=(n-e)/(t-e);return s<0?0:s>1?1:s}function bt(e){const t=e.indexOf("<");return t<0?e:e.slice(t+1,e.lastIndexOf(">"))}function Cr(e){const t=e.includes("<")?bt(e):e,n=t.split("::");return(n[n.length-1]??t).replace(/>+$/,"")}function $t(e){return e.toLowerCase().replace(/0x0*([0-9a-f]+)/g,(t,n)=>"0x"+n.padStart(64,"0"))}function ma(e,t){const n=t.trim();return n?n.includes("::")?$t(e).includes($t(n)):Cr(e).toLowerCase()===n.toLowerCase():!1}function Ze(e){return e.symbol??Cr(e.innerType)}const li=24*36e5,ga=7*li,ba=30*li;function Qe(e,t=0){if(e.phase!=="melting"||Nt(e))return"none";const n=Bt(e,t);return n<=0?"none":n<ga?"imminent":n<ba?"expiring":"none"}function ya(e){return e.startsWith(Sn)}function wa(e,t,n,s){const i=n,o=Number(i.unlock_ms),c=Number(i.locked_at_ms),a=i.item===null||i.item===void 0,l=s>=o,u=i.item?.balance,h=u===void 0?void 0:BigInt(u);return{kind:"lock",id:e,phase:a?"thawed":l?"cracked":"melting",progress:Or(c,o,s),released:l?1:0,lockedAtMs:c,unlockMs:o,creator:i.creator,beneficiary:i.beneficiary,innerType:bt(t),nowMs:s,lockedAmount:h}}function di(e,t,n,s,i,o){let c=0n;const a=e*n/oi;a>0n&&t>0n&&o>=t&&(c+=a);const l=e-a;if(l>0n){const u=s,h=i;if(u===h)o>=u&&(c+=l);else if(o>=h)c+=l;else if(o>u){const p=o-u,f=h-u;c+=l*p/f}}return c>e?e:c}function va(e){return e.startsWith(Tr)}function ka(e){return e.startsWith(xr)}function ui(e,t){return Math.max(e,t)}function hi(e,t){return t===0n?"thawed":e>=1?"cracked":"melting"}function _a(e,t,n,s){const i=n,o=BigInt(i.total_locked),c=BigInt(i.claimed),a=Number(i.cliff_ts_ms),l=Number(i.linear_end_ms),u=Number(i.linear_start_ms),h=Number(i.created_at_ms),p=di(o,BigInt(i.cliff_ts_ms),BigInt(i.cliff_bps),BigInt(i.linear_start_ms),BigInt(i.linear_end_ms),BigInt(s)),f=p>c?p-c:0n,m=ui(a,l),g=o===0n?1:Number(p*10000n/o)/1e4;return{kind:"vault",id:e,phase:hi(g,o-c),progress:Or(h,m,s),released:g,lockedAtMs:h,unlockMs:m,creator:i.creator,beneficiary:i.beneficiary,innerType:bt(t),totalLocked:o,claimed:c,claimable:f,cliffBps:Number(i.cliff_bps),cliffTsMs:a,linearStartMs:u,linearEndMs:l,nowMs:s}}function Sa(e,t,n,s,i){const o=n,c=BigInt(o.total_locked),a=Number(o.cliff_ts_ms),l=Number(o.linear_end_ms),u=Number(o.linear_start_ms),h=Number(o.created_at_ms),p=new Map;for(const y of o.claimed?.contents??[])p.set(y.key,BigInt(y.value));const f=(o.shares?.contents??[]).map(y=>({address:y.key,shareBps:Number(y.value),claimed:p.get(y.key)??0n})),m=di(c,BigInt(o.cliff_ts_ms),BigInt(o.cliff_bps),BigInt(o.linear_start_ms),BigInt(o.linear_end_ms),BigInt(s)),g=f.reduce((y,M)=>y+M.claimed,0n),v=ui(a,l),_=c===0n?1:Number(m*10000n/c)/1e4;let E=0n;if(i){const y=f.find(M=>M.address===i);if(y){const M=m*BigInt(y.shareBps)/oi;E=M>y.claimed?M-y.claimed:0n}}return{kind:"multi",id:e,phase:hi(_,c-g),progress:Or(h,v,s),released:_,lockedAtMs:h,unlockMs:v,creator:o.creator,beneficiary:i??null,innerType:bt(t),totalLocked:c,claimed:g,claimable:E,cliffBps:Number(o.cliff_bps),cliffTsMs:a,linearStartMs:u,linearEndMs:l,beneficiaries:f,nowMs:s}}const Ea=12,Ta=/^[A-Za-z0-9][A-Za-z0-9._-]{0,11}$/;function xa(e){if(!e)return null;const t=e.trim();return t.length>Ea?null:Ta.test(t)?t:null}const Ma=`
query Meta($coinType: String!) {
coinMetadata(coinType: $coinType) { decimals symbol name }
}
`,$n=new Map,Pn=new Map;function Oa(e){const t=[e];return/::coin::coin</.test($t(e))&&t.unshift(bt(e)),t}async function Ca(e,t){if($n.has(e))return $n.get(e);const n=Pn.get(e);if(n)return n;const s=Se(Ma,{coinType:e},t,{cacheMs:ha,retries:1}).then(i=>{const o=i.coinMetadata;if(!o)return null;const c=xa(o.symbol);return c?{...o,symbol:c}:null}).catch(()=>null).then(i=>($n.set(e,i),Pn.delete(e),i));return Pn.set(e,s),s}async function Tn(e,t){for(const n of Oa(e)){const s=await Ca(n,t);if(s)return s}return null}function jr(e,t,n,s,i){return ya(t)?wa(e,t,n,s):va(t)?_a(e,t,n,s):ka(t)?Sa(e,t,n,s,i):null}async function ja(e,t){if(!e.innerType)return e;const n=await Tn(e.innerType,t).catch(()=>null);return{...e,decimals:n?.decimals??null,symbol:n?.symbol??null}}async function Ir(e,t,n,s){if(e.length===0)return[];const o=(await da(e,s).catch(()=>[])).map(a=>jr(a.address,a.type,a.json,t,n)).filter(a=>a!==null),c=new Map(e.map((a,l)=>[a.toLowerCase(),l]));return o.sort((a,l)=>(c.get(a.id.toLowerCase())??0)-(c.get(l.id.toLowerCase())??0)),Ar(o,s)}async function Ar(e,t){const n=[...new Set(e.map(i=>i.innerType).filter(Boolean))],s=new Map(await Promise.all(n.map(async i=>[i,await Tn(i,t).catch(()=>null)])));return e.map(i=>{const o=s.get(i.innerType)??null;return{...i,decimals:o?.decimals??null,symbol:o?.symbol??null}})}async function fi(e,t,n){const s=await Lt(n),i=await nr(e,n);if(!i)return{...hs,id:e,nowMs:s};const o=jr(i.address,i.type,i.json,s,t);return o?ja(o,n):{...hs,id:e,nowMs:s}}function Ia(e){const t=new TextEncoder().encode(e),n=[];let s=t.length;do{let c=s&127;s>>>=7,s>0&&(c|=128),n.push(c)}while(s>0);const i=new Uint8Array(n.length+t.length);i.set(n,0),i.set(t,n.length);let o="";for(const c of i)o+=String.fromCharCode(c);return btoa(o)}function pi(e){const t=e.trim().toLowerCase().replace(/\.epoch$/,"");return!/^[a-z0-9-]{3,63}$/.test(t)||/^[0-9]+$/.test(t)?null:t}const Aa=`
query Reg($address: SuiAddress!) {
object(address: $address) { asMoveObject { contents { json } } }
}
`,$a=`
query Rec($table: SuiAddress!, $bcs: Base64!) {
address(address: $table) {
dynamicField(name: { type: "0x1::string::String", bcs: $bcs }) {
value { ... on MoveValue { json } }
}
}
}
`;let Kt=null;function Pa(e){return Kt||(Kt=Se(Aa,{address:pt.REGISTRY},e).then(t=>t.object?.asMoveObject?.contents.json?.records?.id??null).catch(()=>(Kt=null,null))),Kt}async function rr(e,t){const n=pi(e);if(!n)return null;const s=await Pa(t);if(!s)return null;const o=(await Se($a,{table:s,bcs:Ia(n)},t).catch(()=>null))?.address?.dynamicField?.value?.json;return o?.owner?{name:n,owner:o.owner,blobId:o.blob_id??""}:null}const Ra=50,Ua=`
query ByType($type: String!, $first: Int!, $after: String) {
objects(first: $first, after: $after, filter: { type: $type }) {
pageInfo { hasNextPage endCursor }
nodes {
address
asMoveObject { contents { json type { repr } } }
}
}
}
`;async function mt(e,t,n,s){const i=[];let o=null;for(let c=0;c<10;c++){const a=await Se(Ua,{type:e,first:Ra,after:o},s,{cacheMs:3e4});for(const l of a.objects.nodes){const u=l.asMoveObject?.contents;if(!u)continue;const h=jr(l.address,u.type.repr,u.json,t,n);h&&i.push(h)}if(!a.objects.pageInfo.hasNextPage||(o=a.objects.pageInfo.endCursor,!o))break}return i}const La=`
query BySender($type: String!, $sender: SuiAddress!) {
events(last: 50, filter: { type: $type, sender: $sender }) {
nodes { contents { json } }
}
}
`;async function fs(e,t,n,s){const i=await Se(La,{type:e,sender:t},s,{cacheMs:2e4}),o=new Set;for(const c of i.events.nodes){const a=c.contents.json[n];a&&o.add(a)}return[...o]}async function en(e,t,n,s){const[i,o]=await Promise.all([fs(`${Ie.TYPE_PKG}::${Ie.MODULE}::ObjectLocked`,e,"lock_id",s).catch(()=>[]),fs(`${Ae.TYPE_PKG}::${Ae.MODULE}::VaultCreated`,e,"vault_id",s).catch(()=>[])]),c=[...i,...o];return c.length===0?[]:Ir(c,t,n,s)}async function ps(e,t,n,s){const o=(await Promise.all([mt(Sn,t,n,s).catch(()=>[]),mt(Tr,t,n,s).catch(()=>[]),mt(xr,t,n,s).catch(()=>[])])).flat().filter(c=>ma(c.innerType,e));return Ar(o,s)}const Na=e=>/^0x[0-9a-fA-F]{1,64}$/.test(e);async function Ba(e,t,n){const s=e.trim();if(!s)return{kind:"none",term:s,frosts:[]};const i=await Lt(n);if(s.includes("::"))return{kind:"coin",term:s,frosts:await ps(s,i,t,n)};if(Na(s)){const[a]=await Ir([s],i,t,n);if(a)return{kind:"object",term:s,frosts:[a]};const l=await en(s,i,t,n);return l.length>0?{kind:"creator",term:s,frosts:l}:{kind:"object",term:s,frosts:[]}}const o=/\.epoch$/i.test(s),c=pi(s);if(o&&c){const a=await rr(s,n).catch(()=>null);return a?ms(s,a,await en(a.owner,i,t,n)):{kind:"name",term:s,frosts:[]}}if(/^[A-Za-z][A-Za-z0-9_-]{1,32}$/.test(s)){const[a,l]=await Promise.all([ps(s,i,t,n).catch(()=>[]),c?rr(s,n).catch(()=>null):null]);return a.length>0?{kind:"coin",term:s,frosts:a,alsoName:l?{name:l.name,owner:l.owner}:void 0}:l?ms(s,l,await en(l.owner,i,t,n)):{kind:"coin",term:s,frosts:[]}}return{kind:"none",term:s,frosts:[]}}function ms(e,t,n){return{kind:"name",term:e,resolved:{name:t.name,owner:t.owner},frosts:n}}async function Da(e,t){const n=await Promise.all([mt(Sn,e,null,t).catch(()=>[]),mt(Tr,e,null,t).catch(()=>[]),mt(xr,e,null,t).catch(()=>[])]),s=c=>(c.lockedAmount??c.totalLocked??0n)>0n||c.lockedAmount===void 0,i=c=>(c.phase==="melting"?0:c.phase==="cracked"?2:4)+(s(c)?0:1),o=n.flat().sort((c,a)=>i(c)-i(a)||a.lockedAtMs-c.lockedAtMs);return Ar(o.slice(0,6),t)}function za({progress:e,running:t=!0,tone:n="frost"}){const s=Math.min(1,Math.max(0,e)),i={frost:"#7cc4ff",warn:"#f0ab27",spent:"#94a1b2"}[n],o={frost:"#cfe9ff",warn:"#ffd98a",spent:"#c3ccd8"}[n],c=8*(1-s),a=7*s;return r("g",{class:"hourglass",children:[r("defs",{children:[r("linearGradient",{id:"hg-glass",x1:"0",y1:"0",x2:"1",y2:"1",children:[r("stop",{offset:"0%","stop-color":"#ffffff","stop-opacity":"0.55"}),r("stop",{offset:"45%","stop-color":"#cfe4f5","stop-opacity":"0.18"}),r("stop",{offset:"100%","stop-color":"#5d7690","stop-opacity":"0.3"})]}),r("clipPath",{id:"hg-top",children:r("path",{d:"M33 17 L53 17 L43.6 28 Z"})}),r("clipPath",{id:"hg-bot",children:r("path",{d:"M43.6 29 L53 40 L33 40 Z"})})]}),r("rect",{x:"30.5",y:"14.5",width:"25",height:"2.6",rx:"1.3",fill:"#8c9aad"}),r("rect",{x:"30.5",y:"39.6",width:"25",heigh