[{"data":1,"prerenderedAt":1726},["ShallowReactive",2],{"navigation_docs":3,"-auth-nimiq-adapter":137,"-auth-nimiq-adapter-surround":1721},[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":72,"body":139,"description":1715,"extension":1716,"links":1717,"meta":1718,"navigation":211,"path":73,"seo":1719,"stem":74,"__hash__":1720},"docs\u002F3.auth\u002F3.nimiq-adapter.md",{"type":140,"value":141,"toc":1707},"minimark",[142,155,158,163,285,312,316,319,657,660,732,736,742,802,805,856,860,877,1183,1186,1340,1344,1347,1570,1573,1597,1601,1604,1700,1703],[143,144,145,146,150,151,154],"p",{},"Use ",[147,148,149],"code",{},"@onmax\u002Fcross-device-nimiq"," with ",[147,152,153],{},"@onmax\u002Fbetter-auth-cross-device"," when a cross-device proof must come from a Nimiq key.",[143,156,157],{},"Do not use this adapter by itself as an auth system. The Better Auth cross-device plugin owns order storage, status transitions, sessions, and SSE.",[159,160,162],"h2",{"id":161},"register-the-server-adapter","Register the server adapter",[164,165,171],"pre",{"className":166,"code":167,"filename":168,"language":169,"meta":170,"style":170},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createNimiqCrossDeviceAdapter } from '@onmax\u002Fcross-device-nimiq\u002Fserver'\n\nexport const nimiqAdapter = createNimiqCrossDeviceAdapter({\n  id: 'nimiq',\n  appName: 'Nimiq Checkout',\n})\n","server\u002Fnimiq-cross-device.ts","ts","",[147,172,173,206,213,238,259,276],{"__ignoreMap":170},[174,175,178,182,186,190,193,196,199,203],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"s7zQu","import",[174,183,185],{"class":184},"sMK4o"," {",[174,187,189],{"class":188},"sTEyZ"," createNimiqCrossDeviceAdapter",[174,191,192],{"class":184}," }",[174,194,195],{"class":180}," from",[174,197,198],{"class":184}," '",[174,200,202],{"class":201},"sfazB","@onmax\u002Fcross-device-nimiq\u002Fserver",[174,204,205],{"class":184},"'\n",[174,207,209],{"class":176,"line":208},2,[174,210,212],{"emptyLinePlaceholder":211},true,"\n",[174,214,216,219,223,226,229,232,235],{"class":176,"line":215},3,[174,217,218],{"class":180},"export",[174,220,222],{"class":221},"spNyl"," const",[174,224,225],{"class":188}," nimiqAdapter ",[174,227,228],{"class":184},"=",[174,230,189],{"class":231},"s2Zo4",[174,233,234],{"class":188},"(",[174,236,237],{"class":184},"{\n",[174,239,241,245,248,250,253,256],{"class":176,"line":240},4,[174,242,244],{"class":243},"swJcz","  id",[174,246,247],{"class":184},":",[174,249,198],{"class":184},[174,251,252],{"class":201},"nimiq",[174,254,255],{"class":184},"'",[174,257,258],{"class":184},",\n",[174,260,262,265,267,269,272,274],{"class":176,"line":261},5,[174,263,264],{"class":243},"  appName",[174,266,247],{"class":184},[174,268,198],{"class":184},[174,270,271],{"class":201},"Nimiq Checkout",[174,273,255],{"class":184},[174,275,258],{"class":184},[174,277,279,282],{"class":176,"line":278},6,[174,280,281],{"class":184},"}",[174,283,284],{"class":188},")\n",[143,286,287,288,291,292,295,296,299,300,291,302,291,304,307,308,311],{},"Expected verification output: login and sign proofs expose ",[147,289,290],{},"publicKeyHex",", ",[147,293,294],{},"signatureHex",", and optional ",[147,297,298],{},"address",". Transaction proofs expose ",[147,301,290],{},[147,303,298],{},[147,305,306],{},"txHash",", and ",[147,309,310],{},"providerResultRaw",".",[159,313,315],{"id":314},"approve-from-a-phone-route","Approve from a phone route",[143,317,318],{},"Use the approver inside the route opened by the QR claim URL.",[164,320,323],{"className":166,"code":321,"filename":322,"language":169,"meta":170,"style":170},"import {\n  createNimiqBrowserHandoff,\n  createNimiqMiniAppApprover,\n  getNimiqApprovalEnvironment,\n  parseCrossDeviceClaimUrl,\n} from '@onmax\u002Fcross-device-nimiq'\nimport { authClient } from '..\u002F..\u002Fapp\u002Fauth-client'\n\nexport async function approveFromCurrentUrl() {\n  const environment = getNimiqApprovalEnvironment()\n  if (!environment.available)\n    return createNimiqBrowserHandoff(window.location.href)\n\n  const claim = parseCrossDeviceClaimUrl(window.location.href)\n  const approver = createNimiqMiniAppApprover({\n    provider: environment.provider,\n    requestAddress: true,\n  })\n\n  return approver.approve(authClient.$fetch.bind(authClient), {\n    ...claim,\n    endpointPrefix: '\u002Fcross-device',\n  })\n}\n","phone\u002Froutes\u002Fcross-device.ts",[147,324,325,332,339,346,353,360,372,393,398,417,435,457,483,488,515,532,549,563,571,576,616,627,644,651],{"__ignoreMap":170},[174,326,327,329],{"class":176,"line":177},[174,328,181],{"class":180},[174,330,331],{"class":184}," {\n",[174,333,334,337],{"class":176,"line":208},[174,335,336],{"class":188},"  createNimiqBrowserHandoff",[174,338,258],{"class":184},[174,340,341,344],{"class":176,"line":215},[174,342,343],{"class":188},"  createNimiqMiniAppApprover",[174,345,258],{"class":184},[174,347,348,351],{"class":176,"line":240},[174,349,350],{"class":188},"  getNimiqApprovalEnvironment",[174,352,258],{"class":184},[174,354,355,358],{"class":176,"line":261},[174,356,357],{"class":188},"  parseCrossDeviceClaimUrl",[174,359,258],{"class":184},[174,361,362,364,366,368,370],{"class":176,"line":278},[174,363,281],{"class":184},[174,365,195],{"class":180},[174,367,198],{"class":184},[174,369,149],{"class":201},[174,371,205],{"class":184},[174,373,375,377,379,382,384,386,388,391],{"class":176,"line":374},7,[174,376,181],{"class":180},[174,378,185],{"class":184},[174,380,381],{"class":188}," authClient",[174,383,192],{"class":184},[174,385,195],{"class":180},[174,387,198],{"class":184},[174,389,390],{"class":201},"..\u002F..\u002Fapp\u002Fauth-client",[174,392,205],{"class":184},[174,394,396],{"class":176,"line":395},8,[174,397,212],{"emptyLinePlaceholder":211},[174,399,401,403,406,409,412,415],{"class":176,"line":400},9,[174,402,218],{"class":180},[174,404,405],{"class":221}," async",[174,407,408],{"class":221}," function",[174,410,411],{"class":231}," approveFromCurrentUrl",[174,413,414],{"class":184},"()",[174,416,331],{"class":184},[174,418,420,423,426,429,432],{"class":176,"line":419},10,[174,421,422],{"class":221},"  const",[174,424,425],{"class":188}," environment",[174,427,428],{"class":184}," =",[174,430,431],{"class":231}," getNimiqApprovalEnvironment",[174,433,434],{"class":243},"()\n",[174,436,438,441,444,447,450,452,455],{"class":176,"line":437},11,[174,439,440],{"class":180},"  if",[174,442,443],{"class":243}," (",[174,445,446],{"class":184},"!",[174,448,449],{"class":188},"environment",[174,451,311],{"class":184},[174,453,454],{"class":188},"available",[174,456,284],{"class":243},[174,458,460,463,466,468,471,473,476,478,481],{"class":176,"line":459},12,[174,461,462],{"class":180},"    return",[174,464,465],{"class":231}," createNimiqBrowserHandoff",[174,467,234],{"class":243},[174,469,470],{"class":188},"window",[174,472,311],{"class":184},[174,474,475],{"class":188},"location",[174,477,311],{"class":184},[174,479,480],{"class":188},"href",[174,482,284],{"class":243},[174,484,486],{"class":176,"line":485},13,[174,487,212],{"emptyLinePlaceholder":211},[174,489,491,493,496,498,501,503,505,507,509,511,513],{"class":176,"line":490},14,[174,492,422],{"class":221},[174,494,495],{"class":188}," claim",[174,497,428],{"class":184},[174,499,500],{"class":231}," parseCrossDeviceClaimUrl",[174,502,234],{"class":243},[174,504,470],{"class":188},[174,506,311],{"class":184},[174,508,475],{"class":188},[174,510,311],{"class":184},[174,512,480],{"class":188},[174,514,284],{"class":243},[174,516,518,520,523,525,528,530],{"class":176,"line":517},15,[174,519,422],{"class":221},[174,521,522],{"class":188}," approver",[174,524,428],{"class":184},[174,526,527],{"class":231}," createNimiqMiniAppApprover",[174,529,234],{"class":243},[174,531,237],{"class":184},[174,533,535,538,540,542,544,547],{"class":176,"line":534},16,[174,536,537],{"class":243},"    provider",[174,539,247],{"class":184},[174,541,425],{"class":188},[174,543,311],{"class":184},[174,545,546],{"class":188},"provider",[174,548,258],{"class":184},[174,550,552,555,557,561],{"class":176,"line":551},17,[174,553,554],{"class":243},"    requestAddress",[174,556,247],{"class":184},[174,558,560],{"class":559},"sfNiH"," true",[174,562,258],{"class":184},[174,564,566,569],{"class":176,"line":565},18,[174,567,568],{"class":184},"  }",[174,570,284],{"class":243},[174,572,574],{"class":176,"line":573},19,[174,575,212],{"emptyLinePlaceholder":211},[174,577,579,582,584,586,589,591,594,596,599,601,604,606,608,611,614],{"class":176,"line":578},20,[174,580,581],{"class":180},"  return",[174,583,522],{"class":188},[174,585,311],{"class":184},[174,587,588],{"class":231},"approve",[174,590,234],{"class":243},[174,592,593],{"class":188},"authClient",[174,595,311],{"class":184},[174,597,598],{"class":188},"$fetch",[174,600,311],{"class":184},[174,602,603],{"class":231},"bind",[174,605,234],{"class":243},[174,607,593],{"class":188},[174,609,610],{"class":243},")",[174,612,613],{"class":184},",",[174,615,331],{"class":184},[174,617,619,622,625],{"class":176,"line":618},21,[174,620,621],{"class":184},"    ...",[174,623,624],{"class":188},"claim",[174,626,258],{"class":184},[174,628,630,633,635,637,640,642],{"class":176,"line":629},22,[174,631,632],{"class":243},"    endpointPrefix",[174,634,247],{"class":184},[174,636,198],{"class":184},[174,638,639],{"class":201},"\u002Fcross-device",[174,641,255],{"class":184},[174,643,258],{"class":184},[174,645,647,649],{"class":176,"line":646},23,[174,648,568],{"class":184},[174,650,284],{"class":243},[174,652,654],{"class":176,"line":653},24,[174,655,656],{"class":184},"}\n",[143,658,659],{},"Expected response:",[164,661,666],{"className":662,"code":663,"filename":664,"language":665,"meta":170,"style":170},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"ok\": true,\n  \"orderId\": \"HrlSySstW-SR0pbCIY6Rzw\",\n  \"status\": \"approved\"\n}\n","response","json",[147,667,668,672,688,709,728],{"__ignoreMap":170},[174,669,670],{"class":176,"line":177},[174,671,237],{"class":184},[174,673,674,677,680,683,685],{"class":176,"line":208},[174,675,676],{"class":184},"  \"",[174,678,679],{"class":221},"ok",[174,681,682],{"class":184},"\"",[174,684,247],{"class":184},[174,686,687],{"class":184}," true,\n",[174,689,690,692,695,697,699,702,705,707],{"class":176,"line":215},[174,691,676],{"class":184},[174,693,694],{"class":221},"orderId",[174,696,682],{"class":184},[174,698,247],{"class":184},[174,700,701],{"class":184}," \"",[174,703,704],{"class":201},"HrlSySstW-SR0pbCIY6Rzw",[174,706,682],{"class":184},[174,708,258],{"class":184},[174,710,711,713,716,718,720,722,725],{"class":176,"line":240},[174,712,676],{"class":184},[174,714,715],{"class":221},"status",[174,717,682],{"class":184},[174,719,247],{"class":184},[174,721,701],{"class":184},[174,723,724],{"class":201},"approved",[174,726,727],{"class":184},"\"\n",[174,729,730],{"class":176,"line":261},[174,731,656],{"class":184},[159,733,735],{"id":734},"parse-claim-urls","Parse claim URLs",[143,737,738,739,311],{},"The default claim path is ",[147,740,741],{},"\u002Fcross-device\u002Fclaim\u002F{orderId}?token={claimToken}",[164,743,746],{"className":166,"code":744,"filename":745,"language":169,"meta":170,"style":170},"import { parseCrossDeviceClaimUrl } from '@onmax\u002Fcross-device-nimiq'\n\nexport const claim = parseCrossDeviceClaimUrl(\n  'https:\u002F\u002Fpay.example.com\u002Fcross-device\u002Fclaim\u002Forder_123?token=claim_456',\n)\n","phone\u002Fclaim.ts",[147,747,748,766,770,786,798],{"__ignoreMap":170},[174,749,750,752,754,756,758,760,762,764],{"class":176,"line":177},[174,751,181],{"class":180},[174,753,185],{"class":184},[174,755,500],{"class":188},[174,757,192],{"class":184},[174,759,195],{"class":180},[174,761,198],{"class":184},[174,763,149],{"class":201},[174,765,205],{"class":184},[174,767,768],{"class":176,"line":208},[174,769,212],{"emptyLinePlaceholder":211},[174,771,772,774,776,779,781,783],{"class":176,"line":215},[174,773,218],{"class":180},[174,775,222],{"class":221},[174,777,778],{"class":188}," claim ",[174,780,228],{"class":184},[174,782,500],{"class":231},[174,784,785],{"class":188},"(\n",[174,787,788,791,794,796],{"class":176,"line":240},[174,789,790],{"class":184},"  '",[174,792,793],{"class":201},"https:\u002F\u002Fpay.example.com\u002Fcross-device\u002Fclaim\u002Forder_123?token=claim_456",[174,795,255],{"class":184},[174,797,258],{"class":184},[174,799,800],{"class":176,"line":261},[174,801,284],{"class":188},[143,803,804],{},"Expected result:",[164,806,809],{"className":662,"code":807,"filename":808,"language":665,"meta":170,"style":170},"{\n  \"orderId\": \"order_123\",\n  \"claimToken\": \"claim_456\"\n}\n","output",[147,810,811,815,834,852],{"__ignoreMap":170},[174,812,813],{"class":176,"line":177},[174,814,237],{"class":184},[174,816,817,819,821,823,825,827,830,832],{"class":176,"line":208},[174,818,676],{"class":184},[174,820,694],{"class":221},[174,822,682],{"class":184},[174,824,247],{"class":184},[174,826,701],{"class":184},[174,828,829],{"class":201},"order_123",[174,831,682],{"class":184},[174,833,258],{"class":184},[174,835,836,838,841,843,845,847,850],{"class":176,"line":215},[174,837,676],{"class":184},[174,839,840],{"class":221},"claimToken",[174,842,682],{"class":184},[174,844,247],{"class":184},[174,846,701],{"class":184},[174,848,849],{"class":201},"claim_456",[174,851,727],{"class":184},[174,853,854],{"class":176,"line":240},[174,855,656],{"class":184},[159,857,859],{"id":858},"approve-a-transaction-order","Approve a transaction order",[143,861,145,862,865,866,869,870,873,874,311],{},[147,863,864],{},"resolveTransactionInput"," only for ",[147,867,868],{},"kind: 'transaction'",". The approver signs the challenge, sends ",[147,871,872],{},"sendBasicTransactionWithData()",", and submits the transaction artifact to ",[147,875,876],{},"\u002Fcross-device\u002Fapprove",[164,878,881],{"className":166,"code":879,"filename":880,"language":169,"meta":170,"style":170},"import {\n  createNimiqMiniAppApprover,\n  parseCrossDeviceClaimUrl,\n} from '@onmax\u002Fcross-device-nimiq'\nimport { authClient } from '..\u002Fapp\u002Fauth-client'\n\nconst approver = createNimiqMiniAppApprover({\n  resolveTransactionInput: async ({ challenge }) => {\n    if (challenge.kind !== 'transaction')\n      throw new Error('Unexpected non-transaction challenge')\n\n    return {\n      recipient: 'NQ07 0000 0000 0000 0000 0000 0000 0000 0000',\n      value: 1299,\n      data: `checkout:${challenge.orderId}`,\n    }\n  },\n})\n\nawait approver.approve(authClient.$fetch.bind(authClient), {\n  ...parseCrossDeviceClaimUrl(window.location.href),\n  endpointPrefix: '\u002Fcross-device',\n})\n","phone\u002Fapprove-transaction.ts",[147,882,883,889,895,901,913,932,936,952,976,1003,1025,1029,1035,1051,1064,1091,1096,1101,1107,1111,1140,1162,1177],{"__ignoreMap":170},[174,884,885,887],{"class":176,"line":177},[174,886,181],{"class":180},[174,888,331],{"class":184},[174,890,891,893],{"class":176,"line":208},[174,892,343],{"class":188},[174,894,258],{"class":184},[174,896,897,899],{"class":176,"line":215},[174,898,357],{"class":188},[174,900,258],{"class":184},[174,902,903,905,907,909,911],{"class":176,"line":240},[174,904,281],{"class":184},[174,906,195],{"class":180},[174,908,198],{"class":184},[174,910,149],{"class":201},[174,912,205],{"class":184},[174,914,915,917,919,921,923,925,927,930],{"class":176,"line":261},[174,916,181],{"class":180},[174,918,185],{"class":184},[174,920,381],{"class":188},[174,922,192],{"class":184},[174,924,195],{"class":180},[174,926,198],{"class":184},[174,928,929],{"class":201},"..\u002Fapp\u002Fauth-client",[174,931,205],{"class":184},[174,933,934],{"class":176,"line":278},[174,935,212],{"emptyLinePlaceholder":211},[174,937,938,941,944,946,948,950],{"class":176,"line":374},[174,939,940],{"class":221},"const",[174,942,943],{"class":188}," approver ",[174,945,228],{"class":184},[174,947,527],{"class":231},[174,949,234],{"class":188},[174,951,237],{"class":184},[174,953,954,957,959,961,964,968,971,974],{"class":176,"line":395},[174,955,956],{"class":231},"  resolveTransactionInput",[174,958,247],{"class":184},[174,960,405],{"class":221},[174,962,963],{"class":184}," ({",[174,965,967],{"class":966},"sHdIc"," challenge",[174,969,970],{"class":184}," })",[174,972,973],{"class":221}," =>",[174,975,331],{"class":184},[174,977,978,981,983,986,988,991,994,996,999,1001],{"class":176,"line":400},[174,979,980],{"class":180},"    if",[174,982,443],{"class":243},[174,984,985],{"class":188},"challenge",[174,987,311],{"class":184},[174,989,990],{"class":188},"kind",[174,992,993],{"class":184}," !==",[174,995,198],{"class":184},[174,997,998],{"class":201},"transaction",[174,1000,255],{"class":184},[174,1002,284],{"class":243},[174,1004,1005,1008,1011,1014,1016,1018,1021,1023],{"class":176,"line":419},[174,1006,1007],{"class":180},"      throw",[174,1009,1010],{"class":184}," new",[174,1012,1013],{"class":231}," Error",[174,1015,234],{"class":243},[174,1017,255],{"class":184},[174,1019,1020],{"class":201},"Unexpected non-transaction challenge",[174,1022,255],{"class":184},[174,1024,284],{"class":243},[174,1026,1027],{"class":176,"line":437},[174,1028,212],{"emptyLinePlaceholder":211},[174,1030,1031,1033],{"class":176,"line":459},[174,1032,462],{"class":180},[174,1034,331],{"class":184},[174,1036,1037,1040,1042,1044,1047,1049],{"class":176,"line":485},[174,1038,1039],{"class":243},"      recipient",[174,1041,247],{"class":184},[174,1043,198],{"class":184},[174,1045,1046],{"class":201},"NQ07 0000 0000 0000 0000 0000 0000 0000 0000",[174,1048,255],{"class":184},[174,1050,258],{"class":184},[174,1052,1053,1056,1058,1062],{"class":176,"line":490},[174,1054,1055],{"class":243},"      value",[174,1057,247],{"class":184},[174,1059,1061],{"class":1060},"sbssI"," 1299",[174,1063,258],{"class":184},[174,1065,1066,1069,1071,1074,1077,1080,1082,1084,1086,1089],{"class":176,"line":517},[174,1067,1068],{"class":243},"      data",[174,1070,247],{"class":184},[174,1072,1073],{"class":184}," `",[174,1075,1076],{"class":201},"checkout:",[174,1078,1079],{"class":184},"${",[174,1081,985],{"class":188},[174,1083,311],{"class":184},[174,1085,694],{"class":188},[174,1087,1088],{"class":184},"}`",[174,1090,258],{"class":184},[174,1092,1093],{"class":176,"line":534},[174,1094,1095],{"class":184},"    }\n",[174,1097,1098],{"class":176,"line":551},[174,1099,1100],{"class":184},"  },\n",[174,1102,1103,1105],{"class":176,"line":565},[174,1104,281],{"class":184},[174,1106,284],{"class":188},[174,1108,1109],{"class":176,"line":573},[174,1110,212],{"emptyLinePlaceholder":211},[174,1112,1113,1116,1118,1120,1122,1125,1127,1129,1131,1133,1136,1138],{"class":176,"line":578},[174,1114,1115],{"class":180},"await",[174,1117,522],{"class":188},[174,1119,311],{"class":184},[174,1121,588],{"class":231},[174,1123,1124],{"class":188},"(authClient",[174,1126,311],{"class":184},[174,1128,598],{"class":188},[174,1130,311],{"class":184},[174,1132,603],{"class":231},[174,1134,1135],{"class":188},"(authClient)",[174,1137,613],{"class":184},[174,1139,331],{"class":184},[174,1141,1142,1145,1148,1151,1153,1155,1157,1160],{"class":176,"line":618},[174,1143,1144],{"class":184},"  ...",[174,1146,1147],{"class":231},"parseCrossDeviceClaimUrl",[174,1149,1150],{"class":188},"(window",[174,1152,311],{"class":184},[174,1154,475],{"class":188},[174,1156,311],{"class":184},[174,1158,1159],{"class":188},"href)",[174,1161,258],{"class":184},[174,1163,1164,1167,1169,1171,1173,1175],{"class":176,"line":629},[174,1165,1166],{"class":243},"  endpointPrefix",[174,1168,247],{"class":184},[174,1170,198],{"class":184},[174,1172,639],{"class":201},[174,1174,255],{"class":184},[174,1176,258],{"class":184},[174,1178,1179,1181],{"class":176,"line":646},[174,1180,281],{"class":184},[174,1182,284],{"class":188},[143,1184,1185],{},"Expected desktop finalization artifact:",[164,1187,1189],{"className":662,"code":1188,"filename":664,"language":665,"meta":170,"style":170},"{\n  \"ok\": true,\n  \"status\": \"finalized\",\n  \"kind\": \"transaction\",\n  \"proofArtifact\": {\n    \"publicKeyHex\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n    \"address\": \"NQ07 0000 0000 0000 0000 0000 0000 0000 0000\",\n    \"txHash\": \"0xtransaction\",\n    \"providerResultRaw\": \"0xtransaction\"\n  }\n}\n",[147,1190,1191,1195,1207,1226,1244,1257,1278,1296,1315,1331,1336],{"__ignoreMap":170},[174,1192,1193],{"class":176,"line":177},[174,1194,237],{"class":184},[174,1196,1197,1199,1201,1203,1205],{"class":176,"line":208},[174,1198,676],{"class":184},[174,1200,679],{"class":221},[174,1202,682],{"class":184},[174,1204,247],{"class":184},[174,1206,687],{"class":184},[174,1208,1209,1211,1213,1215,1217,1219,1222,1224],{"class":176,"line":215},[174,1210,676],{"class":184},[174,1212,715],{"class":221},[174,1214,682],{"class":184},[174,1216,247],{"class":184},[174,1218,701],{"class":184},[174,1220,1221],{"class":201},"finalized",[174,1223,682],{"class":184},[174,1225,258],{"class":184},[174,1227,1228,1230,1232,1234,1236,1238,1240,1242],{"class":176,"line":240},[174,1229,676],{"class":184},[174,1231,990],{"class":221},[174,1233,682],{"class":184},[174,1235,247],{"class":184},[174,1237,701],{"class":184},[174,1239,998],{"class":201},[174,1241,682],{"class":184},[174,1243,258],{"class":184},[174,1245,1246,1248,1251,1253,1255],{"class":176,"line":261},[174,1247,676],{"class":184},[174,1249,1250],{"class":221},"proofArtifact",[174,1252,682],{"class":184},[174,1254,247],{"class":184},[174,1256,331],{"class":184},[174,1258,1259,1262,1265,1267,1269,1271,1274,1276],{"class":176,"line":278},[174,1260,1261],{"class":184},"    \"",[174,1263,290],{"class":1264},"sBMFI",[174,1266,682],{"class":184},[174,1268,247],{"class":184},[174,1270,701],{"class":184},[174,1272,1273],{"class":201},"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",[174,1275,682],{"class":184},[174,1277,258],{"class":184},[174,1279,1280,1282,1284,1286,1288,1290,1292,1294],{"class":176,"line":374},[174,1281,1261],{"class":184},[174,1283,298],{"class":1264},[174,1285,682],{"class":184},[174,1287,247],{"class":184},[174,1289,701],{"class":184},[174,1291,1046],{"class":201},[174,1293,682],{"class":184},[174,1295,258],{"class":184},[174,1297,1298,1300,1302,1304,1306,1308,1311,1313],{"class":176,"line":395},[174,1299,1261],{"class":184},[174,1301,306],{"class":1264},[174,1303,682],{"class":184},[174,1305,247],{"class":184},[174,1307,701],{"class":184},[174,1309,1310],{"class":201},"0xtransaction",[174,1312,682],{"class":184},[174,1314,258],{"class":184},[174,1316,1317,1319,1321,1323,1325,1327,1329],{"class":176,"line":400},[174,1318,1261],{"class":184},[174,1320,310],{"class":1264},[174,1322,682],{"class":184},[174,1324,247],{"class":184},[174,1326,701],{"class":184},[174,1328,1310],{"class":201},[174,1330,727],{"class":184},[174,1332,1333],{"class":176,"line":419},[174,1334,1335],{"class":184},"  }\n",[174,1337,1338],{"class":176,"line":437},[174,1339,656],{"class":184},[159,1341,1343],{"id":1342},"build-the-expected-message-in-tests","Build the expected message in tests",[143,1345,1346],{},"Use message builders when tests or previews need the exact signed text.",[164,1348,1351],{"className":166,"code":1349,"filename":1350,"language":169,"meta":170,"style":170},"import { buildNimiqCrossDeviceSignMessage } from '@onmax\u002Fcross-device-nimiq'\n\nconst message = buildNimiqCrossDeviceSignMessage({\n  appName: 'Nimiq Checkout',\n  origin: 'https:\u002F\u002Fpay.example.com',\n  orderId: 'order_123',\n  challengeId: 'challenge_123',\n  nonce: 'nonce_123',\n  issuedAt: '2026-01-01T00:00:00.000Z',\n  exp: '2026-01-01T00:02:00.000Z',\n  title: 'Approve order order_123',\n  summary: 'Sign the checkout payload for EUR 12.99.',\n  payloadHash: '7f83b1657ff1fc53b92dc18148a1d65dfa135a13926d73c8042d3a274d49f2fa',\n  resource: '\u002Forders\u002Forder_123',\n})\n","test\u002Fnimiq-message.test.ts",[147,1352,1353,1372,1376,1391,1405,1421,1436,1452,1468,1484,1500,1516,1532,1548,1564],{"__ignoreMap":170},[174,1354,1355,1357,1359,1362,1364,1366,1368,1370],{"class":176,"line":177},[174,1356,181],{"class":180},[174,1358,185],{"class":184},[174,1360,1361],{"class":188}," buildNimiqCrossDeviceSignMessage",[174,1363,192],{"class":184},[174,1365,195],{"class":180},[174,1367,198],{"class":184},[174,1369,149],{"class":201},[174,1371,205],{"class":184},[174,1373,1374],{"class":176,"line":208},[174,1375,212],{"emptyLinePlaceholder":211},[174,1377,1378,1380,1383,1385,1387,1389],{"class":176,"line":215},[174,1379,940],{"class":221},[174,1381,1382],{"class":188}," message ",[174,1384,228],{"class":184},[174,1386,1361],{"class":231},[174,1388,234],{"class":188},[174,1390,237],{"class":184},[174,1392,1393,1395,1397,1399,1401,1403],{"class":176,"line":240},[174,1394,264],{"class":243},[174,1396,247],{"class":184},[174,1398,198],{"class":184},[174,1400,271],{"class":201},[174,1402,255],{"class":184},[174,1404,258],{"class":184},[174,1406,1407,1410,1412,1414,1417,1419],{"class":176,"line":261},[174,1408,1409],{"class":243},"  origin",[174,1411,247],{"class":184},[174,1413,198],{"class":184},[174,1415,1416],{"class":201},"https:\u002F\u002Fpay.example.com",[174,1418,255],{"class":184},[174,1420,258],{"class":184},[174,1422,1423,1426,1428,1430,1432,1434],{"class":176,"line":278},[174,1424,1425],{"class":243},"  orderId",[174,1427,247],{"class":184},[174,1429,198],{"class":184},[174,1431,829],{"class":201},[174,1433,255],{"class":184},[174,1435,258],{"class":184},[174,1437,1438,1441,1443,1445,1448,1450],{"class":176,"line":374},[174,1439,1440],{"class":243},"  challengeId",[174,1442,247],{"class":184},[174,1444,198],{"class":184},[174,1446,1447],{"class":201},"challenge_123",[174,1449,255],{"class":184},[174,1451,258],{"class":184},[174,1453,1454,1457,1459,1461,1464,1466],{"class":176,"line":395},[174,1455,1456],{"class":243},"  nonce",[174,1458,247],{"class":184},[174,1460,198],{"class":184},[174,1462,1463],{"class":201},"nonce_123",[174,1465,255],{"class":184},[174,1467,258],{"class":184},[174,1469,1470,1473,1475,1477,1480,1482],{"class":176,"line":400},[174,1471,1472],{"class":243},"  issuedAt",[174,1474,247],{"class":184},[174,1476,198],{"class":184},[174,1478,1479],{"class":201},"2026-01-01T00:00:00.000Z",[174,1481,255],{"class":184},[174,1483,258],{"class":184},[174,1485,1486,1489,1491,1493,1496,1498],{"class":176,"line":419},[174,1487,1488],{"class":243},"  exp",[174,1490,247],{"class":184},[174,1492,198],{"class":184},[174,1494,1495],{"class":201},"2026-01-01T00:02:00.000Z",[174,1497,255],{"class":184},[174,1499,258],{"class":184},[174,1501,1502,1505,1507,1509,1512,1514],{"class":176,"line":437},[174,1503,1504],{"class":243},"  title",[174,1506,247],{"class":184},[174,1508,198],{"class":184},[174,1510,1511],{"class":201},"Approve order order_123",[174,1513,255],{"class":184},[174,1515,258],{"class":184},[174,1517,1518,1521,1523,1525,1528,1530],{"class":176,"line":459},[174,1519,1520],{"class":243},"  summary",[174,1522,247],{"class":184},[174,1524,198],{"class":184},[174,1526,1527],{"class":201},"Sign the checkout payload for EUR 12.99.",[174,1529,255],{"class":184},[174,1531,258],{"class":184},[174,1533,1534,1537,1539,1541,1544,1546],{"class":176,"line":485},[174,1535,1536],{"class":243},"  payloadHash",[174,1538,247],{"class":184},[174,1540,198],{"class":184},[174,1542,1543],{"class":201},"7f83b1657ff1fc53b92dc18148a1d65dfa135a13926d73c8042d3a274d49f2fa",[174,1545,255],{"class":184},[174,1547,258],{"class":184},[174,1549,1550,1553,1555,1557,1560,1562],{"class":176,"line":490},[174,1551,1552],{"class":243},"  resource",[174,1554,247],{"class":184},[174,1556,198],{"class":184},[174,1558,1559],{"class":201},"\u002Forders\u002Forder_123",[174,1561,255],{"class":184},[174,1563,258],{"class":184},[174,1565,1566,1568],{"class":176,"line":517},[174,1567,281],{"class":184},[174,1569,284],{"class":188},[143,1571,1572],{},"Available builders:",[1574,1575,1576,1582,1587,1592],"ul",{},[1577,1578,1579],"li",{},[147,1580,1581],{},"buildNimiqCrossDeviceLoginMessage()",[1577,1583,1584],{},[147,1585,1586],{},"buildNimiqCrossDeviceSignMessage()",[1577,1588,1589],{},[147,1590,1591],{},"buildNimiqCrossDeviceTransactionMessage()",[1577,1593,1594],{},[147,1595,1596],{},"buildNimiqCrossDeviceChallengeMessage()",[159,1598,1600],{"id":1599},"normalize-proof-fields","Normalize proof fields",[143,1602,1603],{},"Use normalizers at trust boundaries before storing or comparing proof fields.",[164,1605,1608],{"className":166,"code":1606,"filename":1607,"language":169,"meta":170,"style":170},"import { normalizeNimiqCrossDeviceProof } from '@onmax\u002Fcross-device-nimiq'\n\nconst proof = normalizeNimiqCrossDeviceProof({\n  publicKeyHex: request.publicKeyHex,\n  signatureHex: request.signatureHex,\n  address: request.address,\n})\n","server\u002Fproofs.ts",[147,1609,1610,1629,1633,1648,1664,1679,1694],{"__ignoreMap":170},[174,1611,1612,1614,1616,1619,1621,1623,1625,1627],{"class":176,"line":177},[174,1613,181],{"class":180},[174,1615,185],{"class":184},[174,1617,1618],{"class":188}," normalizeNimiqCrossDeviceProof",[174,1620,192],{"class":184},[174,1622,195],{"class":180},[174,1624,198],{"class":184},[174,1626,149],{"class":201},[174,1628,205],{"class":184},[174,1630,1631],{"class":176,"line":208},[174,1632,212],{"emptyLinePlaceholder":211},[174,1634,1635,1637,1640,1642,1644,1646],{"class":176,"line":215},[174,1636,940],{"class":221},[174,1638,1639],{"class":188}," proof ",[174,1641,228],{"class":184},[174,1643,1618],{"class":231},[174,1645,234],{"class":188},[174,1647,237],{"class":184},[174,1649,1650,1653,1655,1658,1660,1662],{"class":176,"line":240},[174,1651,1652],{"class":243},"  publicKeyHex",[174,1654,247],{"class":184},[174,1656,1657],{"class":188}," request",[174,1659,311],{"class":184},[174,1661,290],{"class":188},[174,1663,258],{"class":184},[174,1665,1666,1669,1671,1673,1675,1677],{"class":176,"line":261},[174,1667,1668],{"class":243},"  signatureHex",[174,1670,247],{"class":184},[174,1672,1657],{"class":188},[174,1674,311],{"class":184},[174,1676,294],{"class":188},[174,1678,258],{"class":184},[174,1680,1681,1684,1686,1688,1690,1692],{"class":176,"line":278},[174,1682,1683],{"class":243},"  address",[174,1685,247],{"class":184},[174,1687,1657],{"class":188},[174,1689,311],{"class":184},[174,1691,298],{"class":188},[174,1693,258],{"class":184},[174,1695,1696,1698],{"class":176,"line":374},[174,1697,281],{"class":184},[174,1699,284],{"class":188},[143,1701,1702],{},"These helpers keep phone-side approval code small and server verification deterministic.",[1704,1705,1706],"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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":170,"searchDepth":208,"depth":208,"links":1708},[1709,1710,1711,1712,1713,1714],{"id":161,"depth":208,"text":162},{"id":314,"depth":208,"text":315},{"id":734,"depth":208,"text":735},{"id":858,"depth":208,"text":859},{"id":1342,"depth":208,"text":1343},{"id":1599,"depth":208,"text":1600},"Verify Nimiq proofs for cross-device login, sign, and transaction orders.","md",null,{},{"title":72,"description":1715},"C4hkQwLRvYfOE2HTlBCEIGGysXSydXcPgMPmCUtDy-o",[1722,1724],{"title":68,"path":69,"stem":70,"description":1723,"children":-1},"Start login, sign, and transaction orders on one device and approve them on another.",{"title":76,"path":77,"stem":78,"description":1725,"children":-1},"Understand nonce, origin, proof, and session boundaries.",1778838253971]