[{"data":1,"prerenderedAt":2022},["ShallowReactive",2],{"navigation_docs":3,"-testing-local-scenarios":137,"-testing-local-scenarios-surround":2017},[4,27,57,79,97,115],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Mini Apps","i-lucide-smartphone","\u002Fmini-apps","2.mini-apps",[33,37,41,45,49,53],{"title":34,"path":35,"stem":36},"Provider runtime","\u002Fmini-apps\u002Fprovider-runtime","2.mini-apps\u002F1.provider-runtime",{"title":38,"path":39,"stem":40},"Ethereum provider","\u002Fmini-apps\u002Fethereum-provider","2.mini-apps\u002F2.ethereum-provider",{"title":42,"path":43,"stem":44},"Language and i18n","\u002Fmini-apps\u002Flanguage-i18n","2.mini-apps\u002F3.language-i18n",{"title":46,"path":47,"stem":48},"Local simulator","\u002Fmini-apps\u002Flocal-simulator","2.mini-apps\u002F4.local-simulator",{"title":50,"path":51,"stem":52},"Nuxt module","\u002Fmini-apps\u002Fnuxt-module","2.mini-apps\u002F5.nuxt-module",{"title":54,"path":55,"stem":56},"Host runtime","\u002Fmini-apps\u002Fhost-runtime","2.mini-apps\u002F6.host-runtime",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":26},"Auth","i-lucide-key-round","\u002Fauth","3.auth",[63,67,71,75],{"title":64,"path":65,"stem":66},"Nimiq Better Auth","\u002Fauth\u002Fnimiq-better-auth","3.auth\u002F1.nimiq-better-auth",{"title":68,"path":69,"stem":70},"Cross-device approval","\u002Fauth\u002Fcross-device","3.auth\u002F2.cross-device",{"title":72,"path":73,"stem":74},"Nimiq cross-device adapter","\u002Fauth\u002Fnimiq-adapter","3.auth\u002F3.nimiq-adapter",{"title":76,"path":77,"stem":78},"Security model","\u002Fauth\u002Fsecurity-model","3.auth\u002F4.security-model",{"title":80,"icon":81,"path":82,"stem":83,"children":84,"page":26},"Utilities","i-lucide-wrench","\u002Futilities","4.utilities",[85,89,93],{"title":86,"path":87,"stem":88},"Universal Nimiq facade","\u002Futilities\u002Funimiq","4.utilities\u002F1.unimiq",{"title":90,"path":91,"stem":92},"ERC-20 helpers","\u002Futilities\u002Funerc20","4.utilities\u002F2.unerc20",{"title":94,"path":95,"stem":96},"Better Auth ledger","\u002Futilities\u002Fledger","4.utilities\u002F3.ledger",{"title":98,"icon":99,"path":100,"stem":101,"children":102,"page":26},"Testing","i-lucide-test-tube-2","\u002Ftesting","5.testing",[103,107,111],{"title":104,"path":105,"stem":106},"Local scenarios","\u002Ftesting\u002Flocal-scenarios","5.testing\u002F1.local-scenarios",{"title":108,"path":109,"stem":110},"Vitest helpers","\u002Ftesting\u002Fvitest-helpers","5.testing\u002F2.vitest-helpers",{"title":112,"path":113,"stem":114},"Bridge mode","\u002Ftesting\u002Fbridge-mode","5.testing\u002F3.bridge-mode",{"title":116,"icon":117,"path":118,"stem":119,"children":120,"page":26},"Reference","i-lucide-book-open","\u002Freference","6.reference",[121,125,129,133],{"title":122,"path":123,"stem":124},"Packages","\u002Freference\u002Fpackages","6.reference\u002F1.packages",{"title":126,"path":127,"stem":128},"Endpoints","\u002Freference\u002Fendpoints","6.reference\u002F2.endpoints",{"title":130,"path":131,"stem":132},"Runtime support","\u002Freference\u002Fruntime-support","6.reference\u002F3.runtime-support",{"title":134,"path":135,"stem":136},"Public API exports","\u002Freference\u002Fpublic-api","6.reference\u002F4.public-api",{"id":138,"title":104,"body":139,"description":2011,"extension":2012,"links":2013,"meta":2014,"navigation":216,"path":105,"seo":2015,"stem":106,"__hash__":2016},"docs\u002F5.testing\u002F1.local-scenarios.md",{"type":140,"value":141,"toc":2004},"minimark",[142,151,158,163,169,326,329,367,374,378,384,694,697,713,717,720,1243,1247,1253,1445,1447,1467,1471,1474,1997,2000],[143,144,145,146,150],"p",{},"Use ",[147,148,149],"code",{},"@onmax\u002Fbetter-auth-nimiq-pay-e2e"," local scenarios when you need deterministic Nimiq Pay Better Auth flow tests without a real mini-app host, injected provider, or network calls.",[143,152,153,154,157],{},"Do not use local scenarios as the only signal for host integration. They prove your app wiring and auth flow shape, not the real ",[147,155,156],{},"window.nimiq"," bridge.",[159,160,162],"h2",{"id":161},"start-with-a-profile","Start with a profile",[143,164,145,165,168],{},[147,166,167],{},"defineE2EProfile()"," to keep local, CI, and bridge runs on the same configuration surface.",[170,171,177],"pre",{"className":172,"code":173,"filename":174,"language":175,"meta":176,"style":176},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineE2EProfile } from '@onmax\u002Fbetter-auth-nimiq-pay-e2e'\n\nexport const profile = defineE2EProfile({\n  env: process.env,\n  playgroundUrl: 'http:\u002F\u002F127.0.0.1:3000',\n  endpointPrefix: '\u002Fnimiq',\n  qrEndpointPrefix: '\u002Fcross-device',\n})\n","test\u002Fe2e\u002Fprofile.ts","ts","",[147,178,179,211,218,243,265,283,300,317],{"__ignoreMap":176},[180,181,184,188,192,196,199,202,205,208],"span",{"class":182,"line":183},"line",1,[180,185,187],{"class":186},"s7zQu","import",[180,189,191],{"class":190},"sMK4o"," {",[180,193,195],{"class":194},"sTEyZ"," defineE2EProfile",[180,197,198],{"class":190}," }",[180,200,201],{"class":186}," from",[180,203,204],{"class":190}," '",[180,206,149],{"class":207},"sfazB",[180,209,210],{"class":190},"'\n",[180,212,214],{"class":182,"line":213},2,[180,215,217],{"emptyLinePlaceholder":216},true,"\n",[180,219,221,224,228,231,234,237,240],{"class":182,"line":220},3,[180,222,223],{"class":186},"export",[180,225,227],{"class":226},"spNyl"," const",[180,229,230],{"class":194}," profile ",[180,232,233],{"class":190},"=",[180,235,195],{"class":236},"s2Zo4",[180,238,239],{"class":194},"(",[180,241,242],{"class":190},"{\n",[180,244,246,250,253,256,259,262],{"class":182,"line":245},4,[180,247,249],{"class":248},"swJcz","  env",[180,251,252],{"class":190},":",[180,254,255],{"class":194}," process",[180,257,258],{"class":190},".",[180,260,261],{"class":194},"env",[180,263,264],{"class":190},",\n",[180,266,268,271,273,275,278,281],{"class":182,"line":267},5,[180,269,270],{"class":248},"  playgroundUrl",[180,272,252],{"class":190},[180,274,204],{"class":190},[180,276,277],{"class":207},"http:\u002F\u002F127.0.0.1:3000",[180,279,280],{"class":190},"'",[180,282,264],{"class":190},[180,284,286,289,291,293,296,298],{"class":182,"line":285},6,[180,287,288],{"class":248},"  endpointPrefix",[180,290,252],{"class":190},[180,292,204],{"class":190},[180,294,295],{"class":207},"\u002Fnimiq",[180,297,280],{"class":190},[180,299,264],{"class":190},[180,301,303,306,308,310,313,315],{"class":182,"line":302},7,[180,304,305],{"class":248},"  qrEndpointPrefix",[180,307,252],{"class":190},[180,309,204],{"class":190},[180,311,312],{"class":207},"\u002Fcross-device",[180,314,280],{"class":190},[180,316,264],{"class":190},[180,318,320,323],{"class":182,"line":319},8,[180,321,322],{"class":190},"}",[180,324,325],{"class":194},")\n",[143,327,328],{},"Default profile values:",[170,330,335],{"className":331,"code":332,"filename":333,"language":334,"meta":176,"style":176},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","network: testnet\nmode: local\nendpointPrefix: \u002Fnimiq\nqrEndpointPrefix: \u002Fmobile-qr\nplaygroundUrl: http:\u002F\u002F127.0.0.1:3000\nnuxtAuthBaseUrl: http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fauth\n","profile","txt",[147,336,337,342,347,352,357,362],{"__ignoreMap":176},[180,338,339],{"class":182,"line":183},[180,340,341],{},"network: testnet\n",[180,343,344],{"class":182,"line":213},[180,345,346],{},"mode: local\n",[180,348,349],{"class":182,"line":220},[180,350,351],{},"endpointPrefix: \u002Fnimiq\n",[180,353,354],{"class":182,"line":245},[180,355,356],{},"qrEndpointPrefix: \u002Fmobile-qr\n",[180,358,359],{"class":182,"line":267},[180,360,361],{},"playgroundUrl: http:\u002F\u002F127.0.0.1:3000\n",[180,363,364],{"class":182,"line":285},[180,365,366],{},"nuxtAuthBaseUrl: http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fauth\n",[143,368,369,370,373],{},"Mainnet E2E runs are blocked unless ",[147,371,372],{},"NIMIQ_PAY_E2E_ALLOW_MAINNET=true",", and mainnet runs are disabled in CI.",[159,375,377],{"id":376},"test-direct-sign-in-locally","Test direct sign-in locally",[143,379,145,380,383],{},[147,381,382],{},"runSignInScenario()"," for the full nonce -> sign -> verify loop.",[170,385,388],{"className":172,"code":386,"filename":387,"language":175,"meta":176,"style":176},"import { describe, expect, it } from 'vitest'\nimport { runSignInScenario } from '@onmax\u002Fbetter-auth-nimiq-pay-e2e'\nimport { profile } from '.\u002Fprofile'\n\ndescribe('Nimiq Pay auth', () => {\n  it('signs in with a deterministic local provider', async () => {\n    const result = await runSignInScenario({\n      profile,\n      origin: 'https:\u002F\u002Fexample.test',\n      requestAddressBeforeVerify: false,\n    })\n\n    expect(result).toMatchObject({\n      ok: true,\n      network: 'testnet',\n      mode: 'local',\n      token: 'local-token-1',\n    })\n  })\n})\n","test\u002Fe2e\u002Flocal-auth.e2e.test.ts",[147,389,390,421,440,460,464,489,514,534,541,558,572,580,585,608,621,638,655,672,679,687],{"__ignoreMap":176},[180,391,392,394,396,399,402,405,407,410,412,414,416,419],{"class":182,"line":183},[180,393,187],{"class":186},[180,395,191],{"class":190},[180,397,398],{"class":194}," describe",[180,400,401],{"class":190},",",[180,403,404],{"class":194}," expect",[180,406,401],{"class":190},[180,408,409],{"class":194}," it",[180,411,198],{"class":190},[180,413,201],{"class":186},[180,415,204],{"class":190},[180,417,418],{"class":207},"vitest",[180,420,210],{"class":190},[180,422,423,425,427,430,432,434,436,438],{"class":182,"line":213},[180,424,187],{"class":186},[180,426,191],{"class":190},[180,428,429],{"class":194}," runSignInScenario",[180,431,198],{"class":190},[180,433,201],{"class":186},[180,435,204],{"class":190},[180,437,149],{"class":207},[180,439,210],{"class":190},[180,441,442,444,446,449,451,453,455,458],{"class":182,"line":220},[180,443,187],{"class":186},[180,445,191],{"class":190},[180,447,448],{"class":194}," profile",[180,450,198],{"class":190},[180,452,201],{"class":186},[180,454,204],{"class":190},[180,456,457],{"class":207},".\u002Fprofile",[180,459,210],{"class":190},[180,461,462],{"class":182,"line":245},[180,463,217],{"emptyLinePlaceholder":216},[180,465,466,469,471,473,476,478,480,483,486],{"class":182,"line":267},[180,467,468],{"class":236},"describe",[180,470,239],{"class":194},[180,472,280],{"class":190},[180,474,475],{"class":207},"Nimiq Pay auth",[180,477,280],{"class":190},[180,479,401],{"class":190},[180,481,482],{"class":190}," ()",[180,484,485],{"class":226}," =>",[180,487,488],{"class":190}," {\n",[180,490,491,494,496,498,501,503,505,508,510,512],{"class":182,"line":285},[180,492,493],{"class":236},"  it",[180,495,239],{"class":248},[180,497,280],{"class":190},[180,499,500],{"class":207},"signs in with a deterministic local provider",[180,502,280],{"class":190},[180,504,401],{"class":190},[180,506,507],{"class":226}," async",[180,509,482],{"class":190},[180,511,485],{"class":226},[180,513,488],{"class":190},[180,515,516,519,522,525,528,530,532],{"class":182,"line":302},[180,517,518],{"class":226},"    const",[180,520,521],{"class":194}," result",[180,523,524],{"class":190}," =",[180,526,527],{"class":186}," await",[180,529,429],{"class":236},[180,531,239],{"class":248},[180,533,242],{"class":190},[180,535,536,539],{"class":182,"line":319},[180,537,538],{"class":194},"      profile",[180,540,264],{"class":190},[180,542,544,547,549,551,554,556],{"class":182,"line":543},9,[180,545,546],{"class":248},"      origin",[180,548,252],{"class":190},[180,550,204],{"class":190},[180,552,553],{"class":207},"https:\u002F\u002Fexample.test",[180,555,280],{"class":190},[180,557,264],{"class":190},[180,559,561,564,566,570],{"class":182,"line":560},10,[180,562,563],{"class":248},"      requestAddressBeforeVerify",[180,565,252],{"class":190},[180,567,569],{"class":568},"sfNiH"," false",[180,571,264],{"class":190},[180,573,575,578],{"class":182,"line":574},11,[180,576,577],{"class":190},"    }",[180,579,325],{"class":248},[180,581,583],{"class":182,"line":582},12,[180,584,217],{"emptyLinePlaceholder":216},[180,586,588,591,593,596,599,601,604,606],{"class":182,"line":587},13,[180,589,590],{"class":236},"    expect",[180,592,239],{"class":248},[180,594,595],{"class":194},"result",[180,597,598],{"class":248},")",[180,600,258],{"class":190},[180,602,603],{"class":236},"toMatchObject",[180,605,239],{"class":248},[180,607,242],{"class":190},[180,609,611,614,616,619],{"class":182,"line":610},14,[180,612,613],{"class":248},"      ok",[180,615,252],{"class":190},[180,617,618],{"class":568}," true",[180,620,264],{"class":190},[180,622,624,627,629,631,634,636],{"class":182,"line":623},15,[180,625,626],{"class":248},"      network",[180,628,252],{"class":190},[180,630,204],{"class":190},[180,632,633],{"class":207},"testnet",[180,635,280],{"class":190},[180,637,264],{"class":190},[180,639,641,644,646,648,651,653],{"class":182,"line":640},16,[180,642,643],{"class":248},"      mode",[180,645,252],{"class":190},[180,647,204],{"class":190},[180,649,650],{"class":207},"local",[180,652,280],{"class":190},[180,654,264],{"class":190},[180,656,658,661,663,665,668,670],{"class":182,"line":657},17,[180,659,660],{"class":248},"      token",[180,662,252],{"class":190},[180,664,204],{"class":190},[180,666,667],{"class":207},"local-token-1",[180,669,280],{"class":190},[180,671,264],{"class":190},[180,673,675,677],{"class":182,"line":674},18,[180,676,577],{"class":190},[180,678,325],{"class":248},[180,680,682,685],{"class":182,"line":681},19,[180,683,684],{"class":190},"  }",[180,686,325],{"class":248},[180,688,690,692],{"class":182,"line":689},20,[180,691,322],{"class":190},[180,693,325],{"class":194},[143,695,696],{},"Expected behavior:",[170,698,701],{"className":331,"code":699,"filename":700,"language":334,"meta":176,"style":176},"No remote fetch is used in local mode.\nThe token is local-token-1 for the first successful verification.\n","output",[147,702,703,708],{"__ignoreMap":176},[180,704,705],{"class":182,"line":183},[180,706,707],{},"No remote fetch is used in local mode.\n",[180,709,710],{"class":182,"line":213},[180,711,712],{},"The token is local-token-1 for the first successful verification.\n",[159,714,716],{"id":715},"test-signature-failures","Test signature failures",[143,718,719],{},"Use a custom provider when you need to prove that invalid signatures return useful failure details.",[170,721,724],{"className":172,"code":722,"filename":723,"language":175,"meta":176,"style":176},"import { expect, it } from 'vitest'\nimport { isNimiqProviderError } from '@onmax\u002Fbetter-auth-nimiq\u002Fprovider'\nimport {\n  createStubNimiqProvider,\n  runSignInScenario,\n} from '@onmax\u002Fbetter-auth-nimiq-pay-e2e'\n\nit('reports invalid signatures', async () => {\n  const stub = createStubNimiqProvider()\n  const invalidProvider = {\n    listAccounts: () => stub.listAccounts(),\n    async sign(message: string) {\n      const result = await stub.sign(message)\n      if (isNimiqProviderError(result))\n        return result\n\n      const suffix = result.signature.endsWith('0') ? '1' : '0'\n      return {\n        publicKey: result.publicKey,\n        signature: `${result.signature.slice(0, -1)}${suffix}`,\n      }\n    },\n  }\n\n  const result = await runSignInScenario({\n    provider: invalidProvider as any,\n    origin: 'https:\u002F\u002Fexample.test',\n    requestAddressBeforeVerify: false,\n  })\n\n  expect(result.ok).toBe(false)\n  expect(result.error).toContain('Invalid signature')\n})\n","test\u002Fe2e\u002Finvalid-signature.e2e.test.ts",[147,725,726,748,768,774,781,788,800,804,828,844,855,878,902,926,944,952,956,1008,1015,1031,1077,1083,1089,1095,1100,1117,1135,1151,1163,1170,1175,1204,1236],{"__ignoreMap":176},[180,727,728,730,732,734,736,738,740,742,744,746],{"class":182,"line":183},[180,729,187],{"class":186},[180,731,191],{"class":190},[180,733,404],{"class":194},[180,735,401],{"class":190},[180,737,409],{"class":194},[180,739,198],{"class":190},[180,741,201],{"class":186},[180,743,204],{"class":190},[180,745,418],{"class":207},[180,747,210],{"class":190},[180,749,750,752,754,757,759,761,763,766],{"class":182,"line":213},[180,751,187],{"class":186},[180,753,191],{"class":190},[180,755,756],{"class":194}," isNimiqProviderError",[180,758,198],{"class":190},[180,760,201],{"class":186},[180,762,204],{"class":190},[180,764,765],{"class":207},"@onmax\u002Fbetter-auth-nimiq\u002Fprovider",[180,767,210],{"class":190},[180,769,770,772],{"class":182,"line":220},[180,771,187],{"class":186},[180,773,488],{"class":190},[180,775,776,779],{"class":182,"line":245},[180,777,778],{"class":194},"  createStubNimiqProvider",[180,780,264],{"class":190},[180,782,783,786],{"class":182,"line":267},[180,784,785],{"class":194},"  runSignInScenario",[180,787,264],{"class":190},[180,789,790,792,794,796,798],{"class":182,"line":285},[180,791,322],{"class":190},[180,793,201],{"class":186},[180,795,204],{"class":190},[180,797,149],{"class":207},[180,799,210],{"class":190},[180,801,802],{"class":182,"line":302},[180,803,217],{"emptyLinePlaceholder":216},[180,805,806,809,811,813,816,818,820,822,824,826],{"class":182,"line":319},[180,807,808],{"class":236},"it",[180,810,239],{"class":194},[180,812,280],{"class":190},[180,814,815],{"class":207},"reports invalid signatures",[180,817,280],{"class":190},[180,819,401],{"class":190},[180,821,507],{"class":226},[180,823,482],{"class":190},[180,825,485],{"class":226},[180,827,488],{"class":190},[180,829,830,833,836,838,841],{"class":182,"line":543},[180,831,832],{"class":226},"  const",[180,834,835],{"class":194}," stub",[180,837,524],{"class":190},[180,839,840],{"class":236}," createStubNimiqProvider",[180,842,843],{"class":248},"()\n",[180,845,846,848,851,853],{"class":182,"line":560},[180,847,832],{"class":226},[180,849,850],{"class":194}," invalidProvider",[180,852,524],{"class":190},[180,854,488],{"class":190},[180,856,857,860,862,864,866,868,870,873,876],{"class":182,"line":574},[180,858,859],{"class":236},"    listAccounts",[180,861,252],{"class":190},[180,863,482],{"class":190},[180,865,485],{"class":226},[180,867,835],{"class":194},[180,869,258],{"class":190},[180,871,872],{"class":236},"listAccounts",[180,874,875],{"class":248},"()",[180,877,264],{"class":190},[180,879,880,883,886,888,892,894,898,900],{"class":182,"line":582},[180,881,882],{"class":226},"    async",[180,884,885],{"class":248}," sign",[180,887,239],{"class":190},[180,889,891],{"class":890},"sHdIc","message",[180,893,252],{"class":190},[180,895,897],{"class":896},"sBMFI"," string",[180,899,598],{"class":190},[180,901,488],{"class":190},[180,903,904,907,909,911,913,915,917,920,922,924],{"class":182,"line":587},[180,905,906],{"class":226},"      const",[180,908,521],{"class":194},[180,910,524],{"class":190},[180,912,527],{"class":186},[180,914,835],{"class":194},[180,916,258],{"class":190},[180,918,919],{"class":236},"sign",[180,921,239],{"class":248},[180,923,891],{"class":194},[180,925,325],{"class":248},[180,927,928,931,934,937,939,941],{"class":182,"line":610},[180,929,930],{"class":186},"      if",[180,932,933],{"class":248}," (",[180,935,936],{"class":236},"isNimiqProviderError",[180,938,239],{"class":248},[180,940,595],{"class":194},[180,942,943],{"class":248},"))\n",[180,945,946,949],{"class":182,"line":623},[180,947,948],{"class":186},"        return",[180,950,951],{"class":194}," result\n",[180,953,954],{"class":182,"line":640},[180,955,217],{"emptyLinePlaceholder":216},[180,957,958,960,963,965,967,969,972,974,977,979,981,984,986,989,992,994,997,999,1002,1004,1006],{"class":182,"line":657},[180,959,906],{"class":226},[180,961,962],{"class":194}," suffix",[180,964,524],{"class":190},[180,966,521],{"class":194},[180,968,258],{"class":190},[180,970,971],{"class":194},"signature",[180,973,258],{"class":190},[180,975,976],{"class":236},"endsWith",[180,978,239],{"class":248},[180,980,280],{"class":190},[180,982,983],{"class":207},"0",[180,985,280],{"class":190},[180,987,988],{"class":248},") ",[180,990,991],{"class":190},"?",[180,993,204],{"class":190},[180,995,996],{"class":207},"1",[180,998,280],{"class":190},[180,1000,1001],{"class":190}," :",[180,1003,204],{"class":190},[180,1005,983],{"class":207},[180,1007,210],{"class":190},[180,1009,1010,1013],{"class":182,"line":674},[180,1011,1012],{"class":186},"      return",[180,1014,488],{"class":190},[180,1016,1017,1020,1022,1024,1026,1029],{"class":182,"line":681},[180,1018,1019],{"class":248},"        publicKey",[180,1021,252],{"class":190},[180,1023,521],{"class":194},[180,1025,258],{"class":190},[180,1027,1028],{"class":194},"publicKey",[180,1030,264],{"class":190},[180,1032,1033,1036,1038,1041,1043,1045,1047,1049,1052,1054,1057,1059,1062,1064,1066,1069,1072,1075],{"class":182,"line":689},[180,1034,1035],{"class":248},"        signature",[180,1037,252],{"class":190},[180,1039,1040],{"class":190}," `${",[180,1042,595],{"class":194},[180,1044,258],{"class":190},[180,1046,971],{"class":194},[180,1048,258],{"class":190},[180,1050,1051],{"class":236},"slice",[180,1053,239],{"class":194},[180,1055,983],{"class":1056},"sbssI",[180,1058,401],{"class":190},[180,1060,1061],{"class":190}," -",[180,1063,996],{"class":1056},[180,1065,598],{"class":194},[180,1067,1068],{"class":190},"}${",[180,1070,1071],{"class":194},"suffix",[180,1073,1074],{"class":190},"}`",[180,1076,264],{"class":190},[180,1078,1080],{"class":182,"line":1079},21,[180,1081,1082],{"class":190},"      }\n",[180,1084,1086],{"class":182,"line":1085},22,[180,1087,1088],{"class":190},"    },\n",[180,1090,1092],{"class":182,"line":1091},23,[180,1093,1094],{"class":190},"  }\n",[180,1096,1098],{"class":182,"line":1097},24,[180,1099,217],{"emptyLinePlaceholder":216},[180,1101,1103,1105,1107,1109,1111,1113,1115],{"class":182,"line":1102},25,[180,1104,832],{"class":226},[180,1106,521],{"class":194},[180,1108,524],{"class":190},[180,1110,527],{"class":186},[180,1112,429],{"class":236},[180,1114,239],{"class":248},[180,1116,242],{"class":190},[180,1118,1120,1123,1125,1127,1130,1133],{"class":182,"line":1119},26,[180,1121,1122],{"class":248},"    provider",[180,1124,252],{"class":190},[180,1126,850],{"class":194},[180,1128,1129],{"class":186}," as",[180,1131,1132],{"class":896}," any",[180,1134,264],{"class":190},[180,1136,1138,1141,1143,1145,1147,1149],{"class":182,"line":1137},27,[180,1139,1140],{"class":248},"    origin",[180,1142,252],{"class":190},[180,1144,204],{"class":190},[180,1146,553],{"class":207},[180,1148,280],{"class":190},[180,1150,264],{"class":190},[180,1152,1154,1157,1159,1161],{"class":182,"line":1153},28,[180,1155,1156],{"class":248},"    requestAddressBeforeVerify",[180,1158,252],{"class":190},[180,1160,569],{"class":568},[180,1162,264],{"class":190},[180,1164,1166,1168],{"class":182,"line":1165},29,[180,1167,684],{"class":190},[180,1169,325],{"class":248},[180,1171,1173],{"class":182,"line":1172},30,[180,1174,217],{"emptyLinePlaceholder":216},[180,1176,1178,1181,1183,1185,1187,1190,1192,1194,1197,1199,1202],{"class":182,"line":1177},31,[180,1179,1180],{"class":236},"  expect",[180,1182,239],{"class":248},[180,1184,595],{"class":194},[180,1186,258],{"class":190},[180,1188,1189],{"class":194},"ok",[180,1191,598],{"class":248},[180,1193,258],{"class":190},[180,1195,1196],{"class":236},"toBe",[180,1198,239],{"class":248},[180,1200,1201],{"class":568},"false",[180,1203,325],{"class":248},[180,1205,1207,1209,1211,1213,1215,1218,1220,1222,1225,1227,1229,1232,1234],{"class":182,"line":1206},32,[180,1208,1180],{"class":236},[180,1210,239],{"class":248},[180,1212,595],{"class":194},[180,1214,258],{"class":190},[180,1216,1217],{"class":194},"error",[180,1219,598],{"class":248},[180,1221,258],{"class":190},[180,1223,1224],{"class":236},"toContain",[180,1226,239],{"class":248},[180,1228,280],{"class":190},[180,1230,1231],{"class":207},"Invalid signature",[180,1233,280],{"class":190},[180,1235,325],{"class":248},[180,1237,1239,1241],{"class":182,"line":1238},33,[180,1240,322],{"class":190},[180,1242,325],{"class":194},[159,1244,1246],{"id":1245},"test-cross-device-sign-in-locally","Test cross-device sign-in locally",[143,1248,145,1249,1252],{},[147,1250,1251],{},"runQrSignInScenario()"," when desktop and phone flows need to complete in one test process.",[170,1254,1257],{"className":172,"code":1255,"filename":1256,"language":175,"meta":176,"style":176},"import { describe, expect, it } from 'vitest'\nimport { runQrSignInScenario } from '@onmax\u002Fbetter-auth-nimiq-pay-e2e'\n\ndescribe('QR sign-in', () => {\n  it('starts, approves, and finalizes locally', async () => {\n    const result = await runQrSignInScenario()\n\n    expect(result).toMatchObject({\n      ok: true,\n      mode: 'local',\n      token: 'local-finalized-order-1',\n    })\n  })\n})\n","test\u002Fe2e\u002Fqr-local-auth.e2e.test.ts",[147,1258,1259,1285,1304,1308,1329,1352,1366,1370,1388,1398,1412,1427,1433,1439],{"__ignoreMap":176},[180,1260,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283],{"class":182,"line":183},[180,1262,187],{"class":186},[180,1264,191],{"class":190},[180,1266,398],{"class":194},[180,1268,401],{"class":190},[180,1270,404],{"class":194},[180,1272,401],{"class":190},[180,1274,409],{"class":194},[180,1276,198],{"class":190},[180,1278,201],{"class":186},[180,1280,204],{"class":190},[180,1282,418],{"class":207},[180,1284,210],{"class":190},[180,1286,1287,1289,1291,1294,1296,1298,1300,1302],{"class":182,"line":213},[180,1288,187],{"class":186},[180,1290,191],{"class":190},[180,1292,1293],{"class":194}," runQrSignInScenario",[180,1295,198],{"class":190},[180,1297,201],{"class":186},[180,1299,204],{"class":190},[180,1301,149],{"class":207},[180,1303,210],{"class":190},[180,1305,1306],{"class":182,"line":220},[180,1307,217],{"emptyLinePlaceholder":216},[180,1309,1310,1312,1314,1316,1319,1321,1323,1325,1327],{"class":182,"line":245},[180,1311,468],{"class":236},[180,1313,239],{"class":194},[180,1315,280],{"class":190},[180,1317,1318],{"class":207},"QR sign-in",[180,1320,280],{"class":190},[180,1322,401],{"class":190},[180,1324,482],{"class":190},[180,1326,485],{"class":226},[180,1328,488],{"class":190},[180,1330,1331,1333,1335,1337,1340,1342,1344,1346,1348,1350],{"class":182,"line":267},[180,1332,493],{"class":236},[180,1334,239],{"class":248},[180,1336,280],{"class":190},[180,1338,1339],{"class":207},"starts, approves, and finalizes locally",[180,1341,280],{"class":190},[180,1343,401],{"class":190},[180,1345,507],{"class":226},[180,1347,482],{"class":190},[180,1349,485],{"class":226},[180,1351,488],{"class":190},[180,1353,1354,1356,1358,1360,1362,1364],{"class":182,"line":285},[180,1355,518],{"class":226},[180,1357,521],{"class":194},[180,1359,524],{"class":190},[180,1361,527],{"class":186},[180,1363,1293],{"class":236},[180,1365,843],{"class":248},[180,1367,1368],{"class":182,"line":302},[180,1369,217],{"emptyLinePlaceholder":216},[180,1371,1372,1374,1376,1378,1380,1382,1384,1386],{"class":182,"line":319},[180,1373,590],{"class":236},[180,1375,239],{"class":248},[180,1377,595],{"class":194},[180,1379,598],{"class":248},[180,1381,258],{"class":190},[180,1383,603],{"class":236},[180,1385,239],{"class":248},[180,1387,242],{"class":190},[180,1389,1390,1392,1394,1396],{"class":182,"line":543},[180,1391,613],{"class":248},[180,1393,252],{"class":190},[180,1395,618],{"class":568},[180,1397,264],{"class":190},[180,1399,1400,1402,1404,1406,1408,1410],{"class":182,"line":560},[180,1401,643],{"class":248},[180,1403,252],{"class":190},[180,1405,204],{"class":190},[180,1407,650],{"class":207},[180,1409,280],{"class":190},[180,1411,264],{"class":190},[180,1413,1414,1416,1418,1420,1423,1425],{"class":182,"line":574},[180,1415,660],{"class":248},[180,1417,252],{"class":190},[180,1419,204],{"class":190},[180,1421,1422],{"class":207},"local-finalized-order-1",[180,1424,280],{"class":190},[180,1426,264],{"class":190},[180,1428,1429,1431],{"class":182,"line":582},[180,1430,577],{"class":190},[180,1432,325],{"class":248},[180,1434,1435,1437],{"class":182,"line":587},[180,1436,684],{"class":190},[180,1438,325],{"class":248},[180,1440,1441,1443],{"class":182,"line":610},[180,1442,322],{"class":190},[180,1444,325],{"class":194},[143,1446,696],{},[170,1448,1450],{"className":331,"code":1449,"filename":700,"language":334,"meta":176,"style":176},"order-1 is created\nthe stub provider approves the challenge\ndesktop finalize returns local-finalized-order-1\n",[147,1451,1452,1457,1462],{"__ignoreMap":176},[180,1453,1454],{"class":182,"line":183},[180,1455,1456],{},"order-1 is created\n",[180,1458,1459],{"class":182,"line":213},[180,1460,1461],{},"the stub provider approves the challenge\n",[180,1463,1464],{"class":182,"line":220},[180,1465,1466],{},"desktop finalize returns local-finalized-order-1\n",[159,1468,1470],{"id":1469},"replace-http-calls-with-local-fetchers","Replace HTTP calls with local fetchers",[143,1472,1473],{},"Use local fetchers when you want to test lower-level client calls without the scenario runner.",[170,1475,1478],{"className":172,"code":1476,"filename":1477,"language":175,"meta":176,"style":176},"import { expect, it } from 'vitest'\nimport { isNimiqProviderError } from '@onmax\u002Fbetter-auth-nimiq\u002Fprovider'\nimport {\n  createLocalAuthFetcher,\n  createStubNimiqProvider,\n} from '@onmax\u002Fbetter-auth-nimiq-pay-e2e'\n\nit('issues and verifies a local nonce', async () => {\n  const fetcher = createLocalAuthFetcher({\n    appName: 'Test App',\n    origin: 'https:\u002F\u002Fexample.test',\n  })\n  const provider = createStubNimiqProvider()\n\n  const nonce = await fetcher\u003C{\n    nonceId: string\n    message: string\n  }>('\u002Fnimiq\u002Fnonce', { method: 'POST', body: {} })\n\n  const signed = await provider.sign(nonce.message)\n  if (isNimiqProviderError(signed))\n    throw new Error(signed.error.message)\n\n  const verified = await fetcher\u003C{ ok: true, token: string }>('\u002Fnimiq\u002Fverify', {\n    method: 'POST',\n    body: {\n      nonceId: nonce.nonceId,\n      publicKeyHex: signed.publicKey,\n      signatureHex: signed.signature,\n    },\n  })\n\n  expect(verified).toEqual({\n    ok: true,\n    token: 'local-token-1',\n  })\n})\n","test\u002Fe2e\u002Flocal-fetcher.test.ts",[147,1479,1480,1502,1520,1526,1533,1539,1551,1555,1578,1594,1610,1624,1630,1643,1647,1663,1673,1682,1726,1730,1758,1774,1799,1803,1851,1866,1875,1891,1906,1921,1925,1931,1935,1955,1967,1983,1990],{"__ignoreMap":176},[180,1481,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500],{"class":182,"line":183},[180,1483,187],{"class":186},[180,1485,191],{"class":190},[180,1487,404],{"class":194},[180,1489,401],{"class":190},[180,1491,409],{"class":194},[180,1493,198],{"class":190},[180,1495,201],{"class":186},[180,1497,204],{"class":190},[180,1499,418],{"class":207},[180,1501,210],{"class":190},[180,1503,1504,1506,1508,1510,1512,1514,1516,1518],{"class":182,"line":213},[180,1505,187],{"class":186},[180,1507,191],{"class":190},[180,1509,756],{"class":194},[180,1511,198],{"class":190},[180,1513,201],{"class":186},[180,1515,204],{"class":190},[180,1517,765],{"class":207},[180,1519,210],{"class":190},[180,1521,1522,1524],{"class":182,"line":220},[180,1523,187],{"class":186},[180,1525,488],{"class":190},[180,1527,1528,1531],{"class":182,"line":245},[180,1529,1530],{"class":194},"  createLocalAuthFetcher",[180,1532,264],{"class":190},[180,1534,1535,1537],{"class":182,"line":267},[180,1536,778],{"class":194},[180,1538,264],{"class":190},[180,1540,1541,1543,1545,1547,1549],{"class":182,"line":285},[180,1542,322],{"class":190},[180,1544,201],{"class":186},[180,1546,204],{"class":190},[180,1548,149],{"class":207},[180,1550,210],{"class":190},[180,1552,1553],{"class":182,"line":302},[180,1554,217],{"emptyLinePlaceholder":216},[180,1556,1557,1559,1561,1563,1566,1568,1570,1572,1574,1576],{"class":182,"line":319},[180,1558,808],{"class":236},[180,1560,239],{"class":194},[180,1562,280],{"class":190},[180,1564,1565],{"class":207},"issues and verifies a local nonce",[180,1567,280],{"class":190},[180,1569,401],{"class":190},[180,1571,507],{"class":226},[180,1573,482],{"class":190},[180,1575,485],{"class":226},[180,1577,488],{"class":190},[180,1579,1580,1582,1585,1587,1590,1592],{"class":182,"line":543},[180,1581,832],{"class":226},[180,1583,1584],{"class":194}," fetcher",[180,1586,524],{"class":190},[180,1588,1589],{"class":236}," createLocalAuthFetcher",[180,1591,239],{"class":248},[180,1593,242],{"class":190},[180,1595,1596,1599,1601,1603,1606,1608],{"class":182,"line":560},[180,1597,1598],{"class":248},"    appName",[180,1600,252],{"class":190},[180,1602,204],{"class":190},[180,1604,1605],{"class":207},"Test App",[180,1607,280],{"class":190},[180,1609,264],{"class":190},[180,1611,1612,1614,1616,1618,1620,1622],{"class":182,"line":574},[180,1613,1140],{"class":248},[180,1615,252],{"class":190},[180,1617,204],{"class":190},[180,1619,553],{"class":207},[180,1621,280],{"class":190},[180,1623,264],{"class":190},[180,1625,1626,1628],{"class":182,"line":582},[180,1627,684],{"class":190},[180,1629,325],{"class":248},[180,1631,1632,1634,1637,1639,1641],{"class":182,"line":587},[180,1633,832],{"class":226},[180,1635,1636],{"class":194}," provider",[180,1638,524],{"class":190},[180,1640,840],{"class":236},[180,1642,843],{"class":248},[180,1644,1645],{"class":182,"line":610},[180,1646,217],{"emptyLinePlaceholder":216},[180,1648,1649,1651,1654,1656,1658,1660],{"class":182,"line":623},[180,1650,832],{"class":226},[180,1652,1653],{"class":194}," nonce",[180,1655,524],{"class":190},[180,1657,527],{"class":186},[180,1659,1584],{"class":236},[180,1661,1662],{"class":190},"\u003C{\n",[180,1664,1665,1668,1670],{"class":182,"line":640},[180,1666,1667],{"class":248},"    nonceId",[180,1669,252],{"class":190},[180,1671,1672],{"class":896}," string\n",[180,1674,1675,1678,1680],{"class":182,"line":657},[180,1676,1677],{"class":248},"    message",[180,1679,252],{"class":190},[180,1681,1672],{"class":896},[180,1683,1684,1687,1689,1691,1694,1696,1698,1700,1703,1705,1707,1710,1712,1714,1717,1719,1722,1724],{"class":182,"line":674},[180,1685,1686],{"class":190},"  }>",[180,1688,239],{"class":248},[180,1690,280],{"class":190},[180,1692,1693],{"class":207},"\u002Fnimiq\u002Fnonce",[180,1695,280],{"class":190},[180,1697,401],{"class":190},[180,1699,191],{"class":190},[180,1701,1702],{"class":248}," method",[180,1704,252],{"class":190},[180,1706,204],{"class":190},[180,1708,1709],{"class":207},"POST",[180,1711,280],{"class":190},[180,1713,401],{"class":190},[180,1715,1716],{"class":248}," body",[180,1718,252],{"class":190},[180,1720,1721],{"class":190}," {}",[180,1723,198],{"class":190},[180,1725,325],{"class":248},[180,1727,1728],{"class":182,"line":681},[180,1729,217],{"emptyLinePlaceholder":216},[180,1731,1732,1734,1737,1739,1741,1743,1745,1747,1749,1752,1754,1756],{"class":182,"line":689},[180,1733,832],{"class":226},[180,1735,1736],{"class":194}," signed",[180,1738,524],{"class":190},[180,1740,527],{"class":186},[180,1742,1636],{"class":194},[180,1744,258],{"class":190},[180,1746,919],{"class":236},[180,1748,239],{"class":248},[180,1750,1751],{"class":194},"nonce",[180,1753,258],{"class":190},[180,1755,891],{"class":194},[180,1757,325],{"class":248},[180,1759,1760,1763,1765,1767,1769,1772],{"class":182,"line":1079},[180,1761,1762],{"class":186},"  if",[180,1764,933],{"class":248},[180,1766,936],{"class":236},[180,1768,239],{"class":248},[180,1770,1771],{"class":194},"signed",[180,1773,943],{"class":248},[180,1775,1776,1779,1782,1785,1787,1789,1791,1793,1795,1797],{"class":182,"line":1085},[180,1777,1778],{"class":186},"    throw",[180,1780,1781],{"class":190}," new",[180,1783,1784],{"class":236}," Error",[180,1786,239],{"class":248},[180,1788,1771],{"class":194},[180,1790,258],{"class":190},[180,1792,1217],{"class":194},[180,1794,258],{"class":190},[180,1796,891],{"class":194},[180,1798,325],{"class":248},[180,1800,1801],{"class":182,"line":1091},[180,1802,217],{"emptyLinePlaceholder":216},[180,1804,1805,1807,1810,1812,1814,1816,1819,1822,1824,1826,1828,1831,1833,1835,1838,1840,1842,1845,1847,1849],{"class":182,"line":1097},[180,1806,832],{"class":226},[180,1808,1809],{"class":194}," verified",[180,1811,524],{"class":190},[180,1813,527],{"class":186},[180,1815,1584],{"class":236},[180,1817,1818],{"class":190},"\u003C{",[180,1820,1821],{"class":248}," ok",[180,1823,252],{"class":190},[180,1825,618],{"class":896},[180,1827,401],{"class":190},[180,1829,1830],{"class":248}," token",[180,1832,252],{"class":190},[180,1834,897],{"class":896},[180,1836,1837],{"class":190}," }>",[180,1839,239],{"class":248},[180,1841,280],{"class":190},[180,1843,1844],{"class":207},"\u002Fnimiq\u002Fverify",[180,1846,280],{"class":190},[180,1848,401],{"class":190},[180,1850,488],{"class":190},[180,1852,1853,1856,1858,1860,1862,1864],{"class":182,"line":1102},[180,1854,1855],{"class":248},"    method",[180,1857,252],{"class":190},[180,1859,204],{"class":190},[180,1861,1709],{"class":207},[180,1863,280],{"class":190},[180,1865,264],{"class":190},[180,1867,1868,1871,1873],{"class":182,"line":1119},[180,1869,1870],{"class":248},"    body",[180,1872,252],{"class":190},[180,1874,488],{"class":190},[180,1876,1877,1880,1882,1884,1886,1889],{"class":182,"line":1137},[180,1878,1879],{"class":248},"      nonceId",[180,1881,252],{"class":190},[180,1883,1653],{"class":194},[180,1885,258],{"class":190},[180,1887,1888],{"class":194},"nonceId",[180,1890,264],{"class":190},[180,1892,1893,1896,1898,1900,1902,1904],{"class":182,"line":1153},[180,1894,1895],{"class":248},"      publicKeyHex",[180,1897,252],{"class":190},[180,1899,1736],{"class":194},[180,1901,258],{"class":190},[180,1903,1028],{"class":194},[180,1905,264],{"class":190},[180,1907,1908,1911,1913,1915,1917,1919],{"class":182,"line":1165},[180,1909,1910],{"class":248},"      signatureHex",[180,1912,252],{"class":190},[180,1914,1736],{"class":194},[180,1916,258],{"class":190},[180,1918,971],{"class":194},[180,1920,264],{"class":190},[180,1922,1923],{"class":182,"line":1172},[180,1924,1088],{"class":190},[180,1926,1927,1929],{"class":182,"line":1177},[180,1928,684],{"class":190},[180,1930,325],{"class":248},[180,1932,1933],{"class":182,"line":1206},[180,1934,217],{"emptyLinePlaceholder":216},[180,1936,1937,1939,1941,1944,1946,1948,1951,1953],{"class":182,"line":1238},[180,1938,1180],{"class":236},[180,1940,239],{"class":248},[180,1942,1943],{"class":194},"verified",[180,1945,598],{"class":248},[180,1947,258],{"class":190},[180,1949,1950],{"class":236},"toEqual",[180,1952,239],{"class":248},[180,1954,242],{"class":190},[180,1956,1958,1961,1963,1965],{"class":182,"line":1957},34,[180,1959,1960],{"class":248},"    ok",[180,1962,252],{"class":190},[180,1964,618],{"class":568},[180,1966,264],{"class":190},[180,1968,1970,1973,1975,1977,1979,1981],{"class":182,"line":1969},35,[180,1971,1972],{"class":248},"    token",[180,1974,252],{"class":190},[180,1976,204],{"class":190},[180,1978,667],{"class":207},[180,1980,280],{"class":190},[180,1982,264],{"class":190},[180,1984,1986,1988],{"class":182,"line":1985},36,[180,1987,684],{"class":190},[180,1989,325],{"class":248},[180,1991,1993,1995],{"class":182,"line":1992},37,[180,1994,322],{"class":190},[180,1996,325],{"class":194},[143,1998,1999],{},"Use local scenarios in CI first. Add bridge mode only for the smaller set of tests that must prove injected-provider behavior.",[2001,2002,2003],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":176,"searchDepth":213,"depth":213,"links":2005},[2006,2007,2008,2009,2010],{"id":161,"depth":213,"text":162},{"id":376,"depth":213,"text":377},{"id":715,"depth":213,"text":716},{"id":1245,"depth":213,"text":1246},{"id":1469,"depth":213,"text":1470},"Test direct Nimiq auth and cross-device flows without the real host app.","md",null,{},{"title":104,"description":2011},"flTybCf9vMj5p1cbASWI2TPU_LzgB0oNo5eI0C3xcRw",[2018,2020],{"title":94,"path":95,"stem":96,"description":2019,"children":-1},"Add app-local virtual balances to Better Auth.",{"title":108,"path":109,"stem":110,"description":2021,"children":-1},"Reuse E2E Vitest config and provider stubs.",1778838252701]