[{"data":1,"prerenderedAt":2736},["ShallowReactive",2],{"navigation_docs":3,"-auth-cross-device":137,"-auth-cross-device-surround":2731},[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":68,"body":139,"description":2725,"extension":2726,"links":2727,"meta":2728,"navigation":255,"path":69,"seo":2729,"stem":70,"__hash__":2730},"docs\u002F3.auth\u002F2.cross-device.md",{"type":140,"value":141,"toc":2715},"minimark",[142,151,158,163,166,764,779,783,901,905,916,1130,1133,1301,1305,1308,1506,1531,1535,1543,1737,1739,1801,1805,1810,2009,2012,2128,2132,2138,2534,2538,2704,2711],[143,144,145,146,150],"p",{},"Use ",[147,148,149],"code",{},"@onmax\u002Fbetter-auth-cross-device"," when the desktop starts an order and a phone holds the signing key.",[143,152,153,154,157],{},"Do not use it for same-browser sign-in. Use direct Nimiq Better Auth when ",[147,155,156],{},"window.nimiq"," is available where the user clicks sign in.",[159,160,162],"h2",{"id":161},"register-the-server-plugin","Register the server plugin",[143,164,165],{},"Use one adapter per proof type. For Nimiq wallet approval, register the Nimiq adapter.",[167,168,174],"pre",{"className":169,"code":170,"filename":171,"language":172,"meta":173,"style":173},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { betterAuth } from 'better-auth'\nimport { crossDevice } from '@onmax\u002Fbetter-auth-cross-device'\nimport { createNimiqCrossDeviceAdapter } from '@onmax\u002Fcross-device-nimiq\u002Fserver'\n\nexport const auth = betterAuth({\n  plugins: [\n    crossDevice({\n      appName: 'Nimiq Checkout',\n      endpointPrefix: '\u002Fcross-device',\n      trustedOrigins: ['https:\u002F\u002Fpay.example.com'],\n      orderTtlSeconds: 120,\n      adapters: [\n        createNimiqCrossDeviceAdapter({\n          appName: 'Nimiq Checkout',\n        }),\n      ],\n      resolveLogin: async ({ approvedSubject, approvedIdentity, ctx }) => {\n        const existing = await ctx.context.adapter.findOne({\n          model: 'user',\n          where: [{ field: 'publicKey', value: approvedSubject }],\n        })\n        if (existing)\n          return existing\n\n        return ctx.context.internalAdapter.createUser({\n          email: `pk_${approvedSubject}@nimiq.invalid`,\n          name: '',\n          image: null,\n          emailVerified: false,\n          publicKey: approvedSubject,\n          address: approvedIdentity?.address,\n        })\n      },\n    }),\n  ],\n})\n","server\u002Fauth.ts","ts","",[147,175,176,209,229,250,257,282,295,305,324,341,364,378,388,398,414,425,433,471,508,525,565,573,587,596,601,627,658,671,682,696,708,726,733,739,749,757],{"__ignoreMap":173},[177,178,181,185,189,193,196,199,202,206],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"s7zQu","import",[177,186,188],{"class":187},"sMK4o"," {",[177,190,192],{"class":191},"sTEyZ"," betterAuth",[177,194,195],{"class":187}," }",[177,197,198],{"class":183}," from",[177,200,201],{"class":187}," '",[177,203,205],{"class":204},"sfazB","better-auth",[177,207,208],{"class":187},"'\n",[177,210,212,214,216,219,221,223,225,227],{"class":179,"line":211},2,[177,213,184],{"class":183},[177,215,188],{"class":187},[177,217,218],{"class":191}," crossDevice",[177,220,195],{"class":187},[177,222,198],{"class":183},[177,224,201],{"class":187},[177,226,149],{"class":204},[177,228,208],{"class":187},[177,230,232,234,236,239,241,243,245,248],{"class":179,"line":231},3,[177,233,184],{"class":183},[177,235,188],{"class":187},[177,237,238],{"class":191}," createNimiqCrossDeviceAdapter",[177,240,195],{"class":187},[177,242,198],{"class":183},[177,244,201],{"class":187},[177,246,247],{"class":204},"@onmax\u002Fcross-device-nimiq\u002Fserver",[177,249,208],{"class":187},[177,251,253],{"class":179,"line":252},4,[177,254,256],{"emptyLinePlaceholder":255},true,"\n",[177,258,260,263,267,270,273,276,279],{"class":179,"line":259},5,[177,261,262],{"class":183},"export",[177,264,266],{"class":265},"spNyl"," const",[177,268,269],{"class":191}," auth ",[177,271,272],{"class":187},"=",[177,274,192],{"class":275},"s2Zo4",[177,277,278],{"class":191},"(",[177,280,281],{"class":187},"{\n",[177,283,285,289,292],{"class":179,"line":284},6,[177,286,288],{"class":287},"swJcz","  plugins",[177,290,291],{"class":187},":",[177,293,294],{"class":191}," [\n",[177,296,298,301,303],{"class":179,"line":297},7,[177,299,300],{"class":275},"    crossDevice",[177,302,278],{"class":191},[177,304,281],{"class":187},[177,306,308,311,313,315,318,321],{"class":179,"line":307},8,[177,309,310],{"class":287},"      appName",[177,312,291],{"class":187},[177,314,201],{"class":187},[177,316,317],{"class":204},"Nimiq Checkout",[177,319,320],{"class":187},"'",[177,322,323],{"class":187},",\n",[177,325,327,330,332,334,337,339],{"class":179,"line":326},9,[177,328,329],{"class":287},"      endpointPrefix",[177,331,291],{"class":187},[177,333,201],{"class":187},[177,335,336],{"class":204},"\u002Fcross-device",[177,338,320],{"class":187},[177,340,323],{"class":187},[177,342,344,347,349,352,354,357,359,362],{"class":179,"line":343},10,[177,345,346],{"class":287},"      trustedOrigins",[177,348,291],{"class":187},[177,350,351],{"class":191}," [",[177,353,320],{"class":187},[177,355,356],{"class":204},"https:\u002F\u002Fpay.example.com",[177,358,320],{"class":187},[177,360,361],{"class":191},"]",[177,363,323],{"class":187},[177,365,367,370,372,376],{"class":179,"line":366},11,[177,368,369],{"class":287},"      orderTtlSeconds",[177,371,291],{"class":187},[177,373,375],{"class":374},"sbssI"," 120",[177,377,323],{"class":187},[177,379,381,384,386],{"class":179,"line":380},12,[177,382,383],{"class":287},"      adapters",[177,385,291],{"class":187},[177,387,294],{"class":191},[177,389,391,394,396],{"class":179,"line":390},13,[177,392,393],{"class":275},"        createNimiqCrossDeviceAdapter",[177,395,278],{"class":191},[177,397,281],{"class":187},[177,399,401,404,406,408,410,412],{"class":179,"line":400},14,[177,402,403],{"class":287},"          appName",[177,405,291],{"class":187},[177,407,201],{"class":187},[177,409,317],{"class":204},[177,411,320],{"class":187},[177,413,323],{"class":187},[177,415,417,420,423],{"class":179,"line":416},15,[177,418,419],{"class":187},"        }",[177,421,422],{"class":191},")",[177,424,323],{"class":187},[177,426,428,431],{"class":179,"line":427},16,[177,429,430],{"class":191},"      ]",[177,432,323],{"class":187},[177,434,436,439,441,444,447,451,454,457,459,462,465,468],{"class":179,"line":435},17,[177,437,438],{"class":275},"      resolveLogin",[177,440,291],{"class":187},[177,442,443],{"class":265}," async",[177,445,446],{"class":187}," ({",[177,448,450],{"class":449},"sHdIc"," approvedSubject",[177,452,453],{"class":187},",",[177,455,456],{"class":449}," approvedIdentity",[177,458,453],{"class":187},[177,460,461],{"class":449}," ctx",[177,463,464],{"class":187}," })",[177,466,467],{"class":265}," =>",[177,469,470],{"class":187}," {\n",[177,472,474,477,480,483,486,488,491,494,496,499,501,504,506],{"class":179,"line":473},18,[177,475,476],{"class":265},"        const",[177,478,479],{"class":191}," existing",[177,481,482],{"class":187}," =",[177,484,485],{"class":183}," await",[177,487,461],{"class":191},[177,489,490],{"class":187},".",[177,492,493],{"class":191},"context",[177,495,490],{"class":187},[177,497,498],{"class":191},"adapter",[177,500,490],{"class":187},[177,502,503],{"class":275},"findOne",[177,505,278],{"class":287},[177,507,281],{"class":187},[177,509,511,514,516,518,521,523],{"class":179,"line":510},19,[177,512,513],{"class":287},"          model",[177,515,291],{"class":187},[177,517,201],{"class":187},[177,519,520],{"class":204},"user",[177,522,320],{"class":187},[177,524,323],{"class":187},[177,526,528,531,533,535,538,541,543,545,548,550,552,555,557,559,561,563],{"class":179,"line":527},20,[177,529,530],{"class":287},"          where",[177,532,291],{"class":187},[177,534,351],{"class":287},[177,536,537],{"class":187},"{",[177,539,540],{"class":287}," field",[177,542,291],{"class":187},[177,544,201],{"class":187},[177,546,547],{"class":204},"publicKey",[177,549,320],{"class":187},[177,551,453],{"class":187},[177,553,554],{"class":287}," value",[177,556,291],{"class":187},[177,558,450],{"class":191},[177,560,195],{"class":187},[177,562,361],{"class":287},[177,564,323],{"class":187},[177,566,568,570],{"class":179,"line":567},21,[177,569,419],{"class":187},[177,571,572],{"class":287},")\n",[177,574,576,579,582,585],{"class":179,"line":575},22,[177,577,578],{"class":183},"        if",[177,580,581],{"class":287}," (",[177,583,584],{"class":191},"existing",[177,586,572],{"class":287},[177,588,590,593],{"class":179,"line":589},23,[177,591,592],{"class":183},"          return",[177,594,595],{"class":191}," existing\n",[177,597,599],{"class":179,"line":598},24,[177,600,256],{"emptyLinePlaceholder":255},[177,602,604,607,609,611,613,615,618,620,623,625],{"class":179,"line":603},25,[177,605,606],{"class":183},"        return",[177,608,461],{"class":191},[177,610,490],{"class":187},[177,612,493],{"class":191},[177,614,490],{"class":187},[177,616,617],{"class":191},"internalAdapter",[177,619,490],{"class":187},[177,621,622],{"class":275},"createUser",[177,624,278],{"class":287},[177,626,281],{"class":187},[177,628,630,633,635,638,641,644,647,650,653,656],{"class":179,"line":629},26,[177,631,632],{"class":287},"          email",[177,634,291],{"class":187},[177,636,637],{"class":187}," `",[177,639,640],{"class":204},"pk_",[177,642,643],{"class":187},"${",[177,645,646],{"class":191},"approvedSubject",[177,648,649],{"class":187},"}",[177,651,652],{"class":204},"@nimiq.invalid",[177,654,655],{"class":187},"`",[177,657,323],{"class":187},[177,659,661,664,666,669],{"class":179,"line":660},27,[177,662,663],{"class":287},"          name",[177,665,291],{"class":187},[177,667,668],{"class":187}," ''",[177,670,323],{"class":187},[177,672,674,677,679],{"class":179,"line":673},28,[177,675,676],{"class":287},"          image",[177,678,291],{"class":187},[177,680,681],{"class":187}," null,\n",[177,683,685,688,690,694],{"class":179,"line":684},29,[177,686,687],{"class":287},"          emailVerified",[177,689,291],{"class":187},[177,691,693],{"class":692},"sfNiH"," false",[177,695,323],{"class":187},[177,697,699,702,704,706],{"class":179,"line":698},30,[177,700,701],{"class":287},"          publicKey",[177,703,291],{"class":187},[177,705,450],{"class":191},[177,707,323],{"class":187},[177,709,711,714,716,718,721,724],{"class":179,"line":710},31,[177,712,713],{"class":287},"          address",[177,715,291],{"class":187},[177,717,456],{"class":191},[177,719,720],{"class":187},"?.",[177,722,723],{"class":191},"address",[177,725,323],{"class":187},[177,727,729,731],{"class":179,"line":728},32,[177,730,419],{"class":187},[177,732,572],{"class":287},[177,734,736],{"class":179,"line":735},33,[177,737,738],{"class":187},"      },\n",[177,740,742,745,747],{"class":179,"line":741},34,[177,743,744],{"class":187},"    }",[177,746,422],{"class":191},[177,748,323],{"class":187},[177,750,752,755],{"class":179,"line":751},35,[177,753,754],{"class":191},"  ]",[177,756,323],{"class":187},[177,758,760,762],{"class":179,"line":759},36,[177,761,649],{"class":187},[177,763,572],{"class":191},[143,765,766,767,770,771,774,775,778],{},"Expected behavior: ",[147,768,769],{},"kind: 'login'"," creates the desktop Better Auth session during finalization. ",[147,772,773],{},"kind: 'sign'"," and ",[147,776,777],{},"kind: 'transaction'"," return a proof artifact instead.",[159,780,782],{"id":781},"register-the-client-plugin","Register the client plugin",[167,784,787],{"className":169,"code":785,"filename":786,"language":172,"meta":173,"style":173},"import { createAuthClient } from 'better-auth\u002Fclient'\nimport { crossDeviceClient } from '@onmax\u002Fbetter-auth-cross-device\u002Fclient'\n\nexport const authClient = createAuthClient({\n  plugins: [\n    crossDeviceClient({\n      endpointPrefix: '\u002Fcross-device',\n    }),\n  ],\n})\n","app\u002Fauth-client.ts",[147,788,789,809,829,833,850,858,867,881,889,895],{"__ignoreMap":173},[177,790,791,793,795,798,800,802,804,807],{"class":179,"line":180},[177,792,184],{"class":183},[177,794,188],{"class":187},[177,796,797],{"class":191}," createAuthClient",[177,799,195],{"class":187},[177,801,198],{"class":183},[177,803,201],{"class":187},[177,805,806],{"class":204},"better-auth\u002Fclient",[177,808,208],{"class":187},[177,810,811,813,815,818,820,822,824,827],{"class":179,"line":211},[177,812,184],{"class":183},[177,814,188],{"class":187},[177,816,817],{"class":191}," crossDeviceClient",[177,819,195],{"class":187},[177,821,198],{"class":183},[177,823,201],{"class":187},[177,825,826],{"class":204},"@onmax\u002Fbetter-auth-cross-device\u002Fclient",[177,828,208],{"class":187},[177,830,831],{"class":179,"line":231},[177,832,256],{"emptyLinePlaceholder":255},[177,834,835,837,839,842,844,846,848],{"class":179,"line":252},[177,836,262],{"class":183},[177,838,266],{"class":265},[177,840,841],{"class":191}," authClient ",[177,843,272],{"class":187},[177,845,797],{"class":275},[177,847,278],{"class":191},[177,849,281],{"class":187},[177,851,852,854,856],{"class":179,"line":259},[177,853,288],{"class":287},[177,855,291],{"class":187},[177,857,294],{"class":191},[177,859,860,863,865],{"class":179,"line":284},[177,861,862],{"class":275},"    crossDeviceClient",[177,864,278],{"class":191},[177,866,281],{"class":187},[177,868,869,871,873,875,877,879],{"class":179,"line":297},[177,870,329],{"class":287},[177,872,291],{"class":187},[177,874,201],{"class":187},[177,876,336],{"class":204},[177,878,320],{"class":187},[177,880,323],{"class":187},[177,882,883,885,887],{"class":179,"line":307},[177,884,744],{"class":187},[177,886,422],{"class":191},[177,888,323],{"class":187},[177,890,891,893],{"class":179,"line":326},[177,892,754],{"class":191},[177,894,323],{"class":187},[177,896,897,899],{"class":179,"line":343},[177,898,649],{"class":187},[177,900,572],{"class":191},[159,902,904],{"id":903},"start-on-desktop","Start on desktop",[143,906,907,908,911,912,915],{},"Render ",[147,909,910],{},"claimUrl"," as a QR code or deep link. Keep ",[147,913,914],{},"desktopToken"," private to the desktop browser.",[167,917,920],{"className":169,"code":918,"filename":919,"language":172,"meta":173,"style":173},"import { authClient } from '..\u002Fapp\u002Fauth-client'\n\nexport async function startDesktopLogin() {\n  const order = await authClient.startCrossDeviceOrder({\n    kind: 'login',\n    adapterId: 'nimiq',\n    returnTo: '\u002Fdashboard',\n    displayTitle: 'Sign in to Nimiq Checkout',\n    displaySummary: 'Approve this login on your phone.',\n  })\n\n  sessionStorage.setItem(`cross-device:${order.orderId}`, order.desktopToken)\n  return order\n}\n","desktop\u002Fstart-login.ts",[147,921,922,942,946,963,986,1002,1018,1034,1050,1066,1073,1077,1117,1125],{"__ignoreMap":173},[177,923,924,926,928,931,933,935,937,940],{"class":179,"line":180},[177,925,184],{"class":183},[177,927,188],{"class":187},[177,929,930],{"class":191}," authClient",[177,932,195],{"class":187},[177,934,198],{"class":183},[177,936,201],{"class":187},[177,938,939],{"class":204},"..\u002Fapp\u002Fauth-client",[177,941,208],{"class":187},[177,943,944],{"class":179,"line":211},[177,945,256],{"emptyLinePlaceholder":255},[177,947,948,950,952,955,958,961],{"class":179,"line":231},[177,949,262],{"class":183},[177,951,443],{"class":265},[177,953,954],{"class":265}," function",[177,956,957],{"class":275}," startDesktopLogin",[177,959,960],{"class":187},"()",[177,962,470],{"class":187},[177,964,965,968,971,973,975,977,979,982,984],{"class":179,"line":252},[177,966,967],{"class":265},"  const",[177,969,970],{"class":191}," order",[177,972,482],{"class":187},[177,974,485],{"class":183},[177,976,930],{"class":191},[177,978,490],{"class":187},[177,980,981],{"class":275},"startCrossDeviceOrder",[177,983,278],{"class":287},[177,985,281],{"class":187},[177,987,988,991,993,995,998,1000],{"class":179,"line":259},[177,989,990],{"class":287},"    kind",[177,992,291],{"class":187},[177,994,201],{"class":187},[177,996,997],{"class":204},"login",[177,999,320],{"class":187},[177,1001,323],{"class":187},[177,1003,1004,1007,1009,1011,1014,1016],{"class":179,"line":284},[177,1005,1006],{"class":287},"    adapterId",[177,1008,291],{"class":187},[177,1010,201],{"class":187},[177,1012,1013],{"class":204},"nimiq",[177,1015,320],{"class":187},[177,1017,323],{"class":187},[177,1019,1020,1023,1025,1027,1030,1032],{"class":179,"line":297},[177,1021,1022],{"class":287},"    returnTo",[177,1024,291],{"class":187},[177,1026,201],{"class":187},[177,1028,1029],{"class":204},"\u002Fdashboard",[177,1031,320],{"class":187},[177,1033,323],{"class":187},[177,1035,1036,1039,1041,1043,1046,1048],{"class":179,"line":307},[177,1037,1038],{"class":287},"    displayTitle",[177,1040,291],{"class":187},[177,1042,201],{"class":187},[177,1044,1045],{"class":204},"Sign in to Nimiq Checkout",[177,1047,320],{"class":187},[177,1049,323],{"class":187},[177,1051,1052,1055,1057,1059,1062,1064],{"class":179,"line":326},[177,1053,1054],{"class":287},"    displaySummary",[177,1056,291],{"class":187},[177,1058,201],{"class":187},[177,1060,1061],{"class":204},"Approve this login on your phone.",[177,1063,320],{"class":187},[177,1065,323],{"class":187},[177,1067,1068,1071],{"class":179,"line":343},[177,1069,1070],{"class":187},"  }",[177,1072,572],{"class":287},[177,1074,1075],{"class":179,"line":366},[177,1076,256],{"emptyLinePlaceholder":255},[177,1078,1079,1082,1084,1087,1089,1091,1094,1096,1099,1101,1104,1107,1109,1111,1113,1115],{"class":179,"line":380},[177,1080,1081],{"class":191},"  sessionStorage",[177,1083,490],{"class":187},[177,1085,1086],{"class":275},"setItem",[177,1088,278],{"class":287},[177,1090,655],{"class":187},[177,1092,1093],{"class":204},"cross-device:",[177,1095,643],{"class":187},[177,1097,1098],{"class":191},"order",[177,1100,490],{"class":187},[177,1102,1103],{"class":191},"orderId",[177,1105,1106],{"class":187},"}`",[177,1108,453],{"class":187},[177,1110,970],{"class":191},[177,1112,490],{"class":187},[177,1114,914],{"class":191},[177,1116,572],{"class":287},[177,1118,1119,1122],{"class":179,"line":390},[177,1120,1121],{"class":183},"  return",[177,1123,1124],{"class":191}," order\n",[177,1126,1127],{"class":179,"line":400},[177,1128,1129],{"class":187},"}\n",[143,1131,1132],{},"Expected response:",[167,1134,1139],{"className":1135,"code":1136,"filename":1137,"language":1138,"meta":173,"style":173},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"orderId\": \"HrlSySstW-SR0pbCIY6Rzw\",\n  \"adapterId\": \"nimiq\",\n  \"kind\": \"login\",\n  \"status\": \"created\",\n  \"claimToken\": \"U9A_8jW3k8YfF8U6S75QEdcRPpb2nc-A\",\n  \"claimUrl\": \"https:\u002F\u002Fpay.example.com\u002Fcross-device\u002Fclaim\u002FHrlSySstW-SR0pbCIY6Rzw?token=U9A_8jW3k8YfF8U6S75QEdcRPpb2nc-A\",\n  \"desktopToken\": \"xO41niYYujUiWXeh4WLymzQQ4lLoxmWz\",\n  \"expiresAt\": 1767182520000\n}\n","response","json",[147,1140,1141,1145,1167,1186,1205,1225,1245,1264,1283,1297],{"__ignoreMap":173},[177,1142,1143],{"class":179,"line":180},[177,1144,281],{"class":187},[177,1146,1147,1150,1152,1155,1157,1160,1163,1165],{"class":179,"line":211},[177,1148,1149],{"class":187},"  \"",[177,1151,1103],{"class":265},[177,1153,1154],{"class":187},"\"",[177,1156,291],{"class":187},[177,1158,1159],{"class":187}," \"",[177,1161,1162],{"class":204},"HrlSySstW-SR0pbCIY6Rzw",[177,1164,1154],{"class":187},[177,1166,323],{"class":187},[177,1168,1169,1171,1174,1176,1178,1180,1182,1184],{"class":179,"line":231},[177,1170,1149],{"class":187},[177,1172,1173],{"class":265},"adapterId",[177,1175,1154],{"class":187},[177,1177,291],{"class":187},[177,1179,1159],{"class":187},[177,1181,1013],{"class":204},[177,1183,1154],{"class":187},[177,1185,323],{"class":187},[177,1187,1188,1190,1193,1195,1197,1199,1201,1203],{"class":179,"line":252},[177,1189,1149],{"class":187},[177,1191,1192],{"class":265},"kind",[177,1194,1154],{"class":187},[177,1196,291],{"class":187},[177,1198,1159],{"class":187},[177,1200,997],{"class":204},[177,1202,1154],{"class":187},[177,1204,323],{"class":187},[177,1206,1207,1209,1212,1214,1216,1218,1221,1223],{"class":179,"line":259},[177,1208,1149],{"class":187},[177,1210,1211],{"class":265},"status",[177,1213,1154],{"class":187},[177,1215,291],{"class":187},[177,1217,1159],{"class":187},[177,1219,1220],{"class":204},"created",[177,1222,1154],{"class":187},[177,1224,323],{"class":187},[177,1226,1227,1229,1232,1234,1236,1238,1241,1243],{"class":179,"line":284},[177,1228,1149],{"class":187},[177,1230,1231],{"class":265},"claimToken",[177,1233,1154],{"class":187},[177,1235,291],{"class":187},[177,1237,1159],{"class":187},[177,1239,1240],{"class":204},"U9A_8jW3k8YfF8U6S75QEdcRPpb2nc-A",[177,1242,1154],{"class":187},[177,1244,323],{"class":187},[177,1246,1247,1249,1251,1253,1255,1257,1260,1262],{"class":179,"line":297},[177,1248,1149],{"class":187},[177,1250,910],{"class":265},[177,1252,1154],{"class":187},[177,1254,291],{"class":187},[177,1256,1159],{"class":187},[177,1258,1259],{"class":204},"https:\u002F\u002Fpay.example.com\u002Fcross-device\u002Fclaim\u002FHrlSySstW-SR0pbCIY6Rzw?token=U9A_8jW3k8YfF8U6S75QEdcRPpb2nc-A",[177,1261,1154],{"class":187},[177,1263,323],{"class":187},[177,1265,1266,1268,1270,1272,1274,1276,1279,1281],{"class":179,"line":307},[177,1267,1149],{"class":187},[177,1269,914],{"class":265},[177,1271,1154],{"class":187},[177,1273,291],{"class":187},[177,1275,1159],{"class":187},[177,1277,1278],{"class":204},"xO41niYYujUiWXeh4WLymzQQ4lLoxmWz",[177,1280,1154],{"class":187},[177,1282,323],{"class":187},[177,1284,1285,1287,1290,1292,1294],{"class":179,"line":326},[177,1286,1149],{"class":187},[177,1288,1289],{"class":265},"expiresAt",[177,1291,1154],{"class":187},[177,1293,291],{"class":187},[177,1295,1296],{"class":374}," 1767182520000\n",[177,1298,1299],{"class":179,"line":343},[177,1300,1129],{"class":187},[159,1302,1304],{"id":1303},"listen-for-status","Listen for status",[143,1306,1307],{},"Use SSE when the desktop should react as soon as the phone claims, approves, rejects, or the order expires.",[167,1309,1312],{"className":169,"code":1310,"filename":1311,"language":172,"meta":173,"style":173},"import { subscribeToCrossDeviceOrder } from '@onmax\u002Fbetter-auth-cross-device\u002Fclient'\n\nexport function subscribeToLogin(orderId: string, desktopToken: string) {\n  return subscribeToCrossDeviceOrder({\n    orderId,\n    desktopToken,\n    endpointPrefix: '\u002Fcross-device',\n    onEvent(event, payload) {\n      if (event === 'approved')\n        window.dispatchEvent(new CustomEvent('cross-device-approved', { detail: payload }))\n    },\n  })\n}\n","desktop\u002Forder-events.ts",[147,1313,1314,1333,1337,1369,1379,1386,1393,1408,1427,1448,1491,1496,1502],{"__ignoreMap":173},[177,1315,1316,1318,1320,1323,1325,1327,1329,1331],{"class":179,"line":180},[177,1317,184],{"class":183},[177,1319,188],{"class":187},[177,1321,1322],{"class":191}," subscribeToCrossDeviceOrder",[177,1324,195],{"class":187},[177,1326,198],{"class":183},[177,1328,201],{"class":187},[177,1330,826],{"class":204},[177,1332,208],{"class":187},[177,1334,1335],{"class":179,"line":211},[177,1336,256],{"emptyLinePlaceholder":255},[177,1338,1339,1341,1343,1346,1348,1350,1352,1356,1358,1361,1363,1365,1367],{"class":179,"line":231},[177,1340,262],{"class":183},[177,1342,954],{"class":265},[177,1344,1345],{"class":275}," subscribeToLogin",[177,1347,278],{"class":187},[177,1349,1103],{"class":449},[177,1351,291],{"class":187},[177,1353,1355],{"class":1354},"sBMFI"," string",[177,1357,453],{"class":187},[177,1359,1360],{"class":449}," desktopToken",[177,1362,291],{"class":187},[177,1364,1355],{"class":1354},[177,1366,422],{"class":187},[177,1368,470],{"class":187},[177,1370,1371,1373,1375,1377],{"class":179,"line":252},[177,1372,1121],{"class":183},[177,1374,1322],{"class":275},[177,1376,278],{"class":287},[177,1378,281],{"class":187},[177,1380,1381,1384],{"class":179,"line":259},[177,1382,1383],{"class":191},"    orderId",[177,1385,323],{"class":187},[177,1387,1388,1391],{"class":179,"line":284},[177,1389,1390],{"class":191},"    desktopToken",[177,1392,323],{"class":187},[177,1394,1395,1398,1400,1402,1404,1406],{"class":179,"line":297},[177,1396,1397],{"class":287},"    endpointPrefix",[177,1399,291],{"class":187},[177,1401,201],{"class":187},[177,1403,336],{"class":204},[177,1405,320],{"class":187},[177,1407,323],{"class":187},[177,1409,1410,1413,1415,1418,1420,1423,1425],{"class":179,"line":307},[177,1411,1412],{"class":287},"    onEvent",[177,1414,278],{"class":187},[177,1416,1417],{"class":449},"event",[177,1419,453],{"class":187},[177,1421,1422],{"class":449}," payload",[177,1424,422],{"class":187},[177,1426,470],{"class":187},[177,1428,1429,1432,1434,1436,1439,1441,1444,1446],{"class":179,"line":326},[177,1430,1431],{"class":183},"      if",[177,1433,581],{"class":287},[177,1435,1417],{"class":191},[177,1437,1438],{"class":187}," ===",[177,1440,201],{"class":187},[177,1442,1443],{"class":204},"approved",[177,1445,320],{"class":187},[177,1447,572],{"class":287},[177,1449,1450,1453,1455,1458,1460,1463,1466,1468,1470,1473,1475,1477,1479,1482,1484,1486,1488],{"class":179,"line":343},[177,1451,1452],{"class":191},"        window",[177,1454,490],{"class":187},[177,1456,1457],{"class":275},"dispatchEvent",[177,1459,278],{"class":287},[177,1461,1462],{"class":187},"new",[177,1464,1465],{"class":275}," CustomEvent",[177,1467,278],{"class":287},[177,1469,320],{"class":187},[177,1471,1472],{"class":204},"cross-device-approved",[177,1474,320],{"class":187},[177,1476,453],{"class":187},[177,1478,188],{"class":187},[177,1480,1481],{"class":287}," detail",[177,1483,291],{"class":187},[177,1485,1422],{"class":191},[177,1487,195],{"class":187},[177,1489,1490],{"class":287},"))\n",[177,1492,1493],{"class":179,"line":366},[177,1494,1495],{"class":187},"    },\n",[177,1497,1498,1500],{"class":179,"line":380},[177,1499,1070],{"class":187},[177,1501,572],{"class":287},[177,1503,1504],{"class":179,"line":390},[177,1505,1129],{"class":187},[143,1507,1508,1509,1512,1513,1512,1516,1512,1518,1512,1521,1512,1524,1527,1528,490],{},"Events are ",[147,1510,1511],{},"claimed",", ",[147,1514,1515],{},"waiting_user",[147,1517,1443],{},[147,1519,1520],{},"rejected",[147,1522,1523],{},"expired",[147,1525,1526],{},"cancelled",", and ",[147,1529,1530],{},"finalized",[159,1532,1534],{"id":1533},"approve-on-phone","Approve on phone",[143,1536,1537,1538,774,1540,1542],{},"The phone receives ",[147,1539,1103],{},[147,1541,1231],{},", exchanges them for a challenge token, signs the challenge, and approves the order.",[167,1544,1547],{"className":169,"code":1545,"filename":1546,"language":172,"meta":173,"style":173},"import {\n  createNimiqMiniAppApprover,\n  parseCrossDeviceClaimUrl,\n} from '@onmax\u002Fcross-device-nimiq'\nimport { authClient } from '..\u002Fapp\u002Fauth-client'\n\nexport async function approveCurrentClaim() {\n  const claim = parseCrossDeviceClaimUrl(window.location.href)\n  const approver = createNimiqMiniAppApprover()\n\n  return approver.approve(authClient.$fetch.bind(authClient), {\n    ...claim,\n    endpointPrefix: '\u002Fcross-device',\n  })\n}\n","phone\u002Fapprove-login.ts",[147,1548,1549,1555,1562,1569,1582,1600,1604,1619,1648,1663,1667,1703,1713,1727,1733],{"__ignoreMap":173},[177,1550,1551,1553],{"class":179,"line":180},[177,1552,184],{"class":183},[177,1554,470],{"class":187},[177,1556,1557,1560],{"class":179,"line":211},[177,1558,1559],{"class":191},"  createNimiqMiniAppApprover",[177,1561,323],{"class":187},[177,1563,1564,1567],{"class":179,"line":231},[177,1565,1566],{"class":191},"  parseCrossDeviceClaimUrl",[177,1568,323],{"class":187},[177,1570,1571,1573,1575,1577,1580],{"class":179,"line":252},[177,1572,649],{"class":187},[177,1574,198],{"class":183},[177,1576,201],{"class":187},[177,1578,1579],{"class":204},"@onmax\u002Fcross-device-nimiq",[177,1581,208],{"class":187},[177,1583,1584,1586,1588,1590,1592,1594,1596,1598],{"class":179,"line":259},[177,1585,184],{"class":183},[177,1587,188],{"class":187},[177,1589,930],{"class":191},[177,1591,195],{"class":187},[177,1593,198],{"class":183},[177,1595,201],{"class":187},[177,1597,939],{"class":204},[177,1599,208],{"class":187},[177,1601,1602],{"class":179,"line":284},[177,1603,256],{"emptyLinePlaceholder":255},[177,1605,1606,1608,1610,1612,1615,1617],{"class":179,"line":297},[177,1607,262],{"class":183},[177,1609,443],{"class":265},[177,1611,954],{"class":265},[177,1613,1614],{"class":275}," approveCurrentClaim",[177,1616,960],{"class":187},[177,1618,470],{"class":187},[177,1620,1621,1623,1626,1628,1631,1633,1636,1638,1641,1643,1646],{"class":179,"line":307},[177,1622,967],{"class":265},[177,1624,1625],{"class":191}," claim",[177,1627,482],{"class":187},[177,1629,1630],{"class":275}," parseCrossDeviceClaimUrl",[177,1632,278],{"class":287},[177,1634,1635],{"class":191},"window",[177,1637,490],{"class":187},[177,1639,1640],{"class":191},"location",[177,1642,490],{"class":187},[177,1644,1645],{"class":191},"href",[177,1647,572],{"class":287},[177,1649,1650,1652,1655,1657,1660],{"class":179,"line":326},[177,1651,967],{"class":265},[177,1653,1654],{"class":191}," approver",[177,1656,482],{"class":187},[177,1658,1659],{"class":275}," createNimiqMiniAppApprover",[177,1661,1662],{"class":287},"()\n",[177,1664,1665],{"class":179,"line":343},[177,1666,256],{"emptyLinePlaceholder":255},[177,1668,1669,1671,1673,1675,1678,1680,1683,1685,1688,1690,1693,1695,1697,1699,1701],{"class":179,"line":366},[177,1670,1121],{"class":183},[177,1672,1654],{"class":191},[177,1674,490],{"class":187},[177,1676,1677],{"class":275},"approve",[177,1679,278],{"class":287},[177,1681,1682],{"class":191},"authClient",[177,1684,490],{"class":187},[177,1686,1687],{"class":191},"$fetch",[177,1689,490],{"class":187},[177,1691,1692],{"class":275},"bind",[177,1694,278],{"class":287},[177,1696,1682],{"class":191},[177,1698,422],{"class":287},[177,1700,453],{"class":187},[177,1702,470],{"class":187},[177,1704,1705,1708,1711],{"class":179,"line":380},[177,1706,1707],{"class":187},"    ...",[177,1709,1710],{"class":191},"claim",[177,1712,323],{"class":187},[177,1714,1715,1717,1719,1721,1723,1725],{"class":179,"line":390},[177,1716,1397],{"class":287},[177,1718,291],{"class":187},[177,1720,201],{"class":187},[177,1722,336],{"class":204},[177,1724,320],{"class":187},[177,1726,323],{"class":187},[177,1728,1729,1731],{"class":179,"line":400},[177,1730,1070],{"class":187},[177,1732,572],{"class":287},[177,1734,1735],{"class":179,"line":416},[177,1736,1129],{"class":187},[143,1738,1132],{},[167,1740,1742],{"className":1135,"code":1741,"filename":1137,"language":1138,"meta":173,"style":173},"{\n  \"ok\": true,\n  \"orderId\": \"HrlSySstW-SR0pbCIY6Rzw\",\n  \"status\": \"approved\"\n}\n",[147,1743,1744,1748,1762,1780,1797],{"__ignoreMap":173},[177,1745,1746],{"class":179,"line":180},[177,1747,281],{"class":187},[177,1749,1750,1752,1755,1757,1759],{"class":179,"line":211},[177,1751,1149],{"class":187},[177,1753,1754],{"class":265},"ok",[177,1756,1154],{"class":187},[177,1758,291],{"class":187},[177,1760,1761],{"class":187}," true,\n",[177,1763,1764,1766,1768,1770,1772,1774,1776,1778],{"class":179,"line":231},[177,1765,1149],{"class":187},[177,1767,1103],{"class":265},[177,1769,1154],{"class":187},[177,1771,291],{"class":187},[177,1773,1159],{"class":187},[177,1775,1162],{"class":204},[177,1777,1154],{"class":187},[177,1779,323],{"class":187},[177,1781,1782,1784,1786,1788,1790,1792,1794],{"class":179,"line":252},[177,1783,1149],{"class":187},[177,1785,1211],{"class":265},[177,1787,1154],{"class":187},[177,1789,291],{"class":187},[177,1791,1159],{"class":187},[177,1793,1443],{"class":204},[177,1795,1796],{"class":187},"\"\n",[177,1798,1799],{"class":179,"line":259},[177,1800,1129],{"class":187},[159,1802,1804],{"id":1803},"finalize-on-desktop","Finalize on desktop",[143,1806,1807,1808,490],{},"Only the desktop can finalize because only the desktop holds ",[147,1809,914],{},[167,1811,1814],{"className":169,"code":1812,"filename":1813,"language":172,"meta":173,"style":173},"import { authClient } from '..\u002Fapp\u002Fauth-client'\n\nexport async function finalizeDesktopLogin(orderId: string) {\n  const desktopToken = sessionStorage.getItem(`cross-device:${orderId}`)\n  if (!desktopToken)\n    throw new Error('Missing desktop token')\n\n  const finalized = await authClient.finalizeCrossDeviceOrder({\n    orderId,\n    desktopToken,\n  })\n\n  sessionStorage.removeItem(`cross-device:${orderId}`)\n  return finalized\n}\n","desktop\u002Ffinalize-login.ts",[147,1815,1816,1834,1838,1861,1891,1905,1927,1931,1953,1959,1965,1971,1975,1998,2005],{"__ignoreMap":173},[177,1817,1818,1820,1822,1824,1826,1828,1830,1832],{"class":179,"line":180},[177,1819,184],{"class":183},[177,1821,188],{"class":187},[177,1823,930],{"class":191},[177,1825,195],{"class":187},[177,1827,198],{"class":183},[177,1829,201],{"class":187},[177,1831,939],{"class":204},[177,1833,208],{"class":187},[177,1835,1836],{"class":179,"line":211},[177,1837,256],{"emptyLinePlaceholder":255},[177,1839,1840,1842,1844,1846,1849,1851,1853,1855,1857,1859],{"class":179,"line":231},[177,1841,262],{"class":183},[177,1843,443],{"class":265},[177,1845,954],{"class":265},[177,1847,1848],{"class":275}," finalizeDesktopLogin",[177,1850,278],{"class":187},[177,1852,1103],{"class":449},[177,1854,291],{"class":187},[177,1856,1355],{"class":1354},[177,1858,422],{"class":187},[177,1860,470],{"class":187},[177,1862,1863,1865,1867,1869,1872,1874,1877,1879,1881,1883,1885,1887,1889],{"class":179,"line":252},[177,1864,967],{"class":265},[177,1866,1360],{"class":191},[177,1868,482],{"class":187},[177,1870,1871],{"class":191}," sessionStorage",[177,1873,490],{"class":187},[177,1875,1876],{"class":275},"getItem",[177,1878,278],{"class":287},[177,1880,655],{"class":187},[177,1882,1093],{"class":204},[177,1884,643],{"class":187},[177,1886,1103],{"class":191},[177,1888,1106],{"class":187},[177,1890,572],{"class":287},[177,1892,1893,1896,1898,1901,1903],{"class":179,"line":259},[177,1894,1895],{"class":183},"  if",[177,1897,581],{"class":287},[177,1899,1900],{"class":187},"!",[177,1902,914],{"class":191},[177,1904,572],{"class":287},[177,1906,1907,1910,1913,1916,1918,1920,1923,1925],{"class":179,"line":284},[177,1908,1909],{"class":183},"    throw",[177,1911,1912],{"class":187}," new",[177,1914,1915],{"class":275}," Error",[177,1917,278],{"class":287},[177,1919,320],{"class":187},[177,1921,1922],{"class":204},"Missing desktop token",[177,1924,320],{"class":187},[177,1926,572],{"class":287},[177,1928,1929],{"class":179,"line":297},[177,1930,256],{"emptyLinePlaceholder":255},[177,1932,1933,1935,1938,1940,1942,1944,1946,1949,1951],{"class":179,"line":307},[177,1934,967],{"class":265},[177,1936,1937],{"class":191}," finalized",[177,1939,482],{"class":187},[177,1941,485],{"class":183},[177,1943,930],{"class":191},[177,1945,490],{"class":187},[177,1947,1948],{"class":275},"finalizeCrossDeviceOrder",[177,1950,278],{"class":287},[177,1952,281],{"class":187},[177,1954,1955,1957],{"class":179,"line":326},[177,1956,1383],{"class":191},[177,1958,323],{"class":187},[177,1960,1961,1963],{"class":179,"line":343},[177,1962,1390],{"class":191},[177,1964,323],{"class":187},[177,1966,1967,1969],{"class":179,"line":366},[177,1968,1070],{"class":187},[177,1970,572],{"class":287},[177,1972,1973],{"class":179,"line":380},[177,1974,256],{"emptyLinePlaceholder":255},[177,1976,1977,1979,1981,1984,1986,1988,1990,1992,1994,1996],{"class":179,"line":390},[177,1978,1081],{"class":191},[177,1980,490],{"class":187},[177,1982,1983],{"class":275},"removeItem",[177,1985,278],{"class":287},[177,1987,655],{"class":187},[177,1989,1093],{"class":204},[177,1991,643],{"class":187},[177,1993,1103],{"class":191},[177,1995,1106],{"class":187},[177,1997,572],{"class":287},[177,1999,2000,2002],{"class":179,"line":400},[177,2001,1121],{"class":183},[177,2003,2004],{"class":191}," finalized\n",[177,2006,2007],{"class":179,"line":416},[177,2008,1129],{"class":187},[143,2010,2011],{},"Login finalization response:",[167,2013,2015],{"className":1135,"code":2014,"filename":1137,"language":1138,"meta":173,"style":173},"{\n  \"ok\": true,\n  \"orderId\": \"HrlSySstW-SR0pbCIY6Rzw\",\n  \"status\": \"finalized\",\n  \"kind\": \"login\",\n  \"redirectTo\": \"\u002Fdashboard\",\n  \"token\": \"better-auth-session-token\"\n}\n",[147,2016,2017,2021,2033,2051,2069,2087,2106,2124],{"__ignoreMap":173},[177,2018,2019],{"class":179,"line":180},[177,2020,281],{"class":187},[177,2022,2023,2025,2027,2029,2031],{"class":179,"line":211},[177,2024,1149],{"class":187},[177,2026,1754],{"class":265},[177,2028,1154],{"class":187},[177,2030,291],{"class":187},[177,2032,1761],{"class":187},[177,2034,2035,2037,2039,2041,2043,2045,2047,2049],{"class":179,"line":231},[177,2036,1149],{"class":187},[177,2038,1103],{"class":265},[177,2040,1154],{"class":187},[177,2042,291],{"class":187},[177,2044,1159],{"class":187},[177,2046,1162],{"class":204},[177,2048,1154],{"class":187},[177,2050,323],{"class":187},[177,2052,2053,2055,2057,2059,2061,2063,2065,2067],{"class":179,"line":252},[177,2054,1149],{"class":187},[177,2056,1211],{"class":265},[177,2058,1154],{"class":187},[177,2060,291],{"class":187},[177,2062,1159],{"class":187},[177,2064,1530],{"class":204},[177,2066,1154],{"class":187},[177,2068,323],{"class":187},[177,2070,2071,2073,2075,2077,2079,2081,2083,2085],{"class":179,"line":259},[177,2072,1149],{"class":187},[177,2074,1192],{"class":265},[177,2076,1154],{"class":187},[177,2078,291],{"class":187},[177,2080,1159],{"class":187},[177,2082,997],{"class":204},[177,2084,1154],{"class":187},[177,2086,323],{"class":187},[177,2088,2089,2091,2094,2096,2098,2100,2102,2104],{"class":179,"line":284},[177,2090,1149],{"class":187},[177,2092,2093],{"class":265},"redirectTo",[177,2095,1154],{"class":187},[177,2097,291],{"class":187},[177,2099,1159],{"class":187},[177,2101,1029],{"class":204},[177,2103,1154],{"class":187},[177,2105,323],{"class":187},[177,2107,2108,2110,2113,2115,2117,2119,2122],{"class":179,"line":297},[177,2109,1149],{"class":187},[177,2111,2112],{"class":265},"token",[177,2114,1154],{"class":187},[177,2116,291],{"class":187},[177,2118,1159],{"class":187},[177,2120,2121],{"class":204},"better-auth-session-token",[177,2123,1796],{"class":187},[177,2125,2126],{"class":179,"line":307},[177,2127,1129],{"class":187},[159,2129,2131],{"id":2130},"start-a-signature-order","Start a signature order",[143,2133,145,2134,2137],{},[147,2135,2136],{},"payloadHash"," when the phone must approve a specific desktop-side payload.",[167,2139,2142],{"className":169,"code":2140,"filename":2141,"language":172,"meta":173,"style":173},"import { authClient } from '..\u002Fapp\u002Fauth-client'\n\nasync function sha256Hex(value: string) {\n  const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value))\n  return [...new Uint8Array(digest)]\n    .map(byte => byte.toString(16).padStart(2, '0'))\n    .join('')\n}\n\nconst payload = JSON.stringify({\n  orderId: 'order_123',\n  amount: 1299,\n  currency: 'EUR',\n})\n\nexport const order = await authClient.startCrossDeviceOrder({\n  kind: 'sign',\n  adapterId: 'nimiq',\n  returnTo: '\u002Forders\u002Forder_123',\n  displayTitle: 'Approve order order_123',\n  displaySummary: 'Sign the checkout payload for EUR 12.99.',\n  payloadHash: await sha256Hex(payload),\n})\n","desktop\u002Fstart-sign.ts",[147,2143,2144,2162,2166,2189,2242,2261,2312,2326,2330,2334,2356,2372,2384,2400,2406,2410,2433,2449,2464,2480,2496,2512,2528],{"__ignoreMap":173},[177,2145,2146,2148,2150,2152,2154,2156,2158,2160],{"class":179,"line":180},[177,2147,184],{"class":183},[177,2149,188],{"class":187},[177,2151,930],{"class":191},[177,2153,195],{"class":187},[177,2155,198],{"class":183},[177,2157,201],{"class":187},[177,2159,939],{"class":204},[177,2161,208],{"class":187},[177,2163,2164],{"class":179,"line":211},[177,2165,256],{"emptyLinePlaceholder":255},[177,2167,2168,2171,2173,2176,2178,2181,2183,2185,2187],{"class":179,"line":231},[177,2169,2170],{"class":265},"async",[177,2172,954],{"class":265},[177,2174,2175],{"class":275}," sha256Hex",[177,2177,278],{"class":187},[177,2179,2180],{"class":449},"value",[177,2182,291],{"class":187},[177,2184,1355],{"class":1354},[177,2186,422],{"class":187},[177,2188,470],{"class":187},[177,2190,2191,2193,2196,2198,2200,2203,2205,2208,2210,2213,2215,2217,2220,2222,2224,2226,2229,2231,2233,2236,2238,2240],{"class":179,"line":252},[177,2192,967],{"class":265},[177,2194,2195],{"class":191}," digest",[177,2197,482],{"class":187},[177,2199,485],{"class":183},[177,2201,2202],{"class":191}," crypto",[177,2204,490],{"class":187},[177,2206,2207],{"class":191},"subtle",[177,2209,490],{"class":187},[177,2211,2212],{"class":275},"digest",[177,2214,278],{"class":287},[177,2216,320],{"class":187},[177,2218,2219],{"class":204},"SHA-256",[177,2221,320],{"class":187},[177,2223,453],{"class":187},[177,2225,1912],{"class":187},[177,2227,2228],{"class":275}," TextEncoder",[177,2230,960],{"class":287},[177,2232,490],{"class":187},[177,2234,2235],{"class":275},"encode",[177,2237,278],{"class":287},[177,2239,2180],{"class":191},[177,2241,1490],{"class":287},[177,2243,2244,2246,2248,2251,2254,2256,2258],{"class":179,"line":259},[177,2245,1121],{"class":183},[177,2247,351],{"class":287},[177,2249,2250],{"class":187},"...new",[177,2252,2253],{"class":275}," Uint8Array",[177,2255,278],{"class":287},[177,2257,2212],{"class":191},[177,2259,2260],{"class":287},")]\n",[177,2262,2263,2266,2269,2271,2274,2276,2279,2281,2284,2286,2289,2291,2293,2296,2298,2301,2303,2305,2308,2310],{"class":179,"line":284},[177,2264,2265],{"class":187},"    .",[177,2267,2268],{"class":275},"map",[177,2270,278],{"class":287},[177,2272,2273],{"class":449},"byte",[177,2275,467],{"class":265},[177,2277,2278],{"class":191}," byte",[177,2280,490],{"class":187},[177,2282,2283],{"class":275},"toString",[177,2285,278],{"class":287},[177,2287,2288],{"class":374},"16",[177,2290,422],{"class":287},[177,2292,490],{"class":187},[177,2294,2295],{"class":275},"padStart",[177,2297,278],{"class":287},[177,2299,2300],{"class":374},"2",[177,2302,453],{"class":187},[177,2304,201],{"class":187},[177,2306,2307],{"class":204},"0",[177,2309,320],{"class":187},[177,2311,1490],{"class":287},[177,2313,2314,2316,2319,2321,2324],{"class":179,"line":297},[177,2315,2265],{"class":187},[177,2317,2318],{"class":275},"join",[177,2320,278],{"class":287},[177,2322,2323],{"class":187},"''",[177,2325,572],{"class":287},[177,2327,2328],{"class":179,"line":307},[177,2329,1129],{"class":187},[177,2331,2332],{"class":179,"line":326},[177,2333,256],{"emptyLinePlaceholder":255},[177,2335,2336,2339,2342,2344,2347,2349,2352,2354],{"class":179,"line":343},[177,2337,2338],{"class":265},"const",[177,2340,2341],{"class":191}," payload ",[177,2343,272],{"class":187},[177,2345,2346],{"class":191}," JSON",[177,2348,490],{"class":187},[177,2350,2351],{"class":275},"stringify",[177,2353,278],{"class":191},[177,2355,281],{"class":187},[177,2357,2358,2361,2363,2365,2368,2370],{"class":179,"line":366},[177,2359,2360],{"class":287},"  orderId",[177,2362,291],{"class":187},[177,2364,201],{"class":187},[177,2366,2367],{"class":204},"order_123",[177,2369,320],{"class":187},[177,2371,323],{"class":187},[177,2373,2374,2377,2379,2382],{"class":179,"line":380},[177,2375,2376],{"class":287},"  amount",[177,2378,291],{"class":187},[177,2380,2381],{"class":374}," 1299",[177,2383,323],{"class":187},[177,2385,2386,2389,2391,2393,2396,2398],{"class":179,"line":390},[177,2387,2388],{"class":287},"  currency",[177,2390,291],{"class":187},[177,2392,201],{"class":187},[177,2394,2395],{"class":204},"EUR",[177,2397,320],{"class":187},[177,2399,323],{"class":187},[177,2401,2402,2404],{"class":179,"line":400},[177,2403,649],{"class":187},[177,2405,572],{"class":191},[177,2407,2408],{"class":179,"line":416},[177,2409,256],{"emptyLinePlaceholder":255},[177,2411,2412,2414,2416,2419,2421,2423,2425,2427,2429,2431],{"class":179,"line":427},[177,2413,262],{"class":183},[177,2415,266],{"class":265},[177,2417,2418],{"class":191}," order ",[177,2420,272],{"class":187},[177,2422,485],{"class":183},[177,2424,930],{"class":191},[177,2426,490],{"class":187},[177,2428,981],{"class":275},[177,2430,278],{"class":191},[177,2432,281],{"class":187},[177,2434,2435,2438,2440,2442,2445,2447],{"class":179,"line":435},[177,2436,2437],{"class":287},"  kind",[177,2439,291],{"class":187},[177,2441,201],{"class":187},[177,2443,2444],{"class":204},"sign",[177,2446,320],{"class":187},[177,2448,323],{"class":187},[177,2450,2451,2454,2456,2458,2460,2462],{"class":179,"line":473},[177,2452,2453],{"class":287},"  adapterId",[177,2455,291],{"class":187},[177,2457,201],{"class":187},[177,2459,1013],{"class":204},[177,2461,320],{"class":187},[177,2463,323],{"class":187},[177,2465,2466,2469,2471,2473,2476,2478],{"class":179,"line":510},[177,2467,2468],{"class":287},"  returnTo",[177,2470,291],{"class":187},[177,2472,201],{"class":187},[177,2474,2475],{"class":204},"\u002Forders\u002Forder_123",[177,2477,320],{"class":187},[177,2479,323],{"class":187},[177,2481,2482,2485,2487,2489,2492,2494],{"class":179,"line":527},[177,2483,2484],{"class":287},"  displayTitle",[177,2486,291],{"class":187},[177,2488,201],{"class":187},[177,2490,2491],{"class":204},"Approve order order_123",[177,2493,320],{"class":187},[177,2495,323],{"class":187},[177,2497,2498,2501,2503,2505,2508,2510],{"class":179,"line":567},[177,2499,2500],{"class":287},"  displaySummary",[177,2502,291],{"class":187},[177,2504,201],{"class":187},[177,2506,2507],{"class":204},"Sign the checkout payload for EUR 12.99.",[177,2509,320],{"class":187},[177,2511,323],{"class":187},[177,2513,2514,2517,2519,2521,2523,2526],{"class":179,"line":575},[177,2515,2516],{"class":287},"  payloadHash",[177,2518,291],{"class":187},[177,2520,485],{"class":183},[177,2522,2175],{"class":275},[177,2524,2525],{"class":191},"(payload)",[177,2527,323],{"class":187},[177,2529,2530,2532],{"class":179,"line":589},[177,2531,649],{"class":187},[177,2533,572],{"class":191},[159,2535,2537],{"id":2536},"endpoint-contract","Endpoint contract",[2539,2540,2541,2560],"table",{},[2542,2543,2544],"thead",{},[2545,2546,2547,2551,2554,2557],"tr",{},[2548,2549,2550],"th",{},"Endpoint",[2548,2552,2553],{},"Method",[2548,2555,2556],{},"Holder",[2548,2558,2559],{},"Purpose",[2561,2562,2563,2582,2605,2622,2638,2654,2672,2688],"tbody",{},[2545,2564,2565,2571,2576,2579],{},[2566,2567,2568],"td",{},[147,2569,2570],{},"\u002Fcross-device\u002Fstart",[2566,2572,2573],{},[147,2574,2575],{},"POST",[2566,2577,2578],{},"Desktop",[2566,2580,2581],{},"Creates an order and returns claim data",[2545,2583,2584,2589,2593,2596],{},[2566,2585,2586],{},[147,2587,2588],{},"\u002Fcross-device\u002Fclaim",[2566,2590,2591],{},[147,2592,2575],{},[2566,2594,2595],{},"Phone",[2566,2597,2598,2599,2601,2602],{},"Exchanges ",[147,2600,1231],{}," for ",[147,2603,2604],{},"challengeToken",[2545,2606,2607,2612,2617,2619],{},[2566,2608,2609],{},[147,2610,2611],{},"\u002Fcross-device\u002Fchallenge",[2566,2613,2614],{},[147,2615,2616],{},"GET",[2566,2618,2595],{},[2566,2620,2621],{},"Reads the challenge envelope",[2545,2623,2624,2629,2633,2635],{},[2566,2625,2626],{},[147,2627,2628],{},"\u002Fcross-device\u002Fapprove",[2566,2630,2631],{},[147,2632,2575],{},[2566,2634,2595],{},[2566,2636,2637],{},"Verifies the phone proof and marks approved",[2545,2639,2640,2645,2649,2651],{},[2566,2641,2642],{},[147,2643,2644],{},"\u002Fcross-device\u002Freject",[2566,2646,2647],{},[147,2648,2575],{},[2566,2650,2595],{},[2566,2652,2653],{},"Marks rejected",[2545,2655,2656,2661,2665,2667],{},[2566,2657,2658],{},[147,2659,2660],{},"\u002Fcross-device\u002Fcancel",[2566,2662,2663],{},[147,2664,2575],{},[2566,2666,2578],{},[2566,2668,2669,2670],{},"Cancels with ",[147,2671,914],{},[2545,2673,2674,2679,2683,2685],{},[2566,2675,2676],{},[147,2677,2678],{},"\u002Fcross-device\u002Ffinalize",[2566,2680,2681],{},[147,2682,2575],{},[2566,2684,2578],{},[2566,2686,2687],{},"Creates the session or returns a proof artifact",[2545,2689,2690,2695,2699,2701],{},[2566,2691,2692],{},[147,2693,2694],{},"\u002Fcross-device\u002Fevents",[2566,2696,2697],{},[147,2698,2616],{},[2566,2700,2578],{},[2566,2702,2703],{},"Streams status events over SSE",[2705,2706,2707,2708,2710],"important",{},"The claim URL is not a session. Never put ",[147,2709,914],{}," in the QR code, phone URL, logs, analytics events, or support screenshots.",[2712,2713,2714],"style",{},"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":173,"searchDepth":211,"depth":211,"links":2716},[2717,2718,2719,2720,2721,2722,2723,2724],{"id":161,"depth":211,"text":162},{"id":781,"depth":211,"text":782},{"id":903,"depth":211,"text":904},{"id":1303,"depth":211,"text":1304},{"id":1533,"depth":211,"text":1534},{"id":1803,"depth":211,"text":1804},{"id":2130,"depth":211,"text":2131},{"id":2536,"depth":211,"text":2537},"Start login, sign, and transaction orders on one device and approve them on another.","md",null,{},{"title":68,"description":2725},"haH0C2-rILrSYxHEUHjphLQMjk8gPJsio0t6jvmJN8E",[2732,2734],{"title":64,"path":65,"stem":66,"description":2733,"children":-1},"Add direct Nimiq signed-message sign-in to Better Auth.",{"title":72,"path":73,"stem":74,"description":2735,"children":-1},"Verify Nimiq proofs for cross-device login, sign, and transaction orders.",1778838252701]