[{"data":1,"prerenderedAt":2233},["ShallowReactive",2],{"navigation_docs":3,"-utilities-ledger":137,"-utilities-ledger-surround":2228},[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":94,"body":139,"description":2222,"extension":2223,"links":2224,"meta":2225,"navigation":230,"path":95,"seo":2226,"stem":96,"__hash__":2227},"docs\u002F4.utilities\u002F3.ledger.md",{"type":140,"value":141,"toc":2215},"minimark",[142,151,154,159,162,388,394,422,433,437,440,530,728,731,752,756,759,1018,1021,1241,1244,1253,1259,1263,1266,1472,1475,1623,1626,1630,1633,2175,2178,2198,2211],[143,144,145,146,150],"p",{},"Use ",[147,148,149],"code",{},"@onmax\u002Fbetter-auth-ledger"," for app-local credits, points, gems, coins, rewards, or internal usage balances tied to Better Auth users.",[143,152,153],{},"Do not use it for stored value, banking, cash-out, settlement, custody, or regulated balances. Keep Better Auth origin and CSRF protections enabled, and keep real-money payment and compliance logic in your application.",[155,156,158],"h2",{"id":157},"register-read-only-ledger-endpoints","Register read-only ledger endpoints",[143,160,161],{},"Use the server plugin when signed-in users should read their ledger account, balances, and entries.",[163,164,170],"pre",{"className":165,"code":166,"filename":167,"language":168,"meta":169,"style":169},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { betterAuth } from 'better-auth'\nimport { ledger } from '@onmax\u002Fbetter-auth-ledger'\n\nexport const auth = betterAuth({\n  plugins: [\n    ledger({\n      assets: [\n        'coin',\n        { id: 'gem', maxAmount: 10_000 },\n      ],\n      createAccountOnSignUp: true,\n    }),\n  ],\n})\n","server\u002Fauth.ts","ts","",[147,171,172,205,225,232,257,270,280,290,305,338,346,360,371,379],{"__ignoreMap":169},[173,174,177,181,185,189,192,195,198,202],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"s7zQu","import",[173,182,184],{"class":183},"sMK4o"," {",[173,186,188],{"class":187},"sTEyZ"," betterAuth",[173,190,191],{"class":183}," }",[173,193,194],{"class":179}," from",[173,196,197],{"class":183}," '",[173,199,201],{"class":200},"sfazB","better-auth",[173,203,204],{"class":183},"'\n",[173,206,208,210,212,215,217,219,221,223],{"class":175,"line":207},2,[173,209,180],{"class":179},[173,211,184],{"class":183},[173,213,214],{"class":187}," ledger",[173,216,191],{"class":183},[173,218,194],{"class":179},[173,220,197],{"class":183},[173,222,149],{"class":200},[173,224,204],{"class":183},[173,226,228],{"class":175,"line":227},3,[173,229,231],{"emptyLinePlaceholder":230},true,"\n",[173,233,235,238,242,245,248,251,254],{"class":175,"line":234},4,[173,236,237],{"class":179},"export",[173,239,241],{"class":240},"spNyl"," const",[173,243,244],{"class":187}," auth ",[173,246,247],{"class":183},"=",[173,249,188],{"class":250},"s2Zo4",[173,252,253],{"class":187},"(",[173,255,256],{"class":183},"{\n",[173,258,260,264,267],{"class":175,"line":259},5,[173,261,263],{"class":262},"swJcz","  plugins",[173,265,266],{"class":183},":",[173,268,269],{"class":187}," [\n",[173,271,273,276,278],{"class":175,"line":272},6,[173,274,275],{"class":250},"    ledger",[173,277,253],{"class":187},[173,279,256],{"class":183},[173,281,283,286,288],{"class":175,"line":282},7,[173,284,285],{"class":262},"      assets",[173,287,266],{"class":183},[173,289,269],{"class":187},[173,291,293,296,299,302],{"class":175,"line":292},8,[173,294,295],{"class":183},"        '",[173,297,298],{"class":200},"coin",[173,300,301],{"class":183},"'",[173,303,304],{"class":183},",\n",[173,306,308,311,314,316,318,321,323,326,329,331,335],{"class":175,"line":307},9,[173,309,310],{"class":183},"        {",[173,312,313],{"class":262}," id",[173,315,266],{"class":183},[173,317,197],{"class":183},[173,319,320],{"class":200},"gem",[173,322,301],{"class":183},[173,324,325],{"class":183},",",[173,327,328],{"class":262}," maxAmount",[173,330,266],{"class":183},[173,332,334],{"class":333},"sbssI"," 10_000",[173,336,337],{"class":183}," },\n",[173,339,341,344],{"class":175,"line":340},10,[173,342,343],{"class":187},"      ]",[173,345,304],{"class":183},[173,347,349,352,354,358],{"class":175,"line":348},11,[173,350,351],{"class":262},"      createAccountOnSignUp",[173,353,266],{"class":183},[173,355,357],{"class":356},"sfNiH"," true",[173,359,304],{"class":183},[173,361,363,366,369],{"class":175,"line":362},12,[173,364,365],{"class":183},"    }",[173,367,368],{"class":187},")",[173,370,304],{"class":183},[173,372,374,377],{"class":175,"line":373},13,[173,375,376],{"class":187},"  ]",[173,378,304],{"class":183},[173,380,382,385],{"class":175,"line":381},14,[173,383,384],{"class":183},"}",[173,386,387],{"class":187},")\n",[143,389,390,391,266],{},"This exposes authenticated endpoints under ",[147,392,393],{},"\u002Fledger",[163,395,400],{"className":396,"code":397,"filename":398,"language":399,"meta":169,"style":169},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GET  \u002Fledger\u002Faccount\nGET  \u002Fledger\u002Fbalance\nGET  \u002Fledger\u002Fbalance?asset=coin\nGET  \u002Fledger\u002Fentries?asset=coin&limit=50\n","endpoints","txt",[147,401,402,407,412,417],{"__ignoreMap":169},[173,403,404],{"class":175,"line":176},[173,405,406],{},"GET  \u002Fledger\u002Faccount\n",[173,408,409],{"class":175,"line":207},[173,410,411],{},"GET  \u002Fledger\u002Fbalance\n",[173,413,414],{"class":175,"line":227},[173,415,416],{},"GET  \u002Fledger\u002Fbalance?asset=coin\n",[173,418,419],{"class":175,"line":234},[173,420,421],{},"GET  \u002Fledger\u002Fentries?asset=coin&limit=50\n",[143,423,424,425,428,429,432],{},"Mutation endpoints exist, but they are disabled unless you opt in with ",[147,426,427],{},"enableMutations"," and ",[147,430,431],{},"authorizeMutation",".",[155,434,436],{"id":435},"register-the-client-plugin","Register the client plugin",[143,438,439],{},"Use the client plugin when app UI should call the read endpoints through the Better Auth client.",[163,441,444],{"className":165,"code":442,"filename":443,"language":168,"meta":169,"style":169},"import { createAuthClient } from 'better-auth\u002Fclient'\nimport { ledgerClient } from '@onmax\u002Fbetter-auth-ledger\u002Fclient'\n\nexport const authClient = createAuthClient({\n  plugins: [ledgerClient()],\n})\n","app\u002Fauth-client.ts",[147,445,446,466,486,490,507,524],{"__ignoreMap":169},[173,447,448,450,452,455,457,459,461,464],{"class":175,"line":176},[173,449,180],{"class":179},[173,451,184],{"class":183},[173,453,454],{"class":187}," createAuthClient",[173,456,191],{"class":183},[173,458,194],{"class":179},[173,460,197],{"class":183},[173,462,463],{"class":200},"better-auth\u002Fclient",[173,465,204],{"class":183},[173,467,468,470,472,475,477,479,481,484],{"class":175,"line":207},[173,469,180],{"class":179},[173,471,184],{"class":183},[173,473,474],{"class":187}," ledgerClient",[173,476,191],{"class":183},[173,478,194],{"class":179},[173,480,197],{"class":183},[173,482,483],{"class":200},"@onmax\u002Fbetter-auth-ledger\u002Fclient",[173,485,204],{"class":183},[173,487,488],{"class":175,"line":227},[173,489,231],{"emptyLinePlaceholder":230},[173,491,492,494,496,499,501,503,505],{"class":175,"line":234},[173,493,237],{"class":179},[173,495,241],{"class":240},[173,497,498],{"class":187}," authClient ",[173,500,247],{"class":183},[173,502,454],{"class":250},[173,504,253],{"class":187},[173,506,256],{"class":183},[173,508,509,511,513,516,519,522],{"class":175,"line":259},[173,510,263],{"class":262},[173,512,266],{"class":183},[173,514,515],{"class":187}," [",[173,517,518],{"class":250},"ledgerClient",[173,520,521],{"class":187},"()]",[173,523,304],{"class":183},[173,525,526,528],{"class":175,"line":272},[173,527,384],{"class":183},[173,529,387],{"class":187},[163,531,534],{"className":165,"code":532,"filename":533,"language":168,"meta":169,"style":169},"import { authClient } from '.\u002Fauth-client'\n\nconst account = await authClient.ledger.account()\nconst balances = await authClient.ledger.balance()\nconst coinEntries = await authClient.ledger.entries({\n  asset: 'coin',\n  limit: 25,\n})\n\nconsole.log(account.status)\nconsole.table(balances)\nconsole.log(coinEntries[0]?.reason)\n","app\u002Fload-wallet-panel.ts",[147,535,536,556,560,588,612,638,653,665,671,675,693,705],{"__ignoreMap":169},[173,537,538,540,542,545,547,549,551,554],{"class":175,"line":176},[173,539,180],{"class":179},[173,541,184],{"class":183},[173,543,544],{"class":187}," authClient",[173,546,191],{"class":183},[173,548,194],{"class":179},[173,550,197],{"class":183},[173,552,553],{"class":200},".\u002Fauth-client",[173,555,204],{"class":183},[173,557,558],{"class":175,"line":207},[173,559,231],{"emptyLinePlaceholder":230},[173,561,562,565,568,570,573,575,577,580,582,585],{"class":175,"line":227},[173,563,564],{"class":240},"const",[173,566,567],{"class":187}," account ",[173,569,247],{"class":183},[173,571,572],{"class":179}," await",[173,574,544],{"class":187},[173,576,432],{"class":183},[173,578,579],{"class":187},"ledger",[173,581,432],{"class":183},[173,583,584],{"class":250},"account",[173,586,587],{"class":187},"()\n",[173,589,590,592,595,597,599,601,603,605,607,610],{"class":175,"line":234},[173,591,564],{"class":240},[173,593,594],{"class":187}," balances ",[173,596,247],{"class":183},[173,598,572],{"class":179},[173,600,544],{"class":187},[173,602,432],{"class":183},[173,604,579],{"class":187},[173,606,432],{"class":183},[173,608,609],{"class":250},"balance",[173,611,587],{"class":187},[173,613,614,616,619,621,623,625,627,629,631,634,636],{"class":175,"line":259},[173,615,564],{"class":240},[173,617,618],{"class":187}," coinEntries ",[173,620,247],{"class":183},[173,622,572],{"class":179},[173,624,544],{"class":187},[173,626,432],{"class":183},[173,628,579],{"class":187},[173,630,432],{"class":183},[173,632,633],{"class":250},"entries",[173,635,253],{"class":187},[173,637,256],{"class":183},[173,639,640,643,645,647,649,651],{"class":175,"line":272},[173,641,642],{"class":262},"  asset",[173,644,266],{"class":183},[173,646,197],{"class":183},[173,648,298],{"class":200},[173,650,301],{"class":183},[173,652,304],{"class":183},[173,654,655,658,660,663],{"class":175,"line":282},[173,656,657],{"class":262},"  limit",[173,659,266],{"class":183},[173,661,662],{"class":333}," 25",[173,664,304],{"class":183},[173,666,667,669],{"class":175,"line":292},[173,668,384],{"class":183},[173,670,387],{"class":187},[173,672,673],{"class":175,"line":307},[173,674,231],{"emptyLinePlaceholder":230},[173,676,677,680,682,685,688,690],{"class":175,"line":340},[173,678,679],{"class":187},"console",[173,681,432],{"class":183},[173,683,684],{"class":250},"log",[173,686,687],{"class":187},"(account",[173,689,432],{"class":183},[173,691,692],{"class":187},"status)\n",[173,694,695,697,699,702],{"class":175,"line":348},[173,696,679],{"class":187},[173,698,432],{"class":183},[173,700,701],{"class":250},"table",[173,703,704],{"class":187},"(balances)\n",[173,706,707,709,711,713,716,719,722,725],{"class":175,"line":362},[173,708,679],{"class":187},[173,710,432],{"class":183},[173,712,684],{"class":250},[173,714,715],{"class":187},"(coinEntries[",[173,717,718],{"class":333},"0",[173,720,721],{"class":187},"]",[173,723,724],{"class":183},"?.",[173,726,727],{"class":187},"reason)\n",[143,729,730],{},"Expected behavior for a new user:",[163,732,735],{"className":396,"code":733,"filename":734,"language":399,"meta":169,"style":169},"active\nasset  available  reserved\ncoin   0          0\n","output",[147,736,737,742,747],{"__ignoreMap":169},[173,738,739],{"class":175,"line":176},[173,740,741],{},"active\n",[173,743,744],{"class":175,"line":207},[173,745,746],{},"asset  available  reserved\n",[173,748,749],{"class":175,"line":227},[173,750,751],{},"coin   0          0\n",[155,753,755],{"id":754},"move-mutations-behind-a-server-decision","Move mutations behind a server decision",[143,757,758],{},"Use mutation endpoints only when your server can authorize the operation from trusted context.",[163,760,762],{"className":165,"code":761,"filename":167,"language":168,"meta":169,"style":169},"import { betterAuth } from 'better-auth'\nimport { ledger } from '@onmax\u002Fbetter-auth-ledger'\n\nexport const auth = betterAuth({\n  plugins: [\n    ledger({\n      assets: ['coin'],\n      enableMutations: true,\n      authorizeMutation: async (ctx, input) => {\n        const session = (ctx as any).context?.session\n        const role = session?.user?.role\n\n        return input.operation === 'credit' && role === 'admin'\n      },\n    }),\n  ],\n})\n",[147,763,764,782,800,804,820,828,836,854,865,895,929,950,954,990,995,1004,1011],{"__ignoreMap":169},[173,765,766,768,770,772,774,776,778,780],{"class":175,"line":176},[173,767,180],{"class":179},[173,769,184],{"class":183},[173,771,188],{"class":187},[173,773,191],{"class":183},[173,775,194],{"class":179},[173,777,197],{"class":183},[173,779,201],{"class":200},[173,781,204],{"class":183},[173,783,784,786,788,790,792,794,796,798],{"class":175,"line":207},[173,785,180],{"class":179},[173,787,184],{"class":183},[173,789,214],{"class":187},[173,791,191],{"class":183},[173,793,194],{"class":179},[173,795,197],{"class":183},[173,797,149],{"class":200},[173,799,204],{"class":183},[173,801,802],{"class":175,"line":227},[173,803,231],{"emptyLinePlaceholder":230},[173,805,806,808,810,812,814,816,818],{"class":175,"line":234},[173,807,237],{"class":179},[173,809,241],{"class":240},[173,811,244],{"class":187},[173,813,247],{"class":183},[173,815,188],{"class":250},[173,817,253],{"class":187},[173,819,256],{"class":183},[173,821,822,824,826],{"class":175,"line":259},[173,823,263],{"class":262},[173,825,266],{"class":183},[173,827,269],{"class":187},[173,829,830,832,834],{"class":175,"line":272},[173,831,275],{"class":250},[173,833,253],{"class":187},[173,835,256],{"class":183},[173,837,838,840,842,844,846,848,850,852],{"class":175,"line":282},[173,839,285],{"class":262},[173,841,266],{"class":183},[173,843,515],{"class":187},[173,845,301],{"class":183},[173,847,298],{"class":200},[173,849,301],{"class":183},[173,851,721],{"class":187},[173,853,304],{"class":183},[173,855,856,859,861,863],{"class":175,"line":292},[173,857,858],{"class":262},"      enableMutations",[173,860,266],{"class":183},[173,862,357],{"class":356},[173,864,304],{"class":183},[173,866,867,870,872,875,878,882,884,887,889,892],{"class":175,"line":307},[173,868,869],{"class":250},"      authorizeMutation",[173,871,266],{"class":183},[173,873,874],{"class":240}," async",[173,876,877],{"class":183}," (",[173,879,881],{"class":880},"sHdIc","ctx",[173,883,325],{"class":183},[173,885,886],{"class":880}," input",[173,888,368],{"class":183},[173,890,891],{"class":240}," =>",[173,893,894],{"class":183}," {\n",[173,896,897,900,903,906,908,910,913,917,919,921,924,926],{"class":175,"line":340},[173,898,899],{"class":240},"        const",[173,901,902],{"class":187}," session",[173,904,905],{"class":183}," =",[173,907,877],{"class":262},[173,909,881],{"class":187},[173,911,912],{"class":179}," as",[173,914,916],{"class":915},"sBMFI"," any",[173,918,368],{"class":262},[173,920,432],{"class":183},[173,922,923],{"class":187},"context",[173,925,724],{"class":183},[173,927,928],{"class":187},"session\n",[173,930,931,933,936,938,940,942,945,947],{"class":175,"line":348},[173,932,899],{"class":240},[173,934,935],{"class":187}," role",[173,937,905],{"class":183},[173,939,902],{"class":187},[173,941,724],{"class":183},[173,943,944],{"class":187},"user",[173,946,724],{"class":183},[173,948,949],{"class":187},"role\n",[173,951,952],{"class":175,"line":362},[173,953,231],{"emptyLinePlaceholder":230},[173,955,956,959,961,963,966,969,971,974,976,979,981,983,985,988],{"class":175,"line":373},[173,957,958],{"class":179},"        return",[173,960,886],{"class":187},[173,962,432],{"class":183},[173,964,965],{"class":187},"operation",[173,967,968],{"class":183}," ===",[173,970,197],{"class":183},[173,972,973],{"class":200},"credit",[173,975,301],{"class":183},[173,977,978],{"class":183}," &&",[173,980,935],{"class":187},[173,982,968],{"class":183},[173,984,197],{"class":183},[173,986,987],{"class":200},"admin",[173,989,204],{"class":183},[173,991,992],{"class":175,"line":381},[173,993,994],{"class":183},"      },\n",[173,996,998,1000,1002],{"class":175,"line":997},15,[173,999,365],{"class":183},[173,1001,368],{"class":187},[173,1003,304],{"class":183},[173,1005,1007,1009],{"class":175,"line":1006},16,[173,1008,376],{"class":187},[173,1010,304],{"class":183},[173,1012,1014,1016],{"class":175,"line":1013},17,[173,1015,384],{"class":183},[173,1017,387],{"class":187},[143,1019,1020],{},"Every mutation body needs an asset, amount, reason, and idempotency key.",[163,1022,1025],{"className":165,"code":1023,"filename":1024,"language":168,"meta":169,"style":169},"const result = await fetch('\u002Fapi\u002Fauth\u002Fledger\u002Fcredit', {\n  method: 'POST',\n  headers: { 'content-type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    userId: 'user-123',\n    asset: 'coin',\n    amount: 100,\n    reason: 'daily-reward',\n    idempotencyKey: 'daily-reward:user-123:2026-05-06',\n    reference: 'daily-reward:2026-05-06',\n  }),\n})\n\nconsole.log(result.status)\n","server\u002Freward-user.ts",[147,1026,1027,1054,1070,1097,1116,1132,1147,1159,1175,1191,1207,1216,1222,1226],{"__ignoreMap":169},[173,1028,1029,1031,1034,1036,1038,1041,1043,1045,1048,1050,1052],{"class":175,"line":176},[173,1030,564],{"class":240},[173,1032,1033],{"class":187}," result ",[173,1035,247],{"class":183},[173,1037,572],{"class":179},[173,1039,1040],{"class":250}," fetch",[173,1042,253],{"class":187},[173,1044,301],{"class":183},[173,1046,1047],{"class":200},"\u002Fapi\u002Fauth\u002Fledger\u002Fcredit",[173,1049,301],{"class":183},[173,1051,325],{"class":183},[173,1053,894],{"class":183},[173,1055,1056,1059,1061,1063,1066,1068],{"class":175,"line":207},[173,1057,1058],{"class":262},"  method",[173,1060,266],{"class":183},[173,1062,197],{"class":183},[173,1064,1065],{"class":200},"POST",[173,1067,301],{"class":183},[173,1069,304],{"class":183},[173,1071,1072,1075,1077,1079,1081,1084,1086,1088,1090,1093,1095],{"class":175,"line":227},[173,1073,1074],{"class":262},"  headers",[173,1076,266],{"class":183},[173,1078,184],{"class":183},[173,1080,197],{"class":183},[173,1082,1083],{"class":262},"content-type",[173,1085,301],{"class":183},[173,1087,266],{"class":183},[173,1089,197],{"class":183},[173,1091,1092],{"class":200},"application\u002Fjson",[173,1094,301],{"class":183},[173,1096,337],{"class":183},[173,1098,1099,1102,1104,1107,1109,1112,1114],{"class":175,"line":234},[173,1100,1101],{"class":262},"  body",[173,1103,266],{"class":183},[173,1105,1106],{"class":187}," JSON",[173,1108,432],{"class":183},[173,1110,1111],{"class":250},"stringify",[173,1113,253],{"class":187},[173,1115,256],{"class":183},[173,1117,1118,1121,1123,1125,1128,1130],{"class":175,"line":259},[173,1119,1120],{"class":262},"    userId",[173,1122,266],{"class":183},[173,1124,197],{"class":183},[173,1126,1127],{"class":200},"user-123",[173,1129,301],{"class":183},[173,1131,304],{"class":183},[173,1133,1134,1137,1139,1141,1143,1145],{"class":175,"line":272},[173,1135,1136],{"class":262},"    asset",[173,1138,266],{"class":183},[173,1140,197],{"class":183},[173,1142,298],{"class":200},[173,1144,301],{"class":183},[173,1146,304],{"class":183},[173,1148,1149,1152,1154,1157],{"class":175,"line":282},[173,1150,1151],{"class":262},"    amount",[173,1153,266],{"class":183},[173,1155,1156],{"class":333}," 100",[173,1158,304],{"class":183},[173,1160,1161,1164,1166,1168,1171,1173],{"class":175,"line":292},[173,1162,1163],{"class":262},"    reason",[173,1165,266],{"class":183},[173,1167,197],{"class":183},[173,1169,1170],{"class":200},"daily-reward",[173,1172,301],{"class":183},[173,1174,304],{"class":183},[173,1176,1177,1180,1182,1184,1187,1189],{"class":175,"line":307},[173,1178,1179],{"class":262},"    idempotencyKey",[173,1181,266],{"class":183},[173,1183,197],{"class":183},[173,1185,1186],{"class":200},"daily-reward:user-123:2026-05-06",[173,1188,301],{"class":183},[173,1190,304],{"class":183},[173,1192,1193,1196,1198,1200,1203,1205],{"class":175,"line":340},[173,1194,1195],{"class":262},"    reference",[173,1197,266],{"class":183},[173,1199,197],{"class":183},[173,1201,1202],{"class":200},"daily-reward:2026-05-06",[173,1204,301],{"class":183},[173,1206,304],{"class":183},[173,1208,1209,1212,1214],{"class":175,"line":348},[173,1210,1211],{"class":183},"  }",[173,1213,368],{"class":187},[173,1215,304],{"class":183},[173,1217,1218,1220],{"class":175,"line":362},[173,1219,384],{"class":183},[173,1221,387],{"class":187},[173,1223,1224],{"class":175,"line":373},[173,1225,231],{"emptyLinePlaceholder":230},[173,1227,1228,1230,1232,1234,1237,1239],{"class":175,"line":381},[173,1229,679],{"class":187},[173,1231,432],{"class":183},[173,1233,684],{"class":250},[173,1235,1236],{"class":187},"(result",[173,1238,432],{"class":183},[173,1240,692],{"class":187},[143,1242,1243],{},"Expected behavior:",[163,1245,1247],{"className":396,"code":1246,"filename":734,"language":399,"meta":169,"style":169},"200\n",[147,1248,1249],{"__ignoreMap":169},[173,1250,1251],{"class":175,"line":176},[173,1252,1246],{},[143,1254,1255,1256,432],{},"If mutations are not enabled, the same request fails closed with ",[147,1257,1258],{},"Ledger mutation endpoints are disabled",[155,1260,1262],{"id":1261},"use-service-helpers-in-trusted-jobs","Use service helpers in trusted jobs",[143,1264,1265],{},"Use root service helpers when a backend job already has a Better Auth adapter and should avoid HTTP.",[163,1267,1270],{"className":165,"code":1268,"filename":1269,"language":168,"meta":169,"style":169},"import type { LedgerAdapter } from '@onmax\u002Fbetter-auth-ledger'\nimport { creditLedger } from '@onmax\u002Fbetter-auth-ledger'\n\nexport async function rewardDailyLogin(adapter: LedgerAdapter, userId: string) {\n  return await creditLedger(adapter, {\n    assets: ['coin'],\n    userId,\n    asset: 'coin',\n    amount: 100,\n    reason: 'daily-login',\n    idempotencyKey: `daily-login:${userId}:2026-05-06`,\n  })\n}\n","server\u002Fjobs\u002Freward.ts",[147,1271,1272,1294,1313,1317,1352,1369,1388,1394,1408,1418,1433,1461,1467],{"__ignoreMap":169},[173,1273,1274,1276,1279,1281,1284,1286,1288,1290,1292],{"class":175,"line":176},[173,1275,180],{"class":179},[173,1277,1278],{"class":179}," type",[173,1280,184],{"class":183},[173,1282,1283],{"class":187}," LedgerAdapter",[173,1285,191],{"class":183},[173,1287,194],{"class":179},[173,1289,197],{"class":183},[173,1291,149],{"class":200},[173,1293,204],{"class":183},[173,1295,1296,1298,1300,1303,1305,1307,1309,1311],{"class":175,"line":207},[173,1297,180],{"class":179},[173,1299,184],{"class":183},[173,1301,1302],{"class":187}," creditLedger",[173,1304,191],{"class":183},[173,1306,194],{"class":179},[173,1308,197],{"class":183},[173,1310,149],{"class":200},[173,1312,204],{"class":183},[173,1314,1315],{"class":175,"line":227},[173,1316,231],{"emptyLinePlaceholder":230},[173,1318,1319,1321,1323,1326,1329,1331,1334,1336,1338,1340,1343,1345,1348,1350],{"class":175,"line":234},[173,1320,237],{"class":179},[173,1322,874],{"class":240},[173,1324,1325],{"class":240}," function",[173,1327,1328],{"class":250}," rewardDailyLogin",[173,1330,253],{"class":183},[173,1332,1333],{"class":880},"adapter",[173,1335,266],{"class":183},[173,1337,1283],{"class":915},[173,1339,325],{"class":183},[173,1341,1342],{"class":880}," userId",[173,1344,266],{"class":183},[173,1346,1347],{"class":915}," string",[173,1349,368],{"class":183},[173,1351,894],{"class":183},[173,1353,1354,1357,1359,1361,1363,1365,1367],{"class":175,"line":259},[173,1355,1356],{"class":179},"  return",[173,1358,572],{"class":179},[173,1360,1302],{"class":250},[173,1362,253],{"class":262},[173,1364,1333],{"class":187},[173,1366,325],{"class":183},[173,1368,894],{"class":183},[173,1370,1371,1374,1376,1378,1380,1382,1384,1386],{"class":175,"line":272},[173,1372,1373],{"class":262},"    assets",[173,1375,266],{"class":183},[173,1377,515],{"class":262},[173,1379,301],{"class":183},[173,1381,298],{"class":200},[173,1383,301],{"class":183},[173,1385,721],{"class":262},[173,1387,304],{"class":183},[173,1389,1390,1392],{"class":175,"line":282},[173,1391,1120],{"class":187},[173,1393,304],{"class":183},[173,1395,1396,1398,1400,1402,1404,1406],{"class":175,"line":292},[173,1397,1136],{"class":262},[173,1399,266],{"class":183},[173,1401,197],{"class":183},[173,1403,298],{"class":200},[173,1405,301],{"class":183},[173,1407,304],{"class":183},[173,1409,1410,1412,1414,1416],{"class":175,"line":307},[173,1411,1151],{"class":262},[173,1413,266],{"class":183},[173,1415,1156],{"class":333},[173,1417,304],{"class":183},[173,1419,1420,1422,1424,1426,1429,1431],{"class":175,"line":340},[173,1421,1163],{"class":262},[173,1423,266],{"class":183},[173,1425,197],{"class":183},[173,1427,1428],{"class":200},"daily-login",[173,1430,301],{"class":183},[173,1432,304],{"class":183},[173,1434,1435,1437,1439,1442,1445,1448,1451,1453,1456,1459],{"class":175,"line":348},[173,1436,1179],{"class":262},[173,1438,266],{"class":183},[173,1440,1441],{"class":183}," `",[173,1443,1444],{"class":200},"daily-login:",[173,1446,1447],{"class":183},"${",[173,1449,1450],{"class":187},"userId",[173,1452,384],{"class":183},[173,1454,1455],{"class":200},":2026-05-06",[173,1457,1458],{"class":183},"`",[173,1460,304],{"class":183},[173,1462,1463,1465],{"class":175,"line":362},[173,1464,1211],{"class":183},[173,1466,387],{"class":262},[173,1468,1469],{"class":175,"line":373},[173,1470,1471],{"class":183},"}\n",[143,1473,1474],{},"Expected result shape:",[163,1476,1481],{"className":1477,"code":1478,"filename":1479,"language":1480,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"balance\": {\n    \"asset\": \"coin\",\n    \"available\": \"100\",\n    \"reserved\": \"0\"\n  },\n  \"entry\": {\n    \"type\": \"credit\",\n    \"reason\": \"daily-login\"\n  }\n}\n","result.json","json",[147,1482,1483,1487,1501,1522,1542,1560,1565,1578,1597,1614,1619],{"__ignoreMap":169},[173,1484,1485],{"class":175,"line":176},[173,1486,256],{"class":183},[173,1488,1489,1492,1494,1497,1499],{"class":175,"line":207},[173,1490,1491],{"class":183},"  \"",[173,1493,609],{"class":240},[173,1495,1496],{"class":183},"\"",[173,1498,266],{"class":183},[173,1500,894],{"class":183},[173,1502,1503,1506,1509,1511,1513,1516,1518,1520],{"class":175,"line":227},[173,1504,1505],{"class":183},"    \"",[173,1507,1508],{"class":915},"asset",[173,1510,1496],{"class":183},[173,1512,266],{"class":183},[173,1514,1515],{"class":183}," \"",[173,1517,298],{"class":200},[173,1519,1496],{"class":183},[173,1521,304],{"class":183},[173,1523,1524,1526,1529,1531,1533,1535,1538,1540],{"class":175,"line":234},[173,1525,1505],{"class":183},[173,1527,1528],{"class":915},"available",[173,1530,1496],{"class":183},[173,1532,266],{"class":183},[173,1534,1515],{"class":183},[173,1536,1537],{"class":200},"100",[173,1539,1496],{"class":183},[173,1541,304],{"class":183},[173,1543,1544,1546,1549,1551,1553,1555,1557],{"class":175,"line":259},[173,1545,1505],{"class":183},[173,1547,1548],{"class":915},"reserved",[173,1550,1496],{"class":183},[173,1552,266],{"class":183},[173,1554,1515],{"class":183},[173,1556,718],{"class":200},[173,1558,1559],{"class":183},"\"\n",[173,1561,1562],{"class":175,"line":272},[173,1563,1564],{"class":183},"  },\n",[173,1566,1567,1569,1572,1574,1576],{"class":175,"line":282},[173,1568,1491],{"class":183},[173,1570,1571],{"class":240},"entry",[173,1573,1496],{"class":183},[173,1575,266],{"class":183},[173,1577,894],{"class":183},[173,1579,1580,1582,1585,1587,1589,1591,1593,1595],{"class":175,"line":292},[173,1581,1505],{"class":183},[173,1583,1584],{"class":915},"type",[173,1586,1496],{"class":183},[173,1588,266],{"class":183},[173,1590,1515],{"class":183},[173,1592,973],{"class":200},[173,1594,1496],{"class":183},[173,1596,304],{"class":183},[173,1598,1599,1601,1604,1606,1608,1610,1612],{"class":175,"line":307},[173,1600,1505],{"class":183},[173,1602,1603],{"class":915},"reason",[173,1605,1496],{"class":183},[173,1607,266],{"class":183},[173,1609,1515],{"class":183},[173,1611,1428],{"class":200},[173,1613,1559],{"class":183},[173,1615,1616],{"class":175,"line":340},[173,1617,1618],{"class":183},"  }\n",[173,1620,1621],{"class":175,"line":348},[173,1622,1471],{"class":183},[143,1624,1625],{},"Use unique idempotency keys per logical mutation. Reusing a key with the same input returns the stored result; reusing it with different input fails with an idempotency conflict.",[155,1627,1629],{"id":1628},"reserve-before-capture","Reserve before capture",[143,1631,1632],{},"Use reservations when an action needs to hold balance while another step completes.",[163,1634,1637],{"className":165,"code":1635,"filename":1636,"language":168,"meta":169,"style":169},"import type { LedgerAdapter } from '@onmax\u002Fbetter-auth-ledger'\nimport {\n  captureLedgerReservation,\n  releaseLedgerReservation,\n  reserveLedger,\n} from '@onmax\u002Fbetter-auth-ledger'\n\nexport async function reservePurchase(adapter: LedgerAdapter, userId: string) {\n  const reserved = await reserveLedger(adapter, {\n    assets: ['coin'],\n    userId,\n    asset: 'coin',\n    amount: 25,\n    reason: 'shop-purchase',\n    idempotencyKey: `reserve:purchase-123`,\n    reference: 'purchase-123',\n  })\n\n  return reserved.reservation!.id\n}\n\nexport async function finishPurchase(adapter: LedgerAdapter, userId: string, reservationId: string) {\n  return await captureLedgerReservation(adapter, {\n    assets: ['coin'],\n    userId,\n    reservationId,\n    reason: 'shop-purchase-captured',\n    idempotencyKey: `capture:${reservationId}`,\n  })\n}\n\nexport async function cancelPurchase(adapter: LedgerAdapter, userId: string, reservationId: string) {\n  return await releaseLedgerReservation(adapter, {\n    assets: ['coin'],\n    userId,\n    reservationId,\n    reason: 'shop-purchase-cancelled',\n    idempotencyKey: `release:${reservationId}`,\n  })\n}\n","server\u002Fjobs\u002Fshop.ts",[147,1638,1639,1659,1665,1672,1679,1686,1698,1702,1733,1756,1774,1780,1794,1804,1819,1834,1849,1855,1860,1878,1883,1888,1929,1947,1966,1973,1981,1997,2019,2026,2031,2036,2076,2094,2113,2120,2127,2143,2163,2170],{"__ignoreMap":169},[173,1640,1641,1643,1645,1647,1649,1651,1653,1655,1657],{"class":175,"line":176},[173,1642,180],{"class":179},[173,1644,1278],{"class":179},[173,1646,184],{"class":183},[173,1648,1283],{"class":187},[173,1650,191],{"class":183},[173,1652,194],{"class":179},[173,1654,197],{"class":183},[173,1656,149],{"class":200},[173,1658,204],{"class":183},[173,1660,1661,1663],{"class":175,"line":207},[173,1662,180],{"class":179},[173,1664,894],{"class":183},[173,1666,1667,1670],{"class":175,"line":227},[173,1668,1669],{"class":187},"  captureLedgerReservation",[173,1671,304],{"class":183},[173,1673,1674,1677],{"class":175,"line":234},[173,1675,1676],{"class":187},"  releaseLedgerReservation",[173,1678,304],{"class":183},[173,1680,1681,1684],{"class":175,"line":259},[173,1682,1683],{"class":187},"  reserveLedger",[173,1685,304],{"class":183},[173,1687,1688,1690,1692,1694,1696],{"class":175,"line":272},[173,1689,384],{"class":183},[173,1691,194],{"class":179},[173,1693,197],{"class":183},[173,1695,149],{"class":200},[173,1697,204],{"class":183},[173,1699,1700],{"class":175,"line":282},[173,1701,231],{"emptyLinePlaceholder":230},[173,1703,1704,1706,1708,1710,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731],{"class":175,"line":292},[173,1705,237],{"class":179},[173,1707,874],{"class":240},[173,1709,1325],{"class":240},[173,1711,1712],{"class":250}," reservePurchase",[173,1714,253],{"class":183},[173,1716,1333],{"class":880},[173,1718,266],{"class":183},[173,1720,1283],{"class":915},[173,1722,325],{"class":183},[173,1724,1342],{"class":880},[173,1726,266],{"class":183},[173,1728,1347],{"class":915},[173,1730,368],{"class":183},[173,1732,894],{"class":183},[173,1734,1735,1738,1741,1743,1745,1748,1750,1752,1754],{"class":175,"line":307},[173,1736,1737],{"class":240},"  const",[173,1739,1740],{"class":187}," reserved",[173,1742,905],{"class":183},[173,1744,572],{"class":179},[173,1746,1747],{"class":250}," reserveLedger",[173,1749,253],{"class":262},[173,1751,1333],{"class":187},[173,1753,325],{"class":183},[173,1755,894],{"class":183},[173,1757,1758,1760,1762,1764,1766,1768,1770,1772],{"class":175,"line":340},[173,1759,1373],{"class":262},[173,1761,266],{"class":183},[173,1763,515],{"class":262},[173,1765,301],{"class":183},[173,1767,298],{"class":200},[173,1769,301],{"class":183},[173,1771,721],{"class":262},[173,1773,304],{"class":183},[173,1775,1776,1778],{"class":175,"line":348},[173,1777,1120],{"class":187},[173,1779,304],{"class":183},[173,1781,1782,1784,1786,1788,1790,1792],{"class":175,"line":362},[173,1783,1136],{"class":262},[173,1785,266],{"class":183},[173,1787,197],{"class":183},[173,1789,298],{"class":200},[173,1791,301],{"class":183},[173,1793,304],{"class":183},[173,1795,1796,1798,1800,1802],{"class":175,"line":373},[173,1797,1151],{"class":262},[173,1799,266],{"class":183},[173,1801,662],{"class":333},[173,1803,304],{"class":183},[173,1805,1806,1808,1810,1812,1815,1817],{"class":175,"line":381},[173,1807,1163],{"class":262},[173,1809,266],{"class":183},[173,1811,197],{"class":183},[173,1813,1814],{"class":200},"shop-purchase",[173,1816,301],{"class":183},[173,1818,304],{"class":183},[173,1820,1821,1823,1825,1827,1830,1832],{"class":175,"line":997},[173,1822,1179],{"class":262},[173,1824,266],{"class":183},[173,1826,1441],{"class":183},[173,1828,1829],{"class":200},"reserve:purchase-123",[173,1831,1458],{"class":183},[173,1833,304],{"class":183},[173,1835,1836,1838,1840,1842,1845,1847],{"class":175,"line":1006},[173,1837,1195],{"class":262},[173,1839,266],{"class":183},[173,1841,197],{"class":183},[173,1843,1844],{"class":200},"purchase-123",[173,1846,301],{"class":183},[173,1848,304],{"class":183},[173,1850,1851,1853],{"class":175,"line":1013},[173,1852,1211],{"class":183},[173,1854,387],{"class":262},[173,1856,1858],{"class":175,"line":1857},18,[173,1859,231],{"emptyLinePlaceholder":230},[173,1861,1863,1865,1867,1869,1872,1875],{"class":175,"line":1862},19,[173,1864,1356],{"class":179},[173,1866,1740],{"class":187},[173,1868,432],{"class":183},[173,1870,1871],{"class":187},"reservation",[173,1873,1874],{"class":183},"!.",[173,1876,1877],{"class":187},"id\n",[173,1879,1881],{"class":175,"line":1880},20,[173,1882,1471],{"class":183},[173,1884,1886],{"class":175,"line":1885},21,[173,1887,231],{"emptyLinePlaceholder":230},[173,1889,1891,1893,1895,1897,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1921,1923,1925,1927],{"class":175,"line":1890},22,[173,1892,237],{"class":179},[173,1894,874],{"class":240},[173,1896,1325],{"class":240},[173,1898,1899],{"class":250}," finishPurchase",[173,1901,253],{"class":183},[173,1903,1333],{"class":880},[173,1905,266],{"class":183},[173,1907,1283],{"class":915},[173,1909,325],{"class":183},[173,1911,1342],{"class":880},[173,1913,266],{"class":183},[173,1915,1347],{"class":915},[173,1917,325],{"class":183},[173,1919,1920],{"class":880}," reservationId",[173,1922,266],{"class":183},[173,1924,1347],{"class":915},[173,1926,368],{"class":183},[173,1928,894],{"class":183},[173,1930,1932,1934,1936,1939,1941,1943,1945],{"class":175,"line":1931},23,[173,1933,1356],{"class":179},[173,1935,572],{"class":179},[173,1937,1938],{"class":250}," captureLedgerReservation",[173,1940,253],{"class":262},[173,1942,1333],{"class":187},[173,1944,325],{"class":183},[173,1946,894],{"class":183},[173,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":175,"line":1949},24,[173,1951,1373],{"class":262},[173,1953,266],{"class":183},[173,1955,515],{"class":262},[173,1957,301],{"class":183},[173,1959,298],{"class":200},[173,1961,301],{"class":183},[173,1963,721],{"class":262},[173,1965,304],{"class":183},[173,1967,1969,1971],{"class":175,"line":1968},25,[173,1970,1120],{"class":187},[173,1972,304],{"class":183},[173,1974,1976,1979],{"class":175,"line":1975},26,[173,1977,1978],{"class":187},"    reservationId",[173,1980,304],{"class":183},[173,1982,1984,1986,1988,1990,1993,1995],{"class":175,"line":1983},27,[173,1985,1163],{"class":262},[173,1987,266],{"class":183},[173,1989,197],{"class":183},[173,1991,1992],{"class":200},"shop-purchase-captured",[173,1994,301],{"class":183},[173,1996,304],{"class":183},[173,1998,2000,2002,2004,2006,2009,2011,2014,2017],{"class":175,"line":1999},28,[173,2001,1179],{"class":262},[173,2003,266],{"class":183},[173,2005,1441],{"class":183},[173,2007,2008],{"class":200},"capture:",[173,2010,1447],{"class":183},[173,2012,2013],{"class":187},"reservationId",[173,2015,2016],{"class":183},"}`",[173,2018,304],{"class":183},[173,2020,2022,2024],{"class":175,"line":2021},29,[173,2023,1211],{"class":183},[173,2025,387],{"class":262},[173,2027,2029],{"class":175,"line":2028},30,[173,2030,1471],{"class":183},[173,2032,2034],{"class":175,"line":2033},31,[173,2035,231],{"emptyLinePlaceholder":230},[173,2037,2039,2041,2043,2045,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074],{"class":175,"line":2038},32,[173,2040,237],{"class":179},[173,2042,874],{"class":240},[173,2044,1325],{"class":240},[173,2046,2047],{"class":250}," cancelPurchase",[173,2049,253],{"class":183},[173,2051,1333],{"class":880},[173,2053,266],{"class":183},[173,2055,1283],{"class":915},[173,2057,325],{"class":183},[173,2059,1342],{"class":880},[173,2061,266],{"class":183},[173,2063,1347],{"class":915},[173,2065,325],{"class":183},[173,2067,1920],{"class":880},[173,2069,266],{"class":183},[173,2071,1347],{"class":915},[173,2073,368],{"class":183},[173,2075,894],{"class":183},[173,2077,2079,2081,2083,2086,2088,2090,2092],{"class":175,"line":2078},33,[173,2080,1356],{"class":179},[173,2082,572],{"class":179},[173,2084,2085],{"class":250}," releaseLedgerReservation",[173,2087,253],{"class":262},[173,2089,1333],{"class":187},[173,2091,325],{"class":183},[173,2093,894],{"class":183},[173,2095,2097,2099,2101,2103,2105,2107,2109,2111],{"class":175,"line":2096},34,[173,2098,1373],{"class":262},[173,2100,266],{"class":183},[173,2102,515],{"class":262},[173,2104,301],{"class":183},[173,2106,298],{"class":200},[173,2108,301],{"class":183},[173,2110,721],{"class":262},[173,2112,304],{"class":183},[173,2114,2116,2118],{"class":175,"line":2115},35,[173,2117,1120],{"class":187},[173,2119,304],{"class":183},[173,2121,2123,2125],{"class":175,"line":2122},36,[173,2124,1978],{"class":187},[173,2126,304],{"class":183},[173,2128,2130,2132,2134,2136,2139,2141],{"class":175,"line":2129},37,[173,2131,1163],{"class":262},[173,2133,266],{"class":183},[173,2135,197],{"class":183},[173,2137,2138],{"class":200},"shop-purchase-cancelled",[173,2140,301],{"class":183},[173,2142,304],{"class":183},[173,2144,2146,2148,2150,2152,2155,2157,2159,2161],{"class":175,"line":2145},38,[173,2147,1179],{"class":262},[173,2149,266],{"class":183},[173,2151,1441],{"class":183},[173,2153,2154],{"class":200},"release:",[173,2156,1447],{"class":183},[173,2158,2013],{"class":187},[173,2160,2016],{"class":183},[173,2162,304],{"class":183},[173,2164,2166,2168],{"class":175,"line":2165},39,[173,2167,1211],{"class":183},[173,2169,387],{"class":262},[173,2171,2173],{"class":175,"line":2172},40,[173,2174,1471],{"class":183},[143,2176,2177],{},"Expected balance behavior:",[163,2179,2181],{"className":396,"code":2180,"filename":734,"language":399,"meta":169,"style":169},"reserve: available decreases, reserved increases\ncapture: reserved decreases, available stays the same\nrelease: reserved decreases, available increases\n",[147,2182,2183,2188,2193],{"__ignoreMap":169},[173,2184,2185],{"class":175,"line":176},[173,2186,2187],{},"reserve: available decreases, reserved increases\n",[173,2189,2190],{"class":175,"line":207},[173,2191,2192],{},"capture: reserved decreases, available stays the same\n",[173,2194,2195],{"class":175,"line":227},[173,2196,2197],{},"release: reserved decreases, available increases\n",[143,2199,2200,2201,2204,2205,428,2208,432],{},"Debit and reservation flows require adapter-level atomic mutation support. For development-only adapters, ",[147,2202,2203],{},"unsafeAllowNonAtomicMutations"," can opt into non-atomic behavior, but production stores should implement ",[147,2206,2207],{},"adapter.atomicMutation",[147,2209,2210],{},"adapter.atomicReservationMutation",[2212,2213,2214],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":169,"searchDepth":207,"depth":207,"links":2216},[2217,2218,2219,2220,2221],{"id":157,"depth":207,"text":158},{"id":435,"depth":207,"text":436},{"id":754,"depth":207,"text":755},{"id":1261,"depth":207,"text":1262},{"id":1628,"depth":207,"text":1629},"Add app-local virtual balances to Better Auth.","md",null,{},{"title":94,"description":2222},"LNxdV4ZxRD8UbzBNgIalUz8kUzA1IOhS-cWPbV7Q7Js",[2229,2231],{"title":90,"path":91,"stem":92,"description":2230,"children":-1},"Read ERC-20 balances, metadata, and transfers through any EIP-1193 provider.",{"title":104,"path":105,"stem":106,"description":2232,"children":-1},"Test direct Nimiq auth and cross-device flows without the real host app.",1778838254944]