@@ -2075,18 +2116,41 @@ function renderPaperLeaderboard(store){
const rows=Object.values(store.accounts).map(a=>{markPaperToMarket(a);const eq=paperEquity(a),ret=(eq/a.starting_balance-1)*100;return {a,eq,ret};}).sort((x,y)=>y.ret-x.ret);
root.innerHTML=rows.map((r,i)=>`
#${i+1} ${esc(r.a.name)}${r.a.positions.length} open · ${fmtUSD(r.eq)} equity
${fmtPct(r.ret)}
`).join("");
}
+function renderPaperPortfolioChart(acct){
+ const svg=$("paperPortfolioChart");if(!svg)return;
+ const snaps=(acct.snapshots||[]).filter(s=>Number.isFinite(snapTime(s))).sort((a,b)=>snapTime(a)-snapTime(b));
+ if(snaps.length<2){svg.innerHTML=`
Portfolio value history will appear after a few account changes.`;return;}
+ const W=720,H=260,padL=62,padR=24,padT=26,padB=38,vals=snaps.map(s=>s.equity),mn=Math.min(...vals),mx=Math.max(...vals),span=(mx-mn)||1;
+ const x=i=>padL+(i/(snaps.length-1))*(W-padL-padR),y=v=>padT+(mx-v)/span*(H-padT-padB);
+ const d=vals.map((v,i)=>`${i?"L":"M"}${x(i).toFixed(1)},${y(v).toFixed(1)}`).join(" ");
+ let inner=`
`;
+ for(let i=0;i<4;i++){const v=mn+(span*i/3),yy=y(v);inner+=`
${fmtUSD(v)}`;}
+ inner+=`
`;
+ for(const tick of chartTicks(snaps.map(snapTime),4)){inner+=`
${chartDateLabel(tick.t,true)}`;}
+ svg.innerHTML=inner;
+}
async function searchPaperMarkets(){
const q=($("paperSearchInput").value||"").trim();
if(!q)return toast("Enter a market search.");
+ PAPER_MARKET_OFFSET=0;PAPER_MARKET_QUERY=q;
+ await loadPaperMarketPage(true);
+}
+async function loadPaperMarketPage(reset=false){
+ const q=PAPER_MARKET_QUERY||(($("paperSearchInput")&&$("paperSearchInput").value)||"").trim();
setStatus("searching Polymarket...",true);
try{
- const params=new URLSearchParams({closed:"false",active:"true",archived:"false",include_tag:"true",limit:"80",order:"volume24hr",ascending:"false",search:q});
+ if(reset){PAPER_SEARCH_RESULTS=[];PAPER_MARKET_OFFSET=0;}
+ const params=new URLSearchParams({closed:"false",active:"true",archived:"false",include_tag:"true",limit:"100",offset:String(PAPER_MARKET_OFFSET),order:"volume24hr",ascending:"false"});
+ if(q)params.set("search",q);
const r=await fetch(`${GAMMA}/markets?${params}`);
- if(!r.ok)throw new Error("search failed");
+ if(!r.ok)throw new Error("market load failed");
const raw=await r.json();
- PAPER_SEARCH_RESULTS=raw.map(normalizeMarket).filter(Boolean).map(paperTradeFromMarket);
+ const next=raw.map(normalizeMarket).filter(Boolean).map(paperTradeFromMarket);
+ PAPER_SEARCH_RESULTS=(PAPER_SEARCH_RESULTS||[]).concat(next);
+ PAPER_MARKET_OFFSET+=raw.length;
renderPaperTab();setStatus("up to date",false);
- }catch(e){setStatus("search error",false);toast("Polymarket search failed.");}
+ toast(next.length?`Loaded ${PAPER_SEARCH_RESULTS.length} active markets.`:"No more active markets found.");
+ }catch(e){setStatus("market load error",false);toast("Polymarket market load failed.");}
}
function renderAbout(){
const root=$("aboutAgents");if(!root)return;
@@ -2169,7 +2233,18 @@ $("paperDepositBtn").addEventListener("click",()=>paperMoveCash("deposit",$("pap
$("paperWithdrawBtn").addEventListener("click",()=>paperMoveCash("withdraw",$("paperMoneyAmount").value,$("paperPasswordInput").value));
$("buyAgentBtn").addEventListener("click",()=>paperBuyAgent($("buyAgentSelect").value,$("buyAgentAmount").value));
$("paperSearchBtn").addEventListener("click",()=>searchPaperMarkets());
-$("paperClearSearchBtn").addEventListener("click",()=>{PAPER_SEARCH_RESULTS=null;renderPaperTab();});
+$("paperAllBtn").addEventListener("click",()=>{PAPER_MARKET_QUERY="";PAPER_SEARCH_RESULTS=[];loadPaperMarketPage(true);});
+$("paperMoreBtn").addEventListener("click",()=>loadPaperMarketPage(false));
+$("paperClearSearchBtn").addEventListener("click",()=>{PAPER_SEARCH_RESULTS=null;PAPER_MARKET_OFFSET=0;PAPER_MARKET_QUERY="";renderPaperTab();});
+$("paperLoginBtn").addEventListener("click",()=>{
+ const acct=activePaperAccount();
+ if(requirePaperUnlock(acct,$("paperPasswordInput").value)){renderPaperTab();toast("Logged in.");}
+});
+$("paperSignOutBtn").addEventListener("click",()=>{
+ const acct=activePaperAccount();
+ sessionStorage.removeItem(unlockKey(acct.id));
+ renderPaperTab();toast("Signed out of paper account.");
+});
window.addEventListener("focus",()=>refreshFromCloudAndRender(true));
document.addEventListener("visibilitychange",()=>{
if(!document.hidden)refreshFromCloudAndRender(true);