{"_id":"@antarctic-wallet/aw-sdk","_rev":"10-caa1b29775838b3dab3b3845c9631209","name":"@antarctic-wallet/aw-sdk","dist-tags":{"latest":"0.4.2"},"versions":{"0.1.0":{"name":"@antarctic-wallet/aw-sdk","version":"0.1.0","_id":"@antarctic-wallet/aw-sdk@0.1.0","maintainers":[{"name":"antarcticwallet","email":"antarcticwallettech@gmail.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"dist":{"shasum":"79d0c5c54cd9f67e62562fffd3194b5c9a778a9f","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.1.0.tgz","fileCount":5,"integrity":"sha512-tSNu/zr3LtTOkHehZIhL3wIYaPTizJDJtBr2r/8KrPdTN+f9TF3Pv7qntBfRkxyyFRXsmIWNvFs39d3h9VKEpw==","signatures":[{"sig":"MEYCIQDZSSKkj4pss6e4WacUt8QNoOBTSE5cYoLF/LMCBoG+sgIhAI8IrhJV5CLUkHEJtyAAGM+KNEyXSYJt22JTaj8ASM9z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41438},"main":"./dist/aw-sdk.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/aw-sdk.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/aw-sdk.es.js","require":"./dist/aw-sdk.umd.js"}},"gitHead":"50a52e3d60c695b7a02dbe69746642b4a32350e0","scripts":{"dev":"vite","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"},"_npmVersion":"11.6.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.1.0_1771224644956_0.9930812661713695","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@antarctic-wallet/aw-sdk","version":"0.2.1","_id":"@antarctic-wallet/aw-sdk@0.2.1","maintainers":[{"name":"antarcticwallet","email":"antarcticwallettech@gmail.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"dist":{"shasum":"355ae34a1094cf8fd56a712975d1ba4bc4b7b364","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.2.1.tgz","fileCount":7,"integrity":"sha512-aFIkAcEooXX8xJN75HrqEVw9hMSLbOqal83bpiAjW5CKret0LTq1fZHIOpQGYVFTRyap3WesbDQfXC/vgBbz2w==","signatures":[{"sig":"MEQCIAVP9Yr+c9ARXLgLH9a0H7GsSJSKvG5GMv78+QAdJgciAiAKntxnPNshpz9SdzF/j5J36daA5GAiDHWizVFnsygF9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59935},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"0c7ef279efeb65804d38c4cf4d53cf7fbe50bde8","scripts":{"dev":"vite","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"},"_npmVersion":"11.6.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.2.1_1771245971262_0.8776048915639703","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@antarctic-wallet/aw-sdk","version":"0.2.2","_id":"@antarctic-wallet/aw-sdk@0.2.2","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"dist":{"shasum":"9e97f74199ed778ede8ff7683bc78f324f9bb603","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.2.2.tgz","fileCount":7,"integrity":"sha512-a36T8rTrTAY0YYz9HhZRLaZziuKzv+GvYtAkMd8BVpHpgXUv02UqtcsQYyK4CTwiCloBEpH38n/+Xqz5rfdquA==","signatures":[{"sig":"MEUCIBLoS2H+DcbESD6PvZAHAdEYWyVIAAFyk5Fu5m/GpdhDAiEA5bizVgx+NU3XRZ/noDqDdyzVbKQGlg1xffqYNchPgcc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60260},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"3c8ef7d82da19c6d86f76db687ea157ad2076a9a","scripts":{"dev":"vite","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"},"_npmVersion":"11.6.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.2.2_1776328368230_0.9115682522297559","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@antarctic-wallet/aw-sdk","version":"0.3.0","_id":"@antarctic-wallet/aw-sdk@0.3.0","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"dist":{"shasum":"2b9d1836b093f36bb0eda4172b2e70f78510bfd3","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.3.0.tgz","fileCount":7,"integrity":"sha512-Y9apVlRoTBk34MOwJNFo+Ni+a/Er31aTtE7SzdyRCqE3gGV9zT2A37PSJE8F7qkOqNsO0b2DjHAYhgXuwpXh3w==","signatures":[{"sig":"MEUCIEYq4pHcuQ/sUVMtM0B4Dy/ZipjNAQgRjHpyOEXQ/o1GAiEA4KJguDTXpUlgAMbl1aEblj0BjjyiZ5KG0qwbE5EQHg4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62693},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"1ec92f2cf74197e54a37e9c87fbeae09dcddff8a","scripts":{"dev":"vite","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"},"_npmVersion":"11.6.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.3.0_1782729413980_0.39792054080253103","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@antarctic-wallet/aw-sdk","version":"0.3.4","_id":"@antarctic-wallet/aw-sdk@0.3.4","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"dist":{"shasum":"7ef443c67af5d13bfb22efbe9d328127bf867a31","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.3.4.tgz","fileCount":7,"integrity":"sha512-f0XNWfazoXvN29Ba4b+qQOLiJs0bfxOr6guyf/qyMHYM5fG1KNvN+6kXYayYBc0vPFlJPvcwwSqNnxJm5TWk/g==","signatures":[{"sig":"MEUCIQDWEX3HAmS8HEU8fA++Q+YA/hrAuCNa3JH6btcNTRzD6AIgKtbeGxpowrZ6461HNVyJEzZeEe2uN28mtWoyL/767uA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72446},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"fe993dc7af36910fae4d3e33f2a4ae28e422213b","scripts":{"dev":"vite","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},"_npmVersion":"11.14.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.3.4_1789043490949_0.5914190716329863","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@antarctic-wallet/aw-sdk","version":"0.4.0","keywords":["antarctic-wallet","mini-app","miniapp","wallet","sdk","iframe","postmessage","payments","oidc"],"author":{"name":"Antarctic Tech"},"license":"MIT","_id":"@antarctic-wallet/aw-sdk@0.4.0","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"homepage":"https://github.com/antarctic-tech/aw-sdk#readme","bugs":{"url":"https://github.com/antarctic-tech/aw-sdk/issues"},"dist":{"shasum":"c01263240ee4c26bc571452ed28b69e59a883b64","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.4.0.tgz","fileCount":10,"integrity":"sha512-tyCARoynG7FL7hSmwa+CqL2gfAv1Q43YbtTw9hPphgq/L+n/Bvu/4mpL/i9xytqtgMrgE9u1apzsZPTgYUmdXQ==","signatures":[{"sig":"MEQCIGGfbsyNKcFRecuFXA+SLrV4rxCVVoqibzCWqFu+QABTAiB7rsKBlkEQlYXlNp0EGCgpxOJMroJmb7C9J4Vv5iMD7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106871},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"5f1ab50b4f9dcce80f3edc86f2461d0276c37b28","scripts":{"dev":"vite","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},"repository":{"url":"git+https://github.com/antarctic-tech/aw-sdk.git","type":"git"},"_npmVersion":"11.14.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.4.0_1789074593732_0.36253024942397283","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@antarctic-wallet/aw-sdk","version":"0.4.1","keywords":["antarctic-wallet","mini-app","miniapp","wallet","sdk","iframe","postmessage","payments","oidc"],"author":{"name":"Antarctic Tech"},"license":"MIT","_id":"@antarctic-wallet/aw-sdk@0.4.1","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"homepage":"https://github.com/antarctic-tech/aw-sdk#readme","bugs":{"url":"https://github.com/antarctic-tech/aw-sdk/issues"},"dist":{"shasum":"800ce1e3bdc0dd2a51c5a3fbbc24a5a741448bfe","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.4.1.tgz","fileCount":10,"integrity":"sha512-vLP86EOVE4H1tAnnDm9sgXTPygPc50xoEtpkN52EAPeJi8Sr5gIlIaFHn+sPMqBSxogzucgaI3IZYrqoBgjPyg==","signatures":[{"sig":"MEUCIQCKv4Y7mBcKKuLiyDwWbj/I9IZgzYzp9WClZtVAnQgJ6QIgdMlooxF/+jj769p+htv5GWnDSQhLooxngRPlT3oaDVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkqd5wynufxefO68n/gZd1uRBezxsmi+NdVa982/K4nQIgIAnvhYlIEmxbH9mY2NUwCymj5Tt7UCfLzqcML5iPBFI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118628},"main":"./dist/aw-sdk.js","type":"module","types":"./dist/aw-sdk.d.ts","module":"./dist/aw-sdk.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"c99a0cacb86d4435a2fedba417421fb4f9202d6e","scripts":{"dev":"vite","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},"repository":{"url":"git+https://github.com/antarctic-tech/aw-sdk.git","type":"git"},"_npmVersion":"11.14.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aw-sdk_0.4.1_1790161109879_0.14475807956117004","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"_id":"@antarctic-wallet/aw-sdk@0.4.2","bugs":{"url":"https://github.com/antarctic-tech/aw-sdk/issues"},"dist":{"shasum":"c5fcf0c7b853141968e2d9549eaffa1080f9f51b","tarball":"https://registry.npmjs.org/@antarctic-wallet/aw-sdk/-/aw-sdk-0.4.2.tgz","fileCount":10,"integrity":"sha512-woqG8ap6PxU2i2UmyFliPzAg+rUj2XTjaIDGc30qvEeRsQoW4k4zmlSM+i5zaYl3vqf0Gxk6iYLqHLay8w6jEQ==","signatures":[{"sig":"MEUCIBKQVBOsLdmpk0cWqjC/hMQz7B0wl97JfYfk/QEvNlH1AiEA3UpcvCfQskIRs2E9lD8CJSmKpaGJNnXs4vgZkS8y5KQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFRgQTS0iP5+C7D/5dgxX7qktvitKP9v3dQgrIq29sRIAiEAhbsnByGWxVZyTHc87Vg4TbhpbcyPl334848yIs2Q+WM="}],"unpackedSize":166220},"main":"./dist/aw-sdk.js","name":"@antarctic-wallet/aw-sdk","type":"module","types":"./dist/aw-sdk.d.ts","author":{"name":"Antarctic Tech"},"module":"./dist/aw-sdk.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/aw-sdk.d.ts","import":"./dist/aw-sdk.js"},"./vue":{"types":"./dist/aw-sdk-vue.d.ts","import":"./dist/aw-sdk-vue.js"}},"gitHead":"9a9004860765bf510b2e274a61cd103d60ec2e40","license":"MIT","scripts":{"dev":"vite","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run typecheck && npm test && npm run build"},"version":"0.4.2","_npmUser":{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},"homepage":"https://github.com/antarctic-tech/aw-sdk#readme","keywords":["antarctic-wallet","mini-app","miniapp","wallet","sdk","iframe","postmessage","payments","oidc"],"repository":{"url":"git+https://github.com/antarctic-tech/aw-sdk.git","type":"git"},"_npmVersion":"11.14.1","description":"SDK for embedded mini-apps in Antarctic Wallet","directories":{},"maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^6.1.0","vitest":"^3.0.0","typescript":"^5.7.0","vite-plugin-dts":"^4.5.0"},"peerDependencies":{"vue":"^3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aw-sdk_0.4.2_1790257635744_0.6233426044158281"}}},"time":{"created":"2026-02-16T06:50:44.803Z","modified":"2026-09-24T13:47:16.041Z","0.1.0":"2026-02-16T06:50:45.105Z","0.2.1":"2026-02-16T12:46:11.405Z","0.2.2":"2026-04-16T08:32:48.373Z","0.3.0":"2026-06-29T10:36:54.149Z","0.3.3":"2026-09-10T10:38:41.555Z","0.3.4":"2026-09-10T12:31:31.092Z","0.4.0":"2026-09-10T21:09:53.876Z","0.4.1":"2026-09-23T10:58:29.992Z","0.4.2":"2026-09-24T13:47:15.837Z"},"bugs":{"url":"https://github.com/antarctic-tech/aw-sdk/issues"},"author":{"name":"Antarctic Tech"},"license":"MIT","homepage":"https://github.com/antarctic-tech/aw-sdk#readme","keywords":["antarctic-wallet","mini-app","miniapp","wallet","sdk","iframe","postmessage","payments","oidc"],"repository":{"url":"git+https://github.com/antarctic-tech/aw-sdk.git","type":"git"},"description":"SDK for embedded mini-apps in Antarctic Wallet","maintainers":[{"name":"antarcticwallet","email":"dev@antarcticwallet.com"},{"name":"suepr-puper-pomidor","email":"anton.z@antarcticwallet.com"}],"readme":"# @antarctic-wallet/aw-sdk\n\n[English](./README.md) · **Русский**\n\n![npm](https://img.shields.io/npm/v/@antarctic-wallet/aw-sdk.svg)\n![license](https://img.shields.io/npm/l/@antarctic-wallet/aw-sdk.svg)\n\nSDK для встроенных мини-приложений Antarctic Wallet (AW). Берёт на себя\nбезопасный канал iframe ↔ кошелёк, хендшейк, сессию и скоупы, а также запрос\n**нативного** листа подтверждения операции в кошельке. Читает окружение хоста\n(тема, язык, safe area, видимость) и вызывает его возможности: QR-сканер,\nтактильный отклик и цвет фона страницы.\n\nБез рантайм-зависимостей. Работает в iframe и в React Native WebView.\n\n## Рабочие примеры\n\nГотовые сквозные стартеры (фронт + бэкенд партнёра + Docker) лежат в отдельном репозитории:\n\n\n| Стек          | Пример                                                                                                   |\n| ------------- | -------------------------------------------------------------------------------------------------------- |\n| Vue 3         | [examples/vue](https://github.com/antarctic-tech/example-app/tree/master/examples/vue)                   |\n| React         | [examples/react](https://github.com/antarctic-tech/example-app/tree/master/examples/react)               |\n| Angular       | [examples/angular](https://github.com/antarctic-tech/example-app/tree/master/examples/angular)           |\n| Бэкенд (Node) | [examples/backend-node](https://github.com/antarctic-tech/example-app/tree/master/examples/backend-node) |\n\n\n- Репозиторий: **[antarctic-tech/example-app](https://github.com/antarctic-tech/example-app)**\n- Машиночитаемая спека для ИИ-инструментов: [AGENTS.md](https://github.com/antarctic-tech/example-app/blob/master/AGENTS.md)\n\nЕсли начинаете с нуля — скопируйте файл сценария из примера, а не собирайте\nпоток по этому README.\n\n## Как это устроено\n\nТри стороны. Их нельзя смешивать.\n\n```\nКошелёк (AW)           Мини-апка (браузер)       Ваш бэкенд\n────────────           ───────────────────       ──────────\niframe + нативный UI   ваш фронт + SDK           секрет, сессии\nлист подтверждения     postMessage в кошелёк     вызовы API AW\n```\n\n1. Кошелёк открывает ваш фронт в iframe и передаёт `?parentOrigin=`.\n2. Фронт создаёт `AWSDK` и вызывает `init()`.\n3. Операцию создаёт **ваш бэкенд** (`POST {AW_API_BASE}/api/apps/v1/intents`)\n  с секретом приложения. Браузер секрет не видит.\n4. Фронт только просит кошелёк подтвердить полученный id:\n  `sdk.operations.requestConfirmation(operationId)`.\n\n## Установка\n\n```bash\nnpm install @antarctic-wallet/aw-sdk\n```\n\n## Быстрый старт\n\n```typescript\nimport { AWSDK, AWScope } from '@antarctic-wallet/aw-sdk';\n\nconst sdk = new AWSDK({\n  appId: 'my-mini-app',              // поле `id` из config.json мини-апки\n  scopes: [AWScope.USER_DATA, AWScope.PAY],\n  parentOrigin: resolveParentOrigin(),\n  persistSession: true,\n});\n\n// Подписываемся ДО init() — событие `sdk.ready` летит внутри него.\nsdk.events.on('sdk.ready', (session) => {\n  console.log('выданные скоупы:', session.grantedScopes);\n  console.log('idToken:', sdk.idToken); // подписанный JWT — шлём на СВОЙ бэкенд\n});\n\nsdk.events.on('sdk.error', ({ code, message }) => {\n  console.error('SDK дальше не работает:', code, message);\n});\n\nawait sdk.init();\n\n// в onUnmounted / beforeunload\nsdk.destroy();\n```\n\n## Конфигурация\n\n```typescript\ninterface AWSDKConfig {\n  /** Идентификатор мини-апки из кабинета AW (то же, что `id` в config.json) */\n  appId: string;\n  /** Скоупы, запрашиваемые при хендшейке */\n  scopes: string[];\n  /** Ожидаемый origin кошелька — postMessage не уйдёт никуда больше */\n  parentOrigin: string;\n  /** Отладочные логи. По умолчанию false */\n  debug?: boolean;\n  /** Таймаут ответа postMessage, мс. По умолчанию 30000 */\n  timeout?: number;\n  /** Хранить сессию в sessionStorage и восстанавливать при перезагрузке. По умолчанию true */\n  persistSession?: boolean;\n  /** Политика ретраев при таймаутах. По умолчанию { maxAttempts: 3, baseDelay: 1000 } */\n  retry?: { maxAttempts?: number; baseDelay?: number };\n}\n```\n\n`retry` работает для хендшейка, обновления сессии и запросов скоупов. К\n`requestConfirmation` он намеренно **не** применяется — там ждём человека.\n\n### `parentOrigin`\n\n`parentOrigin` — это граница безопасности: SDK шлёт сообщения только на этот\norigin и игнорирует всё, что пришло с других. Никогда не зашивайте одно\nзначение — определяйте по порядку:\n\n```typescript\nfunction resolveParentOrigin(): string {\n  const fromQuery = new URLSearchParams(location.search).get('parentOrigin');\n  if (fromQuery) return fromQuery;\n  if (document.referrer) return new URL(document.referrer).origin;\n  return 'https://your-dev-wallet.example';   // только для локальной разработки\n}\n```\n\nКошелёк всегда передаёт `?parentOrigin=` и параметры запуска\n(`awPlatform`, `awColorScheme`, `awLanguageCode`). Если используете роутер —\nберите хеш-роутер (`#/pay`), чтобы query-строка пережила навигацию.\n\n### Запущены ли мы внутри кошелька\n\n```typescript\nif (!AWSDK.isInsideWallet()) {\n  // открыли просто во вкладке — покажите экран «откройте в Antarctic Wallet»\n}\n```\n\nВозвращает `true` внутри iframe и в React Native WebView.\n\n## Скоупы\n\n```typescript\nimport { AWScope } from '@antarctic-wallet/aw-sdk';\n\nAWScope.USER_DATA  // 'userData' — профиль и KYC-флаги в id_token\nAWScope.BALANCE    // 'balance'  — баланс пользователя\nAWScope.PAY        // 'pay'      — пользователь платит вам\n```\n\n`receive` скоупом **не является**: это тип интента (выплата пользователю), и он\nне требует вообще никакого скоупа. Запрошенный `pay` выплаты не включает, а сами\nвыплаты не требуют от пользователя ничего выдавать.\n\n```typescript\nconst granted = await sdk.scopes.getScopes();          // string[]\nconst data = await sdk.scopes.getData<MyScopeData>();  // данные скоупов от хоста\n```\n\nСкоупы из `new AWSDK({ scopes })` — это то, что запрашивает хендшейк. Поле\n`requiredScopes` в `config.json` мини-апки — манифест для каталога кошелька,\nSDK его **не читает**.\n\nЧтобы запросить дополнительные разрешения позже, создайте на бэкенде интент\nтипа `scopes` и подтвердите его как обычную операцию — после этого SDK\nэмитит `scopes.granted`.\n\n## Кто пользователь (OIDC `id_token`)\n\n`sdk.idToken` — подписанный JWT, в котором `sub` это непрозрачный логин\nпользователя **в вашем приложении**. Только он годится для авторизации на\nбэкенде. `sdk.user` / `session.userContext` декодируется из этого токена внутри\nмини-апки *без проверки подписи* — это данные только для экрана (`displayName`\nнамеренно равен `sub`, а не имени человека).\n\n```typescript\n// В мини-апке — форвардим токен на свой бэкенд:\nawait fetch('/api/auth/session', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ idToken: sdk.idToken }),\n});\n```\n\n```typescript\n// На ВАШЕМ бэкенде — проверяем подпись через JWKS хоста и доверяем `sub`:\nimport { createRemoteJWKSet, jwtVerify } from 'jose';\n\nconst jwks = createRemoteJWKSet(new URL(`${AW_API_BASE}/api/v2/sdk/jwks`));\nconst { payload } = await jwtVerify(idToken, jwks, {\n  issuer: 'aw',\n  audience: AW_APP_ID,\n});\nconst userId = payload.sub; // доверенный — подделать без ключа AW нельзя\n```\n\n`idToken` может быть `null`, пока сессия в состоянии pending (скоупы ещё не\nвыданы) или если хост старой версии его не выпустил — всегда проверяйте на\nnull. Токен ротируется вместе с сессией (TTL ~600 с); свежее значение берите из\n`sdk.idToken` или из события `session.refreshed`.\n\n## Операции (pay / receive / scopes)\n\nМини-апка **никогда** не создаёт операцию сама. Это делает ваш бэкенд с\nсекретом приложения, а фронт лишь просит кошелёк подтвердить полученный id.\n\n```\nМини-апка                   Ваш бэкенд                       AW\n   │  idToken + сумма           │                             │\n   │ ─────────────────────────► │  POST /api/apps/v1/intents  │\n   │                            │ ──────────────────────────► │\n   │       { operationId }      │                             │\n   │ ◄───────────────────────── │                             │\n   │\n   │  sdk.operations.requestConfirmation(operationId)\n   ▼\nКошелёк показывает нативный лист: пользователь подтверждает или отклоняет\n```\n\n\n| Тип       | Смысл                                                                    | Подтверждение                    |\n| --------- | ------------------------------------------------------------------------ | -------------------------------- |\n| `pay`     | Пользователь платит вам (покупка, донат)                                 | Да — нативный лист в кошельке    |\n| `receive` | Вы платите пользователю (возврат, выплата). Не скоуп и скоупа не требует | Нет — уже выполнено в ответе API |\n| `scopes`  | Запросить дополнительные разрешения                                      | Да — нативный лист в кошельке    |\n\n\n```typescript\n// 1. Ваш бэкенд создаёт интент и возвращает его id\nconst { operationId, status } = await fetch('/api/intents', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ idToken: sdk.idToken, type: 'pay', amount: '5.00' }),\n}).then((r) => r.json());\n\n// 2. `receive` уже исполнен; `pay` и `scopes` требуют листа в кошельке\nif (status === 'pending') {\n  const result = await sdk.operations.requestConfirmation(operationId);\n  // result: { operationId, status, txId? }\n}\n```\n\n`AWOperationStatus` — это `'pending' | 'awaiting_confirmation' | 'confirmed' | 'succeeded' | 'failed' | 'rejected'`. Отказ пользователя приходит **брошенным\n`AWOperationError**` с `errorCode === 'user_rejected'`, а также событием\n`operation.rejected`.\n\nВ проде закрывайте заказ вебхуком от AW (`intent.approved`, `intent.rejected`,\n`payment.succeeded`, `payment.failed`), а не тем, что ответила вкладка: её\nмогут закрыть на середине. Проверка подписи и идемпотентность — в\n[примере бэкенда](https://github.com/antarctic-tech/example-app/tree/master/examples/backend-node).\n\nКуда уходят деньги — счёт приложения, срок охлаждения, пополнение и вывод — в разделе\n[Движение средств](#money-flow).\n\n> **Удалено в 0.4.0:** `sdk.operations.prepare()`. Создавать операцию из\n> браузера было небезопасно, а кошелёк всё равно ждёт интент, созданный\n> сервером. См. [Миграцию](#миграция-с-03x).\n\n\n\n## Движение средств\n\nУ каждого мини-приложения один счёт: собственный баланс, отдельно от личного баланса разработчика. По API этот баланс можно получить в разных валютах. Пока в ответе только USD.\n\nИнтент `scopes` не приводит к движению средств.\n\n### Пользователь и счёт приложения\n\n```mermaid\nflowchart LR\n  User[Баланс пользователя]\n  Account[Счёт приложения]\n\n  User -- \"Оплата, подтверждение в кошельке\" --> Account\n  Account -- \"Выплата, без отдельного подтверждения\" --> User\n```\n\n\n\n#### Оплата — пользователь платит приложению\n\nДеньги идут с баланса пользователя на счёт приложения. Бэкенд создаёт интент\n`pay`; кошелёк запрашивает у пользователя подтверждение, и перевод проходит только после подтверждения пользователем. Для переводов требуется scope `pay`.\n\nСумма, переведённая со счета пользователя на счет приложения, удерживается на счете приложения в течение периода охлаждения. Сумма уже на счёте, но сделать этими средствами выплату или вывод на счёт разработчика ещё нельзя.\n\n#### Выплата — приложение платит пользователю\n\nДеньги идут со счёта приложения на баланс пользователя. Бэкенд создаёт интент\n`receive`. Отдельного подтверждения нет: к моменту ответа API перевод уже\nвыполнен.\n\nВыплатить можно только **доступную** сумму со счета приложения.\n\n### Разработчик и счёт приложения\n\n```mermaid\nflowchart LR\n  Dev[Баланс разработчика]\n  Account[Счёт приложения]\n\n  Dev -- \"Пополнение, подтверждение в кошельке\" --> Account\n  Account -- \"Вывод доступной суммы, подтверждение в кошельке\" --> Dev\n```\n\n\n\n#### Пополнение — разработчик пополняет счёт приложения\n\nРазработчик переводит деньги со своего личного баланса на счёт приложения и подтверждает перевод в кошельке. Срок охлаждения на этот депозит не распространяется: сумма доступна для распоряжения приложением сразу после зачисления. Так можно финансировать выплаты, пока оплаты от пользователей ещё на охлаждении.\n\n#### Вывод — разработчик забирает деньги\n\nРазработчик может вывести только **доступную** сумму и только на свой собственный\nбаланс. Вывод подтверждается в кошельке. На чужой баланс вывести нельзя.\n\n### Срок охлаждения\n\nСрок охлаждения действует только на оплаты пользователя. На депозиты\nразработчика на счёт приложения он не распространяется.\n\n```mermaid\nsequenceDiagram\n  participant User as Баланс пользователя\n  participant Account as Счёт приложения\n\n  User->>Account: Оплата подтверждена\n  Note over Account: Баланс счёта увеличивается\n  Note over Account: Эта оплата недоступна, пока не кончится охлаждение\n  Note over Account: Охлаждение кончилось — сумма стала доступной\n  Account->>User: Выплата только из доступной суммы\n```\n\n\n\n\n| Средства на счёте                            | Можно выплатить или вывести |\n| -------------------------------------------- | --------------------------- |\n| Оплата пользователя, охлаждение ещё идёт     | Нет                         |\n| Оплата пользователя после периода охлаждения | Да                          |\n| Депозит разработчика                         | Да, сразу                   |\n\n\nДоступная сумма — это баланс счёта минус оплаты пользователя, которые ещё\nохлаждаются. И выплаты, и вывод берутся только из неё.\n\n### Баланс счёта приложения\n\nБэкенд читает счёт приложения той же server-to-server авторизацией, что и\nинтенты: заголовок `X-AW-App-Id` и `Authorization: Bearer <app_secret>`.\nАутентифицированное приложение и есть этот счёт. В вызове не участвуют\nпользователь, его логин и scope `balance` — этот scope про баланс самого\nпользователя.\n\n```\nGET {AW_API_BASE}/api/apps/v1/balance\n```\n\nОтвет — массив, по элементу на валюту. Пока в нём один элемент, USD. Следующая\nвалюта — ещё один элемент того же массива, форма ответа не меняется.\n\nКазна 100 USD, из них 30 в холде и 70 доступно:\n\n```json\n[\n  {\n    \"asset\": \"USD\",\n    \"total\": { \"amount\": 100, \"scale\": 0 },\n    \"available\": { \"amount\": 70, \"scale\": 0 },\n    \"locked\": { \"amount\": 30, \"scale\": 0 }\n  }\n]\n```\n\n| Поле | Смысл |\n| --- | --- |\n| `asset` | Валюта. Пока только `USD` |\n| `total` | Баланс счёта приложения в этой валюте |\n| `locked` | Сумма активного холда этого счёта |\n| `available` | `max(total − locked, 0)` |\n\nСуммы в виде `{ amount, scale }`: 100 целых — `{ \"amount\": 100, \"scale\": 0 }`.\n`available` и `locked` — те же числа, что доступная сумма и холд на охлаждении\nвыше.\n\n### Статус приложения\n\n\n| Статус         | Пользователь может платить | Приложение может платить пользователю | Разработчик может пополнить | Разработчик может вывести                  |\n| -------------- | -------------------------- | ------------------------------------- | --------------------------- | ------------------------------------------ |\n| Активно        | Да                         | Да, из доступной суммы                | Да                          | Да, доступная сумма, только на свой баланс |\n| Приостановлено | Да                         | Нет                                   | Да                          | Нет                                        |\n| Заблокировано  | Нет                        | Нет                                   | Нет                         | Нет                                        |\n\n\nПриостановка останавливает выплаты и вывод. Принимать оплаты пользователей\nпри этом можно, и разработчик по-прежнему может пополнить счёт.\n\n## Сессия\n\nСессия сама обновляется за 60 секунд до истечения. Ручное управление:\n\n```typescript\nconst session = sdk.getSession();     // AWSession | null\n\nconst status = await sdk.status();\n// { status: 'active' | 'expired' | 'revoked', idToken, grantedScopes, expiresAt }\n\nawait sdk.refreshSession();           // эмитит 'session.refreshed'\n```\n\nПри `persistSession: true` (по умолчанию) сессия лежит в `sessionStorage` под\nключом, привязанным к `appId`, и восстанавливается при перезагрузке без полного\nхендшейка. `destroy()` эту запись стирает — это завершение работы, а не пауза.\n\n## Кнопка «Назад»\n\nУправление кнопкой «Назад» в chrome контейнера. Когда она показана, в шапке\nхоста вместо «Закрыть» появляется стрелка. Нажатие только доставляет событие в\nваше приложение: навигация целиком на вашей стороне, контейнер не закрывается.\n\n```typescript\nsdk.backButton.show();      // в шапке появляется стрелка «Назад»\nsdk.backButton.hide();      // шапка возвращается к «Закрыть»\nsdk.backButton.isVisible;   // boolean\n\nconst handler = () => router.back();\nsdk.backButton.onClick(handler);\nsdk.backButton.offClick(handler);\n```\n\nНа Android аппаратная кнопка «Назад» работает по тому же контракту, пока\nстрелка видима. `show()` и `hide()` до `init()` запоминаются и уходят, когда\nканал открыт (после хендшейка или после восстановленной сессии). Повторный\nхендшейк снова отправляет стрелку, если она должна остаться видимой.\n`destroy()` прячет стрелку и снимает все хендлеры.\n\n## Окружение хоста\n\nТема, язык, платформа, safe-area и видимость контейнера приложения.\nПлатформа, тема и язык известны до `init()`; safe area и видимость заполнены к\nмоменту, когда `await sdk.init()` вернулся. Дальше события приходят при каждом\nизменении. Старый кошелёк, который не присылает снимок, `init()` не блокирует и\n`sdk.error` не эмитит: значения из URL остаются как были, safe area не заполняется,\n`isActive` остаётся `true`.\n\n### Параметры запуска\n\nЧитаются сразу после `new AWSDK()`, до любого postMessage:\n\n```\n?awPlatform=ios&awColorScheme=dark&awLanguageCode=pt-BR\n```\n\n| Параметр | Свойство | Значения |\n| --- | --- | --- |\n| `awPlatform` | `platform` | `web`, `tma`, `ios`, `android` |\n| `awColorScheme` | `colorScheme` | `light`, `dark` — системная настройка уже применена |\n| `awLanguageCode` | `languageCode` | BCP 47: `ru`, `en`, `kk`, `pt-BR`, … |\n\nНеизвестные значения игнорируются. В URL нет safe area и видимости. `isActive`\nстартует как `true` и таким и остаётся, если хост видимость не присылает. Эти\nпараметры нужно сохранять при навигации так же, как `parentOrigin`.\n\n### Свойства\n\n| Свойство | Событие | Что означает |\n|---|---|---|\n| `platform` | — | `web`, `tma`, `ios`, `android` |\n| `colorScheme` | `themeChanged` | `light` / `dark`, системный режим уже применён |\n| `languageCode` | `languageChanged` | язык интерфейса кошелька, BCP 47: `ru`, `en`, `kk`, `pt-BR`, … |\n| `safeAreaInset` | `safeAreaChanged` | `{ top, right, bottom, left }` внутри контейнера |\n| `isActive` | `activated`, `deactivated` | приложение на экране и кошелёк на переднем плане |\n\nСвойства обновляются **до** вызова обработчиков, обработчики без аргументов, одинаковые\nзначения событий не вызывают. `sdk.refreshEnvironment()` повторно запрашивает только тему,\nязык и safe area: видимость приходит только пушем, старый кошелёк запросы игнорирует.\nОбычно вызов не нужен: хост шлёт полный снимок до резолва `init()`, дальше — только изменения.\n\n### CSS-переменные\n\nSDK выставляет их на `:root`:\n\n```css\n.footer { padding-bottom: var(--aw-safe-area-inset-bottom, 0px); }\n.header { padding-top: var(--aw-safe-area-inset-top, 0px); }\n```\n\n`--aw-safe-area-inset-top|right|bottom|left`, `--aw-color-scheme`. Пока значение не пришло, переменной нет — задавайте fallback.\n\n### Пример\n\n```typescript\nconst sdk = new AWSDK({ appId: 'my-mini-app', scopes: [], parentOrigin: walletOrigin });\n\nconst applyEnvironment = () => {\n  document.documentElement.dataset.theme = sdk.colorScheme ?? 'light';\n  i18n.locale = sdk.languageCode ?? 'en';\n};\n\napplyEnvironment();\nsdk.events.on('themeChanged', applyEnvironment);\nsdk.events.on('languageChanged', applyEnvironment);\nsdk.events.on('deactivated', () => pausePolling());\nsdk.events.on('activated', () => refreshAndResumePolling());\n\nawait sdk.init();\nif (!sdk.isActive) pausePolling();\n```\n\n### Vue 3 refs\n\n`useAWSdk` возвращает readonly refs: `platform`, `isActive`, `colorScheme`, `languageCode`,\n`safeAreaInset`. После mount они обновляются реактивно:\n\n```typescript\nimport { watch } from 'vue';\nimport { useAWSdk } from '@antarctic-wallet/aw-sdk/vue';\n\nconst { colorScheme, languageCode, isActive } = useAWSdk(config);\nwatch(colorScheme, value => applyTheme(value ?? 'light'), { immediate: true });\nwatch(languageCode, value => applyLanguage(value ?? 'en'), { immediate: true });\nwatch(isActive, value => (value ? resume() : pause()));\n```\n\n## QR-сканер\n\nОткрывает сканер кошелька поверх приложения и возвращает распознанную строку.\nКамера остаётся у кошелька: приложение не видит видео, только результат.\nСканер показывает, какое приложение получит результат, и закрывается после первого скана.\n\n```typescript\ntry {\n  const address = await sdk.scanQr();\n} catch (err) {\n  if (err instanceof AWScanQrError && err.errorCode === ScanQrErrorCodes.Closed) {\n    // пользователь закрыл сканер\n  }\n}\n```\n\n`AWScanQrError.errorCode`: `closed`, `not_active` (приложение свёрнуто или кошелёк в фоне),\n`already_open`, `camera_denied`, `unsupported` (хост не заявил сканер — см.\n`sdk.isCommandAvailable(AWCommand.OpenScanQr)`), `generic_error`.\n\nАргумента с подписью нет: кошелёк сам рисует «результат получит это приложение».\n`timeout` из конфига на сканер не действует. Вызов ждёт результат, закрытие или\n`destroy()`, который отклоняет ещё открытый скан.\n\n## Тактильный отклик\n\nВибрация через кошелёк, как у его собственных контролов. Без ответа; пока приложение\nсвёрнуто или вибрация выключена в настройках кошелька, ничего не происходит.\n\n```typescript\nsdk.hapticFeedback.impactOccurred('light');        // light | medium | heavy | rigid | soft\nsdk.hapticFeedback.notificationOccurred('success'); // success | warning | error\nsdk.hapticFeedback.selectionChanged();\n```\n\n## Цвет фона\n\nСообщите кошельку, какой цвет лежит под вашей страницей. Кошелёк красит только область\nWebView / iframe, и оверскролл на iOS больше не мигает его тоном. Шапка и лоадер остаются\nв цвете кошелька. Принимает `#rgb` или `#rrggbb`; короткая форма раскрывается в `#rrggbb`\nв нижнем регистре — его и возвращает `sdk.backgroundColor`. Всё остальное даёт `false` и\nне отправляется. Без ответа; старые кошельки вызов игнорируют.\n\n```typescript\nsdk.setBackgroundColor('#0f1117');\nsdk.backgroundColor; // '#0f1117'\n```\n\nВызывайте повторно при смене темы, например по `themeChanged`.\n\n## События\n\nПодписывайтесь **до** `init()`.\n\n| Событие | Payload | Когда |\n| ------- | ------- | ----- |\n| `sdk.ready` | `AWSession` | Хендшейк прошёл (или восстановлена сохранённая сессия) |\n| `sdk.error` | `{ code, message }` | Незапрошенная ошибка хоста: плохой origin, хост недоступен, `init` не удался. `ERROR` в ответ на запрос отклоняет этот вызов и `sdk.error` не эмитит |\n| `scopes.granted` | `{ scopes }` | Летит с выданным набором при ready и после операции `scopes` |\n| `session.refreshed` | `{ sessionToken, idToken, expiresAt }` | Сессия обновилась — возьмите свежий `idToken` |\n| `session.expired` | — | Сессия мертва: сбросьте UI и вызовите `init()` заново |\n| `operation.rejected` | `{ operationId, reason }` | В кошельке нажали «отклонить» |\n| `backButton` | — | Нажата стрелка «Назад» в шапке хоста |\n| `themeChanged` | — | Изменился `sdk.colorScheme` |\n| `languageChanged` | — | Изменился `sdk.languageCode` |\n| `safeAreaChanged` | — | Изменился `sdk.safeAreaInset` |\n| `activated` / `deactivated` | — | Приложение появилось на экране / ушло с него (`sdk.isActive`) |\n\n```typescript\nsdk.events.on('session.refreshed', ({ idToken }) => {\n  /* если кешировали idToken — замените */\n});\nsdk.events.on('session.expired', () => {\n  /* сбросить UI, снова sdk.init() */\n});\n```\n\n## Ошибки\n\nВсе ошибки наследуют `AWSDKError`. Ловите через `instanceof`, не по `message`.\n\n\n| Класс              | Когда                                                             | Доп. поля                                       |\n| ------------------ | ----------------------------------------------------------------- | ----------------------------------------------- |\n| `AWInitError`      | `init()` не удался: хендшейк, конфиг, отклонённые скоупы, таймаут | `errorCode: InitErrorCodes`                     |\n| `AWSessionError`   | Сессия недействительна, истекла или отозвана                      | `errorCode: SessionErrorCodes`                  |\n| `AWScopeError`     | Нужный скоуп не выдан                                             | `errorCode: ScopeErrorCodes`                    |\n| `AWOperationError` | Операция не прошла или отклонена                                  | `operationId`, `errorCode: OperationErrorCodes` |\n| `AWTimeoutError`   | Ответа не было дольше `timeout`                                   | —                                               |\n| `AWScanQrError`    | QR-сканер не открылся, закрыт или недоступен                      | `errorCode: ScanQrErrorCodes`                   |\n\n\n```typescript\nimport {\n  AWInitError,\n  AWOperationError,\n  AWTimeoutError,\n  InitErrorCodes,\n  OperationErrorCodes,\n} from '@antarctic-wallet/aw-sdk';\n\ntry {\n  await sdk.init();\n} catch (error) {\n  if (error instanceof AWInitError) {\n    if (error.errorCode === InitErrorCodes.ScopesRejected) {\n      /* пользователь отклонил лист разрешений */\n    }\n  } else if (error instanceof AWTimeoutError) {\n    /* кошелёк не ответил */\n  } else throw error;\n}\n\ntry {\n  await sdk.operations.requestConfirmation(operationId);\n} catch (error) {\n  if (error instanceof AWOperationError) {\n    if (error.errorCode === OperationErrorCodes.UserRejected) {\n      /* не сбой — пользователь отказался */\n    }\n  }\n}\n```\n\nEnum'ы кодов (`InitErrorCodes`, `SessionErrorCodes`, `ScopeErrorCodes`,\n`OperationErrorCodes`, `ScanQrErrorCodes`) и их дефолтные сообщения\n(`InitErrorMessage`, …) тоже экспортируются.\n\n## Vue 3\n\nComposable лежит в отдельной точке входа. `vue` — опциональная peer-зависимость,\nона нужна только если импортируете этот путь.\n\n```vue\n<script setup lang=\"ts\">\nimport { useAWSdk } from '@antarctic-wallet/aw-sdk/vue';\nimport { AWScope } from '@antarctic-wallet/aw-sdk';\n\nconst { sdk, session, user, isReady, error } = useAWSdk({\n  appId: 'my-mini-app',\n  scopes: [AWScope.USER_DATA, AWScope.PAY],\n  parentOrigin: resolveParentOrigin(),\n});\n</script>\n```\n\nComposable создаёт SDK при mount, вызывает `init()` и `destroy()` при unmount.\n`sdk` — это `shallowRef`: инстанс SDK никогда не кладите в глубокую реактивность.\nТот же composable возвращает refs окружения: `platform`, `colorScheme`,\n`languageCode`, `safeAreaInset`, `isActive`. См. [Окружение хоста](#окружение-хоста).\n\n## Совместимость с хостом\n\nВерсии кошелька раскатываются постепенно, поэтому хост может не поддерживать\nвсе команды, которые знает ваша версия SDK.\n\n```typescript\nimport {\n  AWCommand,\n  COMMAND_VERSIONS,\n  PROTOCOL_VERSION,\n  SDK_VERSION,\n} from '@antarctic-wallet/aw-sdk';\n\nawait sdk.init();\n\nif (!sdk.isCommandAvailable(AWCommand.GetScopesData)) {\n  // хост старее — спрячьте фичу вместо падения\n}\n```\n\n- `sdk.isCommandAvailable(command)` — сверяется с картой `supportedCommands`,\nкоторую хост вернул при хендшейке. Если хост ничего не сообщил, обязательные\nкоманды считаются доступными. Необязательные — нет: `scanQr()` ждёт явной\nзаписи `web_app_open_scan_qr`, иначе бросает `unsupported`. Тема, язык и\nsafe area становятся доступны, как только пришёл снимок, даже если их нет в\nкарте. Тактильный отклик и цвет фона — без ответа: старый кошелёк их\nигнорирует, и `init()` всё равно завершается.\n- `COMMAND_VERSIONS` — минимальные версии команд, нужные этой сборке SDK.\n- `PROTOCOL_VERSION` — версия конверта postMessage (`'1.0'`).\n- `SDK_VERSION` — всегда равен версии пакета.\n\n## Очистка\n\n```typescript\nsdk.destroy();\n```\n\nОстанавливает авто-рефреш, отклоняет незавершённые запросы и снимает их таймеры\n(открытый сканер не продолжает ждать), гасит транспорт postMessage, снимает всех\nслушателей, прячет стрелку «Назад», сбрасывает цвет фона и CSS-переменные `--aw-*`\nи стирает сохранённую сессию. Вызывайте из `onUnmounted` / cleanup в `useEffect` /\n`ngOnDestroy`.\n\n## Миграция с 0.3.x\n\n`0.4.0` приводит SDK к тому потоку, который реально используют кошелёк и примеры.\n\n- **Удалён `sdk.operations.prepare()`** вместе с `AWOperationIntent`,\n`AWOperationIntentParams` и сообщениями протокола `PREPARE_OPERATION`.\nСоздавайте интент на бэкенде и передавайте `operationId` в\n`sdk.operations.requestConfirmation()`.\n- `**AWOperationType` теперь `'pay' | 'receive' | 'scopes'**` (было\n`'transfer' | 'payment'`).\n- **Изменены значения `AWScope`** на те, что кошелёк реально выдаёт:\n`USER_DATA` (`'userData'`), `BALANCE` (`'balance'`)\nи `PAY` (`'pay'`). Старые `user.profile.read` / `accounts.read` /\n`accounts.balances.read` / `transfers.create` / `payments.create` удалены.\n`receive` намеренно отсутствует — это тип интента, и он не требует\nникакого скоупа.\n- **Удалён `AWCommand.PrepareOperation`** из `AWCommand` и `COMMAND_VERSIONS`.\n- Прошлые README описывали событие `operation.succeeded`. Его никогда не было в\n`AWSDKEventMap` — используйте значение, которое вернул\n`requestConfirmation()`, а в проде вебхук AW.\n\n## Лицензия\n\nMIT — см. [LICENSE](./LICENSE).","readmeFilename":"README.ru.md"}