0x5ba199a9…7ba9·#25,619,941·view on Etherscan
wardens:"0xabd5aa7d",mass:"0x501473bd",dust:"0xfd7fa2df",seed:"0x95564837",rolled:"0x2baf3df3",ownerOf:"0x6352211e",tokenURI:"0xc87b56dd",tokenURIBatch:"0x8d38e365",totalSupply:"0x18160ddd",wrappedBitmap:"0xd5499b96",tokensOfOwner:"0x8462151c",tokensOfOwnerIn:"0x99a2557a",isApprovedForAll:"0xe985e9c5",getApproved:"0x081812fc",MAX_ID:"0x17bac052",list:"0xf2d00a83",listTo:"0xc44c462d",cancelListing:"0x305a67a8",buy:"0xd96a094a",makeOffer:"0x9a2f6474",withdrawOffer:"0x8610f045",acceptOffer:"0xb01b193e",withdraw:"0x3ccfd60b",pruneListing:"0xb31f038e",listings:"0xde74e57b",bids:"0x4423c5f1",lastSale:"0xb6934afb",pendingWithdrawals:"0xf3f43703",totalVolume:"0x5f81a57c",listedBitmap:"0x889ed178",bidBitmap:"0xcd6ef21c",getListings:"0x0373c0bf",getBids:"0x35d6d214",getLastSales:"0x258d08bf",giftRock:"0x1b3e2002",sellRock:"0xc6caa959",reverseResolve:"0x9af8b7aa",rocks:"0x676cfec6",computeId:"0xfb021939",resolveById:"0x4f896d4f",resolveByName:"0x461a4478"},Xu={Listed:"0x9fd0e01e4cd41e8c101afb7fa962570335be73654fdb8a3fec862197742383ea",Unlisted:"0x398bd90ce129393b9155d48dccffb325e671f45c4250de457462a019268ff1f0",Bought:"0x8d92a13553f6d328e8e2f8d787835eadb96d99c4eae8ce1adab6441beb35c74d",Offered:"0x518fd790da45a5acbd08fd96a76218561c8278a0772a5cb9a537bb8ccfe1e36b",OfferWithdrawn:"0x60c7613a8b8ce872a461e88b0f376098063e67e4df6d0aa6a55790fe81acdb58",OfferAccepted:"0x7bc7d23e5aeba58dbde35bee1ac5d5ffe45557827f7ae6b35255586d1ff97652",Withdrawn:"0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5",Transfer:"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},Qu=[["seller","address"],["price","uint"],["onlyTo","address"],["expiry","uint"],["massSnap","uint"],["burnSnap","uint"]],Ju=[["bidder","address"],["amount","uint"]],$u=[["price","uint"],["time","uint"],["blockNum","uint"],["count","uint"]],_={strip:Ha,uintWord:xn,addrWord:Bu,boolWord:Mu,words:cn,wBig:Mn,wNum:nr,wAddr:Io,wBool:Lo,encodeCall:Hu,encodeUintArrayCall:Pu,encodeStringCall:Wu,decodeFixedUintArray:Du,decodeUintArray:Fu,decodeStruct:zu,decodeStructArray:ju,decodeString:qu,decodeStringArray:Uu,hexToBytes:Co,hexToUtf8:Ms,parseEther:Vu,formatEther:Yu,hexQuantity:Gu,bitsOf:Zu,SEL:Ku,TOPIC:Xu,LISTING:Qu,BID:Ju,SALEINFO:$u},td="0x0000000000000000000000000000000000000000",jt=t=>!t||t.toLowerCase()===td,Ca=t=>t&&!jt(t)?t.slice(0,6)+"…"+t.slice(-4):"–";function Oo(t,e){return!t||jt(t.onlyTo)||e&&t.onlyTo.toLowerCase()===String(e).toLowerCase()?null:"Private sale: only "+Ca(t.onlyTo)+" can buy this rock."}function Ro(t,{connected:e,endpoint:r}={}){if(e)return"Couldn't load: "+pe(t);const a="Connect a wallet to read the chain.";return r?a+" This build also has a fallback endpoint set ("+r+") and it is not answering.":a}const ed=2n**96n-1n;function ki(t,e,r){const a=e??0n;return t==null?{issue:"Enter an amount in ETH, like 0.5."}:t<=0n?{issue:"Enter an amount above zero."}:t>ed?{issue:"That is larger than a single bid can hold."}:r?t<=a?{issue:"Enter the total you want your bid to be, above the "+_.formatEther(a)+" ETH you already have in."}:{kind:"raise",total:t,now:a,send:t-a}:a>0n&&t<=a?{issue:"The standing bid is "+_.formatEther(a)+" ETH. Yours has to beat it, not match it."}:{kind:a>0n?"outbid":"first",total:t,now:a,send:t}}const pe=t=>t&&t.message?t.message:String(t),ke=t=>String(t??"").trim()!=="",Fr=t=>/^0x[0-9a-fA-F]{40}$/.test(String(t??"").trim());function ya(t,e=0,r=9999){const a=String(t??"").trim();if(!a)return null;if(!/^\d+$/.test(a))return"Enter a whole rock id.";const s=Number(a);return s<e?`Enter an id of ${e} or above.`:s>r?`Enter an id of ${r} or below.`:null}const No=25;function rd(t,e=No){const r=String(t??"").trim();if(!r)return{ids:[],issue:null};const a=c=>({ids:[],issue:c}),s=[];for(const c of r.split(/[\s,]+/).filter(Boolean)){const u=c.match(/^(\d+)-(\d+)$/);if(u){const[f,b]=[BigInt(u[1]),BigInt(u[2])];if(b<f)return a(`The range ${c} runs backwards.`);if(b-f>=BigInt(e))return a(`${c} is more than ${e} rocks. Absorb them in batches.`);for(let p=f;p<=b;p++)s.push(p);continue}if(!/^\d+$/.test(c))return a(`"${c}" is not a rock id. Use ids, commas, or a range like 10001-10005.`);s.push(BigInt(c))}const i=s.find(c=>c<10000n);if(i!==void 0)return a(`#${i} is not dust. Only rocks above id 9999 can be absorbed.`);const l=[...new Set(s)];return l.length!==s.length?a("That list names the same rock twice."):l.length>e?a(`That is ${l.length} rocks. Absorb up to ${e} at a time.`):{ids:l,issue:null}}const Bo=t=>t&&Number(t)>0?new Date(Number(t)*1e3).toLocaleString():"–",nd=t=>t&&Number(t)>0?new Date(Number(t)*1e3).toLocaleDateString():"–";function xi(t,e){const r=BigInt(t);return r<100n?"DEFINED":r<BigInt(e)?"UNDEFINED":"DUST"}async function Gr(t,e){if(C.current)return C.current.request({method:t,params:e});throw new Error("connect a wallet to read the chain")}async function Re(t,e){if(jt(t))throw new Error("contract address not configured (edit src/config.js)");return Gr("eth_call",[{to:t,data:e},"latest"])}function Mo(){if(C.chainId!=null&&C.chainId!==ut.chainId)throw new Error("Wrong network: your wallet is on chain "+C.chainId+" and this app is on chain "+ut.chainId+". Switch networks and try again.")}async function we(t,e,r){if(!C.account)throw new Error("connect a wallet first");if(Mo(),jt(t))throw new Error("contract address not configured (edit src/config.js)");const a={from:C.account,to:t,data:e};r&&r>0n&&(a.value=_.hexQuantity(r));const s=await Gr("eth_sendTransaction",[a]),i=await ad(s);if(i&&i.status!=="0x1")throw new Error("transaction reverted: "+s);return i&&await Po(i.blockNumber),i}const Ho=t=>new Promise(e=>setTimeout(e,t));async function ad(t){for(let e=0;e<180;e++){const r=await Gr("eth_getTransactionReceipt",[t]);if(r)return r;await Ho(1e3)}return null}async function Po(t){if(!t)return;let e;try{e=BigInt(t)}catch{return}for(let r=0;r<20;r++){try{if(BigInt(await Gr("eth_blockNumber",[]))>=e)return}catch{}await Ho(600)}}async function Wo(){const t=await Gr("eth_getBlockByNumber",["latest",!1]);return{number:Number(BigInt(t.number)),time:Number(BigInt(t.timestamp))}}function sd(t,e,r){return[{version:"2.0.0",from:t,chainId:e,atomicRequired:!0,calls:r.map(a=>{const s={to:a.to,data:a.data||"0x"};return a.value&&a.value>0n&&(s.value=_.hexQuantity(a.value)),s})}]}function id(t,e,r){if(!t||typeof t!="object")return!1;const a=String(e).toLowerCase();let s=null;for(const l of Object.keys(t))if(String(l).toLowerCase()===a||Number(l)===r){s=t[l];break}const i=s&&s.atomic&&s.atomic.status;return i==="supported"||i==="ready"}function od(t){if(!t)return"pending";const e=t.status;if(typeof e=="string"){const r=e.toUpperCase();return r==="CONFIRMED"||r==="SUCCESS"?"confirmed":r==="FAILED"||r==="REVERTED"?"failed":"pending"}return typeof e=="number"?e===1?"confirmed":e===2?"failed":e===0||e===100?"pending":e>=200&&e<400?"confirmed":e>=400?"failed":"pending":Array.isArray(t.receipts)&&t.receipts.length?"confirmed":"pending"}function ld(t){return!t||!Array.isArray(t.receipts)||!t.receipts.length?null:t.receipts[t.receipts.length-1]}const cd=t=>new Promise(e=>setTimeout(e,t)),ys=()=>_.hexQuantity(BigInt(ut.chainId));let _a=null;async function Hs(){const t=C.current;if(!t||!C.account)return!1;const e=C.account+":"+ut.chainId;if(_a&&_a.key===e)return _a.atomic;let r=!1;try{const a=await t.request({method:"wallet_getCapabilities",params:[C.account,[ys()]]});r=id(a,ys(),ut.chainId)}catch{r=!1}return _a={key:e,atomic:r},r}async function aa(t,e){if(!C.account)throw new Error("connect a wallet first");if(Mo(),t.length===1)return we(t[0].to,t[0].data,t[0].value||0n);if(await Hs())try{return await ud(t,e)}catch(r){if(fd(r))throw r}return dd(t)}async function ud(t,e){const r=C.current,a=await r.request({method:"wallet_sendCalls",params:sd(C.account,ys(),t)}),s=typeof a=="string"?a:a&&a.id;if(!s)throw new Error("wallet_sendCalls returned no id");for(let i=0;i<180;i++){let l;try{l=await r.request({method:"wallet_getCallsStatus",params:[s]})}catch{break}const c=od(l);if(c==="confirmed"){const u=ld(l);return u&&await Po(u.blockNumber),u||{status:"0x1"}}if(c==="failed")throw new Error((e?e+": ":"")+"batch reverted");await cd(1e3)}return null}async function dd(t){let e=null;for(const r of t)e=await we(r.to,r.data,r.value||0n);return e}function fd(t){return(t&&(t.code||t.data&&t.data.code))===4001||/reject|denied|cancell?ed/i.test(t&&t.message||"")}const Do=(t,e)=>({to:t,data:_.encodeCall(_.SEL.setApprovalForAll,[_.addrWord(e),_.boolWord(!0)])}),vd=(t,e,r,a)=>({to:t,data:_.encodeCall(_.SEL.list,[_.uintWord(e),_.uintWord(r),_.uintWord(a)])}),hd=(t,e,r,a,s)=>({to:t,data:_.encodeCall(_.SEL.listTo,[_.uintWord(e),_.uintWord(r),_.uintWord(a),_.addrWord(s)])}),pd=(t,e,r)=>({to:t,data:_.encodeCall(_.SEL.acceptOffer,[_.uintWord(e),_.uintWord(r)])}),Fo=(t,e,r)=>t?[r]:[e,r],Ot=()=>ut.rock,Ft=()=>ut.market,rt=(t,...e)=>_.encodeCall(t,e),_d=(1n<<256n)-1n,pt=t=>_.uintWord(t),Se=t=>_.addrWord(t),fr=async(t,e)=>_.words(await Re(t,e))[0],sa=async(t,e)=>_.wBig(await fr(t,e));async function Kn(t){try{return _.wAddr(await fr(Ot(),rt(_.SEL.ownerOf,pt(t))))}catch{return null}}const wd=t=>sa(Ot(),rt(_.SEL.mass,pt(t))),md=t=>sa(Ot(),rt(_.SEL.dust,pt(t))),bd=async t=>_.wBool(await fr(Ot(),rt(_.SEL.rolled,pt(t)))),zo=async t=>_.decodeString(await Re(Ot(),rt(_.SEL.tokenURI,pt(t)))),gd=async t=>{const e=await zo(t);return JSON.parse(atob(e.slice(e.indexOf(",")+1)))},Ei=12;async function yd(t){const e={};for(let r=0;r<t.length;r+=Ei){const a=t.slice(r,r+Ei).map(BigInt);_.decodeStringArray(await Re(Ot(),_.encodeUintArrayCall(_.SEL.tokenURIBatch,a))).forEach((i,l)=>{if(i)try{e[Number(a[l])]=JSON.parse(atob(i.slice(i.indexOf(",")+1))).image}catch{}})}return e}const kd=()=>sa(Ot(),rt(_.SEL.totalSupply)),xd=async()=>_.bitsOf(_.decodeFixedUintArray(await Re(Ot(),_.SEL.wrappedBitmap),40)),Hn=async t=>_.wAddr(await fr(Ot(),rt(_.SEL.wardens,Se(t)))),Ps=async t=>_.wBool(await fr(Ot(),rt(_.SEL.isApprovedForAll,Se(t),Se(Ft())))),Ws=async t=>_.decodeStruct(await Re(Ft(),rt(_.SEL.listings,pt(t))),_.LISTING),is=async t=>_.decodeStruct(await Re(Ft(),rt(_.SEL.bids,pt(t))),_.BID),jo=async t=>_.decodeStruct(await Re(Ft(),rt(_.SEL.lastSale,pt(t))),_.SALEINFO),Ed=async t=>sa(Ft(),rt(_.SEL.pendingWithdrawals,Se(t))),Sd=()=>sa(Ft(),rt(_.SEL.totalVolume)),os=new Map;async function qo(t){if(!t||jt(t)||jt(ut.gns))return null;const e=t.toLowerCase();if(os.has(e))return os.get(e);let r=null;try{const a=_.decodeString(await Re(ut.gns,rt(_.SEL.reverseResolve,Se(t))));r=a&&a.length?a:null}catch{r=null}return os.set(e,r),r}async function Si(t){const e=String(t??"").trim();if(!e||jt(ut.gns))return null;try{const r=_.wBig(await fr(ut.gns,_.encodeStringCall(_.SEL.computeId,e)));if(r!==0n){const a=_.wAddr(await fr(ut.gns,rt(_.SEL.resolveById,pt(r))));if(!jt(a))return a}}catch{}try{const r=_.wAddr(await fr(ut.gns,_.encodeStringCall(_.SEL.resolveByName,e)));if(!jt(r))return r}catch{}return null}const Uo=async()=>_.bitsOf(_.decodeFixedUintArray(await Re(Ft(),_.SEL.listedBitmap),40)),Vo=async()=>_.bitsOf(_.decodeFixedUintArray(await Re(Ft(),_.SEL.bidBitmap),40)),Ti=500;async function Ds(t,e,r){const a=[];for(let s=0;s<t.length;s+=Ti){const i=t.slice(s,s+Ti).map(BigInt),l=await Re(Ft(),_.encodeUintArrayCall(e,i));a.push(..._.decodeStructArray(l,r))}return a}async function Fs(t){return t.length?Ds(t,_.SEL.getListings,_.LISTING):[]}async function Yo(t){return t.length?Ds(t,_.SEL.getBids,_.BID):[]}async function Go(t){return t.length?Ds(t,_.SEL.getLastSales,_.SALEINFO):[]}async function Td(){const[t,e]=await Promise.all([Uo(),Vo()]),r=Array.from(new Set([...t,...e])).sort((c,u)=>c-u),[a,s,i]=await Promise.all([Fs(t),Yo(e),Go(r)]),l={};for(const c of r)l[c]={id:c};return t.forEach((c,u)=>l[c].listing=a[u]),e.forEach((c,u)=>l[c].bid=s[u]),r.forEach((c,u)=>l[c].sale=i[u]),r.map(c=>l[c])}async function Zo(t){if(!t.length)return[];const[e,r,a]=await Promise.all([Fs(t),Yo(t),Go(t)]);return t.map((s,i)=>({id:s,listing:e[i],bid:r[i],sale:a[i]}))}async function Id(t){const e=await jo(t);if(!e.count||e.count===0n)return[];const r=[],a="0x"+_.uintWord(t);let s=Number(e.blockNum),i=0;for(;s>0&&i<4096;){i++;const l=await Gr("eth_getLogs",[{address:Ft(),fromBlock:_.hexQuantity(s),toBlock:_.hexQuantity(s),topics:[[_.TOPIC.Bought,_.TOPIC.OfferAccepted],a]}]);if(!l.length)break;let c=0;for(const u of l){const f=u.topics[0].toLowerCase()===_.TOPIC.Bought,b=_.wAddr(_.strip(f?u.topics[3]:u.topics[2])),p=_.wAddr(_.strip(f?u.topics[2]:u.topics[3])),w=_.words(u.data);r.push({block:Number(BigInt(u.blockNumber)),price:_.wBig(w[0]),seller:b,buyer:p,kind:f?"buy":"accept"});const v=_.wNum(w[1]);(c===0||v<c)&&(c=v)}s=c}return r.sort((l,c)=>c.block-l.block),r}const ls=9e3,Ld=t=>/range|limit|exceed|too many|too large|too wide|more than|response size|block range/i.test(String(t?.message??t?.data?.message??t));async function Ad(t,e,r){const a=[];let s=e,i=ls;for(;s<=r;){const l=Math.min(s+i-1,r);try{const c=await Gr("eth_getLogs",[{...t,fromBlock:_.hexQuantity(s),toBlock:_.hexQuantity(l)}]);a.push(...c),s=l+1,i<ls&&(i=Math.min(ls,i*2))}catch(c){if(i<=1||!Ld(c))throw c;i=Math.max(1,Math.floor(i/2))}}return a}async function Cd(t){try{return _.decodeUintArray(await Re(Ot(),rt(_.SEL.tokensOfOwner,Se(t)))).map(Number).sort((r,a)=>r-a)}catch{}try{return await Od(t)}catch{return Rd(t)}}const Ii=1e3;async function Od(t){const e=Number(ut.maxId)||1e4,r=[];for(let a=0;a<e;a+=Ii){const s=Math.min(a+Ii,e),i=rt(_.SEL.tokensOfOwnerIn,Se(t),pt(a),pt(s));r.push(..._.decodeUintArray(await Re(Ot(),i)).map(Number))}return r.sort((a,s)=>a-s)}async function Rd(t){const e="0x"+_.addrWord(t),r=(await Wo()).number,a=Number(ut.deployBlock)||0,s=await Ad({address:Ot(),topics:[_.TOPIC.Transfer,null,e]},a,r),i=Array.from(new Set(s.map(c=>_.wNum(_.strip(c.topics[3]))))).sort((c,u)=>c-u),l=[];for(const c of i){const u=await Kn(BigInt(c));u&&u.toLowerCase()===t.toLowerCase()&&l.push(c)}return l}const Li=()=>we(Ot(),rt(_.SEL.createWarden));async function Nd(t){const e=await Hn(C.account);if(jt(e))throw new Error("create your warden first");return we(ut.v1,rt(_.SEL.giftRock,pt(t),Se(e)))}const Bd=t=>we(Ot(),rt(_.SEL.wrap,pt(t))),Md=t=>we(Ot(),rt(_.SEL.unwrap,pt(t))),Hd=t=>we(Ot(),rt(_.SEL.rescue,pt(t)));async function Pd(t,e){const r=C.account,a={to:Ot(),data:rt(_.SEL.safeTransferFrom,Se(r),Se(e),pt(t))},s=await Ws(t),l=!jt(s.seller)&&s.seller.toLowerCase()===String(r).toLowerCase()?[{to:Ft(),data:rt(_.SEL.cancelListing,pt(t))},a]:[a];return aa(l,"transfer #"+t)}const Ko=async t=>_.wAddr(await fr(ut.v1,rt(_.SEL.rocks,pt(t))));async function Wd(t,e){const r=async i=>{if(jt(i)||!e)return!1;try{const l=_.wAddr(await fr(i,rt(_.SEL.ownerOf,pt(t))));return!!l&&l.toLowerCase()===e.toLowerCase()}catch{return!1}},[a,s]=await Promise.all([r(ut.wrapperSub100),r(ut.wrapper10k)]);return a?"sub100":s?"tenk":null}function Dd(t,e){const r=t==="tenk"?ut.wrapper10k:ut.wrapperSub100;return we(r,rt(_.SEL.safeTransferFrom,Se(C.account),Se(Ot()),pt(e)))}const Fd=(t,e,r)=>we(Ot(),rt(_.SEL.merge,pt(t),pt(e),pt(r)));async function zd(t){const e=await Hn(C.account);if(jt(e))throw new Error("create your warden first");return aa([{to:ut.v1,data:rt(_.SEL.sellRock,pt(t),pt(_d))},{to:ut.v1,data:rt(_.SEL.giftRock,pt(t),Se(e))},{to:Ot(),data:rt(_.SEL.wrap,pt(t))}],"wrap #"+t)}async function jd(t,e,r=null){const a=await Hn(C.account);if(jt(a))throw new Error("create your warden first");const s=Array.isArray(t)?t:[t];if(!s.length)throw new Error("no dust rocks given");const i=r===null?null:new Set(r.map(String)),l=s.flatMap(u=>[...i===null||i.has(String(u))?[{to:ut.v1,data:rt(_.SEL.giftRock,pt(u),Se(a))}]:[],{to:Ot(),data:rt(_.SEL.absorb,pt(u),pt(e))}]),c=s.length===1?"#"+s[0]:s.length+" dust rocks";return aa(l,`absorb ${c} into #${e}`)}const Xo=t=>we(Ft(),rt(_.SEL.cancelListing,pt(t)));async function Qo(t){const e=await Ws(t);if(jt(e.seller))throw new Error("not listed");return we(Ft(),rt(_.SEL.buy,pt(t)),e.price)}const qd=(t,e)=>we(Ft(),rt(_.SEL.makeOffer,pt(t)),e),Jo=t=>we(Ft(),rt(_.SEL.withdrawOffer,pt(t))),Ud=()=>we(Ft(),rt(_.SEL.withdraw)),Vd=t=>we(Ft(),rt(_.SEL.pruneListing,pt(t)));async function Yd(t,e,r,a=null){const s=await Ps(C.account),i=a?hd(Ft(),t,e,r,a):vd(Ft(),t,e,r),l=(a?"private list #":"list #")+t;return aa(Fo(s,Do(Ot(),Ft()),i),l)}async function Gd(t,e){const r=await Ps(C.account);return aa(Fo(r,Do(Ot(),Ft()),pd(Ft(),t,e)),"accept offer on #"+t)}var Zd=x("<a> </a>"),Kd=x('<a href="#/account"><span class="dot svelte-1jnx671"></span><span class="who svelte-1jnx671"> </span></a> <button type="button" class="svelte-1jnx671">Disconnect</button>',1),Xd=x("<option> </option>"),Qd=x("<option>no wallet</option>"),Jd=x('<select aria-label="Choose wallet"><!><!></select> <button type="button" class="primary svelte-1jnx671">Connect</button>',1),$d=x('<span class="why svelte-1jnx671"> </span>'),tf=x('<div class="netbar svelte-1jnx671"><span> </span> <button type="button" class="svelte-1jnx671"> </button> <!></div>'),ef=x('<div class="netbar bad svelte-1jnx671"> </div>'),rf=x('<header class="svelte-1jnx671"><div class="bar svelte-1jnx671"><a class="brand svelte-1jnx671" href="#/" aria-label="EthereumRock home"><svg class="logo svelte-1jnx671" viewBox="0 0 8 8" shape-rendering="crispEdges" width="27" height="27" aria-hidden="true"><path fill="#78746b" d="M3 1H4V2H5V3H6V7H3V6H2V3H3Z"></path><path fill="#000" fill-opacity="0.902" d="M3 1H4V2H3ZM3 6H4V7H3Z"></path><path fill="#fff" fill-opacity="0.251" d="M4 2H5V3H4Z"></path><path fill="#000" fill-opacity="0.502" d="M2 3H3V5H2ZM5 6H6V7H5Z"></path><path fill="#000" fill-opacity="0.251" d="M5 4H6V6H5Z"></path><path fill="#000" fill-opacity="0.749" d="M2 5H3V6H2ZM4 6H5V7H4Z"></path></svg></a> <nav class="tabs svelte-1jnx671"></nav> <div class="right svelte-1jnx671"><!></div></div> <!> <!></header>');function nf(t,e){Ge(e,!0);let r=A("");ue(()=>{const B=C.providers;B.length&&!B.some(F=>F.info.uuid===n(r))&&m(r,B[0].info.uuid,!0)});let a=A(null);ue(()=>{const B=C.account;if(m(a,null),!B)return;let F=!0;return qo(B).then(Z=>{F&&m(a,Z,!0)}).catch(()=>{}),()=>{F=!1}});let s=A(null);async function i(){m(s,null);try{await C.connect(n(r))}catch(B){m(s,pe(B),!0)}}let l=A(!1),c=A(null);async function u(){m(c,null),m(l,!0);try{await C.switchChain(ut.chainId,{rpcUrl:ut.rpcUrl,chainName:ut.chainId===31337?"Hardhat (31337)":"Chain "+ut.chainId})}catch(B){m(c,pe(B),!0)}m(l,!1)}const f=[{href:"#/",path:"/",label:"Home"},{href:"#/market",path:"/market",label:"Market"},{href:"#/wrap",path:"/wrap",label:"Wrap"}],b=B=>B==="/"?gs.path==="/":gs.path.startsWith(B);var p=rf(),w=o(p),v=d(o(w),2);Tr(v,21,()=>f,B=>B.path,(B,F)=>{var Z=Zd();let _t;var U=o(Z);E(yt=>{Gt(Z,"href",n(F).href),_t=Ur(Z,1,"svelte-1jnx671",null,_t,yt),g(U,n(F).label)},[()=>({active:b(n(F).path)})]),h(B,Z)});var y=d(v,2),I=o(y);{var k=B=>{var F=Kd(),Z=lt(F);let _t;var U=d(o(Z)),yt=o(U),mt=d(Z,2);E((St,Lt)=>{_t=Ur(Z,1,"chip svelte-1jnx671",null,_t,St),Gt(Z,"title","Your account · "+C.account),g(yt,Lt)},[()=>({warn:C.chainId!==ut.chainId,active:b("/account")}),()=>n(a)??Ca(C.account)]),ct("click",mt,()=>C.disconnect()),h(B,F)},R=B=>{var F=Jd(),Z=lt(F),_t=o(Z);Tr(_t,17,()=>C.providers,St=>St.info.uuid,(St,Lt)=>{var se=Xd(),tt=o(se),H={};E(()=>{g(tt,n(Lt).info.name),H!==(H=n(Lt).info.uuid)&&(se.value=(se.__value=n(Lt).info.uuid)??"")}),h(St,se)});var U=d(_t);{var yt=St=>{var Lt=Qd();Lt.value=Lt.__value="",h(St,Lt)};S(U,St=>{C.providers.length||St(yt)})}var mt=d(Z,2);Bs(Z,()=>n(r),St=>m(r,St)),ct("click",mt,i),h(B,F)};S(I,B=>{C.account?B(k):B(R,-1)})}var Y=d(w,2);{var G=B=>{var F=tf(),Z=o(F),_t=o(Z),U=d(Z,2),yt=o(U),mt=d(U,2);{var St=Lt=>{var se=$d(),tt=o(se);E(()=>g(tt,n(c))),h(Lt,se)};S(mt,Lt=>{n(c)&&Lt(St)})}E(()=>{g(_t,`Wrong network. This app is on chain ${ut.chainId}, your wallet is on ${C.chainId??"another chain"??""}.`),U.disabled=n(l),g(yt,n(l)?"switching…":"Switch network")}),ct("click",U,u),h(B,F)};S(Y,B=>{C.account&&C.chainId!==ut.chainId&&B(G)})}var D=d(Y,2);{var nt=B=>{var F=ef(),Z=o(F);E(()=>g(Z,n(s))),h(B,F)};S(D,B=>{n(s)&&!C.account&&B(nt)})}h(t,p),Ze()}Yr(["click"]);Ac();var af=xo('<g><path d="M3 1H4V2H5V3H6V7H3V6H2V3H3Z"></path><path fill="#000" fill-opacity="0.90" d="M3 1H4V2H3ZM3 6H4V7H3Z"></path><path fill="#fff" fill-opacity="0.25" d="M4 2H5V3H4Z"></path><path fill="#000" fill-opacity="0.50" d="M2 3H3V5H2ZM5 6H6V7H5Z"></path><path fill="#000" fill-opacity="0.25" d="M5 4H6V6H5Z"></path><path fill="#000" fill-opacity="0.75" d="M2 5H3V6H2ZM4 6H5V7H4Z"></path></g>'),sf=xo('<svg class="banner svelte-e1tb7l" viewBox="0 0 33 7.6" shape-rendering="crispEdges" aria-hidden="true"></svg>');function of(t){const e=[{x:3.5,scale:.88,h:26,s:10,l:38},{x:8.7,scale:1,h:190,s:74,l:52},{x:13.9,scale:.74,h:30,s:34,l:58},{x:19.1,scale:.94,h:46,s:24,l:76},{x:24.3,scale:.67,h:20,s:22,l:46},{x:29.5,scale:.9,h:348,s:62,l:56}];var r=sf();Tr(r,5,()=>e,mu,(a,s)=>{var i=af(),l=o(i);E(()=>{Gt(i,"transform",`translate(${n(s).x??""} 6.8) scale(${n(s).scale??""}) translate(-4 -7)`),Gt(l,"fill",`hsl(${n(s).h??""},${n(s).s??""}%,${n(s).l??""}%)`)}),h(a,i)}),h(t,r)}var lf=x(`<div class="home svelte-1nmp6pz"><h1 class="svelte-1nmp6pz">EthereumRock</h1> <!> <article class="story svelte-1nmp6pz"><p class="lede svelte-1nmp6pz">On 12/26/2017 the EtherRock project launched, cementing itself as one of the first NFTs on Ethereum mainnet. What most people do
not know is that there was a precursor, seventeen hours earlier. The same developer had already
deployed a version of the smart contract with some bugs in it and replaced it the next morning. Let's call that one
EtherRock v1.</p> <p class="svelte-1nmp6pz">The collection was meant to be a hundred pet rocks. A single mistyped <code class="svelte-1nmp6pz">=</code> in <code class="svelte-1nmp6pz">buyRock</code> left every rock permanently "for sale" at whatever price it had stored and
rocks above 100 had <code class="svelte-1nmp6pz">0</code> stored, so anyone could claim those for the cost of gas.</p> <p class="svelte-1nmp6pz">Both EtherRock contracts predate the ERC-721 standard, so nothing can list them without a proper
wrapper. 2021 brought the first attempt at one for v1, which put the buyRock bug out of reach and arrived as two contracts: "Genesis
Rocks" and "Genesis Rocks: 100-9999", effectively splitting the collectors into the elite hundred and everyone else.
The EtherRock developer had publicly disowned v1 by then and its collection was delisted, and between the split and
the disowning the whole thing was abandoned (again).</p> <p class="svelte-1nmp6pz">EthereumRock is a new shot at this, a better and CROPS aligned one. It is an experiment for the
first 10k rocks: merge two you own and the higher number burns into the lower, so the supply can
shrink back to the 100 originally intended. The collectors have full control over whether it does.</p> <p class="svelte-1nmp6pz">The art carries the same lineage. EtherRock used royalty-free clip art. Genesis Rocks pixelated
it and pinned the result to IPFS, where the whole 100-9999 set shares the same hundred images.
EthereumRock draws every rock on chain from its own seed, so each one is its own picture and
there is nothing left to pin.</p> <p class="svelte-1nmp6pz">The other mistake worth not repeating is a single point of failure, so everything here is on
chain. The art and the metadata are on chain. The marketplace is on chain and takes zero fees.
Even this website is on chain and can be read straight out of the smart contract. All of it
should outlive me, for as long as Ethereum is up and running.</p> <div class="cta svelte-1nmp6pz"><a class="btn primary svelte-1nmp6pz" href="#/market">Browse the market</a> <a class="btn svelte-1nmp6pz" href="#/wrap">Wrap a rock</a></div></article></div>`);function cf(t){var e=lf(),r=d(o(e),2);of(r),h(t,e)}const uf="400px 0px",df=50,ff=200,en=new Map;function vf(t,e){for(en.set(t,e);en.size>ff;)en.delete(en.keys().next().value)}function $o(){en.clear()}let zn=null;con