@@ -145,16 +145,17 @@ export default function useRoller() {
145145 }
146146
147147 const pointNum = Number(point);
148− const rawDetails = await api.getPoint(pointNum);
149− const isL2 = isL2Spawn(rawDetails?.dominion);
150−
151− const details = toL1Details(rawDetails);
152148
153149 try {
154− if (isL2) {
155− const l2Quota = isL2 ? await api.getRemainingQuota(pointNum) : 0;
156− const l2Allowance = isL2 ? await api.getAllowance(pointNum) : 0;
150+ // Try fetching from the roller
151+ const rawDetails = await api.getPoint(pointNum); // this fails for newly spawned L1 point until roller updates
152+ const details = toL1Details(rawDetails);
153+ const isL2 = isL2Spawn(rawDetails?.dominion);
157154
155+ if (isL2) {
156+ // Scenario 1: L2 point exists in roller state - use roller data
157+ const l2Quota = await api.getRemainingQuota(pointNum);
158+ const l2Allowance = await api.getAllowance(pointNum);
158159 return new Point({
159160 value: pointNum,
160161 details,
@@ -162,30 +163,48 @@ export default function useRoller() {
162163 l2Quota,
163164 l2Allowance,
164165 });
166+ } else {
167+ // Scenario 2: L1 point exists in roller state - use combination of chain and roller data
168+ const _contracts = need.contracts(contracts);
169+ const l1Details = await azimuth.azimuth.getPoint(
170+ _contracts,
171+ pointNum
172+ );
173+ // Override with roller data for accuracy, L1 data here could be stale
174+ l1Details.sponsor = details.sponsor;
175+ l1Details.escapeRequested = details.escapeRequested;
176+ l1Details.escapeRequestedTo = details.escapeRequestedTo;
177+ return new Point({
178+ value: pointNum,
179+ details: l1Details,
180+ address: _wallet.address,
181+ });
165182 }
166−
167− const _contracts = need.contracts(contracts);
168− const l1Details = await azimuth.azimuth.getPoint(_contracts, point);
169−
170− l1Details.sponsor = details.sponsor;
171− l1Details.escapeRequested = details.escapeRequested;
172− l1Details.escapeRequestedTo = details.escapeRequestedTo;
173−
174− return new Point({
175− value: pointNum,
176− details: l1Details,
177− address: _wallet.address,
178− });
179183 } catch (e) {
180− console.warn(e);
181− // Just return a placeholder Point
182− const details: L1Point = toL1Details();
183− return new Point({
184− value: pointNum,
185− details,
186− address: _wallet.address,
187− isPlaceholder: true,
188− });
184+ // roller failed to fetch point
185+ try {
186+ // Scenario 3: Newly spawned L1 point - not in roller state yet, use chain data only
187+ const _contracts = need.contracts(contracts);
188+ const l1Details = await azimuth.azimuth.getPoint(
189+ _contracts,
190+ pointNum
191+ );
192+ return new Point({
193+ value: pointNum,
194+ details: l1Details,
195+ address: _wallet.address,
196+ });
197+ } catch (e2) {
198+ // Scenario 4: Some other issue, point doesn’t exist on chain or in roller state. Just return placeholder.
199+ console.warn('Failed to fetch point data:', e2);
200+ const details: L1Point = toL1Details();
201+ return new Point({
202+ value: pointNum,
203+ details,
204+ address: _wallet.address,
205+ isPlaceholder: true,
206+ });
207+ }
189208 }
190209 },
191210 [api, wallet, contracts]
@@ -309,14 +328,14 @@ export default function useRoller() {
309328 proxy === 'own'
310329 ? await api.getOwnedPoints(address)
311330 : proxy === 'manage'
312− ? await api.getManagerFor(address)
313− : proxy === 'vote'
314− ? await api.getVotingFor(address)
315− : proxy === 'transfer'
316− ? await api.getTransferringFor(address)
317− : proxy === 'spawn'
318− ? await api.getSpawningFor(address)
319− : [];
331+ ? await api.getManagerFor(address)
332+ : proxy === 'vote'
333+ ? await api.getVotingFor(address)
334+ : proxy === 'transfer'
335+ ? await api.getTransferringFor(address)
336+ : proxy === 'spawn'
337+ ? await api.getSpawningFor(address)
338+ : [];
320339
321340 return points;
322341 },
@@ -365,14 +384,14 @@ export default function useRoller() {
365384 const networkSeed = customNetworkSeed
366385 ? customNetworkSeed
367386 : await attemptNetworkSeedDerivation({
368− urbitWallet,
369− wallet,
370− authMnemonic,
371− details: point,
372− authToken,
373− point: point.value,
374− revision: nextRevision,
375− });
387+ urbitWallet,
388+ wallet,
389+ authMnemonic,
390+ details: point,
391+ authToken,
392+ point: point.value,
393+ revision: nextRevision,
394+ });
376395 const txHash = await submitL2Transaction({
377396 api,
378397 wallet: _wallet,
@@ -422,7 +441,7 @@ export default function useRoller() {
422441 let nonce = await api.getNonce({ ship: point, proxy });
423442 const progress = onUpdate
424443 ? (state: number) => onUpdate({ type: 'progress', state })
425− : () => {};
444+ : () => { };
426445
427446 let requests = [];
428447