@seams/wallet 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-inputs.sha256 +1 -1
- package/dist/esm/SeamsWeb/index.js +1 -1
- package/dist/esm/SeamsWeb/walletIframe/client/inboundMessages.js +1 -1
- package/dist/esm/SeamsWeb/walletIframe/client/router.js +10 -4
- package/dist/esm/SeamsWeb/walletIframe/coordinator.js +23 -1
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +33 -6
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/icons.js +37 -1
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/presentation.js +1 -0
- package/dist/esm/core/browser/walletIframe/events.js +6 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/appearance.js +27 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/export-private-key-reveal.js +155 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/export-viewer-host.js +209 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/ExportPrivateKeySurface.js +319 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountExportPrivateKeySurface.js +92 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/surface-measurement-binding.js +12 -0
- package/dist/esm/core/ui/messages.js +4 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonView.js +1 -1
- package/dist/esm/react/components/AccountMenuButton/ExportKeysSection.css +20 -0
- package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.css +9 -3
- package/dist/esm/react/components/AccountMenuButton/UserAccountButton.css +1 -0
- package/dist/esm/react/components/AccountMenuButton/Web3AuthProfileButton.css +15 -0
- package/dist/esm/react/styles/styles.css +36 -0
- package/dist/esm/sdk/{ConfirmationDrawer-mu3iThxX.js → ConfirmationDrawer-DCw0m-Iv.js} +1 -1
- package/dist/{public/sdk/adapters-u7LVXthY.js → esm/sdk/adapters-BNmcyf9K.js} +1 -1
- package/dist/esm/sdk/appearance-token-vars-DxBm_cKA.js +2 -0
- package/dist/{public/sdk/export-viewer-host-ivf9LlBo.js → esm/sdk/export-viewer-host-DsdzagKK.js} +1 -1
- package/dist/esm/sdk/{exportKeypairOperation-Gw7L5Htj.js → exportKeypairOperation-BwW_E4Lt.js} +1 -1
- package/dist/esm/sdk/{host-B-2QXolt.js → host-DMR4KDy9.js} +1 -1
- package/dist/esm/sdk/{localOnly-BKpUHtHa.js → localOnly-DO191vDh.js} +1 -1
- package/dist/esm/sdk/{mountExportPrivateKeySurface-C8pUK6PQ.js → mountExportPrivateKeySurface-DQzFzhNu.js} +1 -1
- package/dist/esm/sdk/{mountRecoveryCodeBackupSurface-DUudF89t.js → mountRecoveryCodeBackupSurface-B1D0ovqx.js} +1 -1
- package/dist/esm/sdk/{pendingWalletRecoveryCodeBackup-7tBjuSe7.js → pendingWalletRecoveryCodeBackup-DOeIn_Qj.js} +1 -1
- package/dist/esm/sdk/{registration-CWpOVwhj.js → registration-DknFwoqn.js} +1 -1
- package/dist/esm/sdk/{registration-D2OEgY7O.js → registration-sQndIWRF.js} +1 -1
- package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/esm/sdk/runtime-auth-BxG-J-BB.js +1 -0
- package/dist/esm/sdk/{runtime-device-link-vhRhB-wS.js → runtime-device-link-Dn_5hPCq.js} +1 -1
- package/dist/{public/sdk/runtime-ecdsa-tempo-BXWgFVBa.js → esm/sdk/runtime-ecdsa-tempo-lTFTb9Rh.js} +1 -1
- package/dist/esm/sdk/{runtime-email-otp-BlAaSKtk.js → runtime-email-otp-CPqTCH8Q.js} +1 -1
- package/dist/esm/sdk/{runtime-export-B4FuHhcH.js → runtime-export-Brz53_oi.js} +1 -1
- package/dist/esm/sdk/{runtime-near-BnWOpEpA.js → runtime-near-Da_xFUXx.js} +1 -1
- package/dist/esm/sdk/{runtime-preferences-COm-LTiu.js → runtime-preferences-riUZGaTs.js} +1 -1
- package/dist/esm/sdk/{runtime-recovery-BJTo5Idi.js → runtime-recovery-CTj4nDAM.js} +1 -1
- package/dist/esm/sdk/{runtime-recovery-codes-CEOjdUHV.js → runtime-recovery-codes-D8T9LQ7-.js} +1 -1
- package/dist/esm/sdk/{shared-BKPGtAps.js → shared-hx7KVyeq.js} +1 -1
- package/dist/esm/sdk/tx-confirm-ui.js +4 -0
- package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/esm/sdk/wallet-ui.css +1 -1
- package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/headers.manifest.json +1 -1
- package/dist/public/sdk/{ConfirmationDrawer-mu3iThxX.js → ConfirmationDrawer-DCw0m-Iv.js} +1 -1
- package/dist/{esm/sdk/adapters-u7LVXthY.js → public/sdk/adapters-BNmcyf9K.js} +1 -1
- package/dist/public/sdk/appearance-token-vars-DxBm_cKA.js +2 -0
- package/dist/{esm/sdk/export-viewer-host-ivf9LlBo.js → public/sdk/export-viewer-host-DsdzagKK.js} +1 -1
- package/dist/public/sdk/{exportKeypairOperation-Gw7L5Htj.js → exportKeypairOperation-BwW_E4Lt.js} +1 -1
- package/dist/public/sdk/{host-B-2QXolt.js → host-DMR4KDy9.js} +1 -1
- package/dist/public/sdk/{localOnly-BKpUHtHa.js → localOnly-DO191vDh.js} +1 -1
- package/dist/public/sdk/{mountExportPrivateKeySurface-C8pUK6PQ.js → mountExportPrivateKeySurface-DQzFzhNu.js} +1 -1
- package/dist/public/sdk/{mountRecoveryCodeBackupSurface-DUudF89t.js → mountRecoveryCodeBackupSurface-B1D0ovqx.js} +1 -1
- package/dist/public/sdk/{pendingWalletRecoveryCodeBackup-7tBjuSe7.js → pendingWalletRecoveryCodeBackup-DOeIn_Qj.js} +1 -1
- package/dist/public/sdk/{registration-CWpOVwhj.js → registration-DknFwoqn.js} +1 -1
- package/dist/public/sdk/{registration-D2OEgY7O.js → registration-sQndIWRF.js} +1 -1
- package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/runtime-auth-BxG-J-BB.js +1 -0
- package/dist/public/sdk/{runtime-device-link-vhRhB-wS.js → runtime-device-link-Dn_5hPCq.js} +1 -1
- package/dist/{esm/sdk/runtime-ecdsa-tempo-BXWgFVBa.js → public/sdk/runtime-ecdsa-tempo-lTFTb9Rh.js} +1 -1
- package/dist/public/sdk/{runtime-email-otp-BlAaSKtk.js → runtime-email-otp-CPqTCH8Q.js} +1 -1
- package/dist/public/sdk/{runtime-export-B4FuHhcH.js → runtime-export-Brz53_oi.js} +1 -1
- package/dist/public/sdk/{runtime-near-BnWOpEpA.js → runtime-near-Da_xFUXx.js} +1 -1
- package/dist/public/sdk/{runtime-preferences-COm-LTiu.js → runtime-preferences-riUZGaTs.js} +1 -1
- package/dist/public/sdk/{runtime-recovery-BJTo5Idi.js → runtime-recovery-CTj4nDAM.js} +1 -1
- package/dist/public/sdk/{runtime-recovery-codes-CEOjdUHV.js → runtime-recovery-codes-D8T9LQ7-.js} +1 -1
- package/dist/public/sdk/{shared-BKPGtAps.js → shared-hx7KVyeq.js} +1 -1
- package/dist/public/sdk/tx-confirm-ui.js +4 -0
- package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/public/sdk/wallet-ui.css +1 -1
- package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/dist/public/wallet-assets.manifest.json +46 -46
- package/dist/public/wallet-service/index.html +4 -4
- package/dist/types/wallet/src/SeamsWeb/walletIframe/coordinator.d.ts +2 -1
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/domain.d.ts +20 -3
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/session.d.ts +3 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.d.ts +1 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/ui/auth-menu/icons.d.ts +2 -0
- package/dist/types/wallet/src/core/ui/messages.d.ts +1 -1
- package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/esm/sdk/appearance-token-vars-CzBVbO39.js +0 -2
- package/dist/esm/sdk/runtime-auth-jtyQAuxZ.js +0 -1
- package/dist/public/sdk/appearance-token-vars-CzBVbO39.js +0 -2
- package/dist/public/sdk/runtime-auth-jtyQAuxZ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./events-1dzC4Ocx.js";import{a as t,c as n,d as r,f as i,h as a,l as o,m as s,n as c,o as l,p as u,s as d,t as f,u as p}from"./appearance-token-vars-CzBVbO39.js";import{i as m,n as h,r as g,t as _}from"./ConfirmationDrawer-mu3iThxX.js";function v(e){throw Error(`Unexpected private key reveal state: ${String(e)}`)}function y(e){switch(e){case`secp256k1`:return{prefix:`0x`,alphabet:`0123456789abcdef`,slotCount:64};case`ed25519`:return{prefix:`ed25519:`,alphabet:`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`,slotCount:88};default:return v(e)}}function b(e){return e[Math.floor(Math.random()*e.length)]??e[0]??`x`}function x(e,t){return e+Math.random()*(t-e)}function S(e,t,n){let r=[];for(let i=0;i<e.slotCount;i+=1)r.push({glyph:t?`x`:b(e.alphabet),nextChangeAtMs:t?1/0:n+i*37%90});return r}function C(e,t,n,r){let i=y(t);return{kind:`spinning`,entryKey:e,prefix:i.prefix,alphabet:i.alphabet,slots:S(i,n,r)}}function w(e){if(!e)return``;let t=(e.startsWith(`ed25519:`)?8:0)+6,n=Math.max(t,e.length-6);return`${e.slice(0,t)}${`x`.repeat(n-t)}${e.slice(n)}`}function T(e,t,n){let r=t.startsWith(e.prefix)?e.prefix:``,i=Array.from(t.slice(r.length)),a=i.length===e.slots.length?e.slots:i.map((t,r)=>({glyph:b(e.alphabet),nextChangeAtMs:n+r*37%90}));return{kind:`settling`,entryKey:e.entryKey,prefix:r,alphabet:e.alphabet,slots:a,targetSlots:i,lockedSlots:0,startedAtMs:n}}function E(e,t){let n=Math.max(1,e.targetSlots.length-1),r=0;for(let i=0;i<e.targetSlots.length;i+=1){let a=i/n*700;t>=e.startedAtMs+a+300&&(r+=1)}return r}function D(e,t,n){let r=t/Math.max(1,e.targetSlots.length-1)*700,i=e.startedAtMs+r;return Math.max(0,Math.min(1,(n-i)/300))}function O(e,t,n){let r=null;for(let i=0;i<e.length;i+=1){let a=e[i];!a||n<a.nextChangeAtMs||(r===null&&(r=[...e]),r[i]={glyph:b(t),nextChangeAtMs:n+x(90,150)})}return r??e}function k(e,t,n){let r=null;for(let i=0;i<e.slots.length;i+=1){let a=e.slots[i];if(!a)continue;if(i<t){let t=e.targetSlots[i]??a.glyph;if(a.glyph===t&&a.nextChangeAtMs===1/0)continue;r===null&&(r=[...e.slots]),r[i]={glyph:t,nextChangeAtMs:1/0};continue}if(n<a.nextChangeAtMs)continue;let o=D(e,i,n)*90;r===null&&(r=[...e.slots]),r[i]={glyph:b(e.alphabet),nextChangeAtMs:n+x(90+o,150+o)}}return r??e.slots}function A(e,t){if(e.kind===`spinning`){let n=O(e.slots,e.alphabet,t);return n===e.slots?e:{...e,slots:n}}if(e.kind===`settling`){let n=E(e,t);if(n>=e.targetSlots.length)return{kind:`settled`,entryKey:e.entryKey};let r=k(e,n,t);return r===e.slots&&n===e.lockedSlots?e:{...e,slots:r,lockedSlots:n}}return v(e)}function j({model:e,onClose:t}){let n=d(),i=e.kind===`failed`?[]:e.entries,a=i.length===0||i.some(M);return o(`div`,{class:`seams-export-key-viewer`,"data-seams-drawer-no-drag":!0,onPointerDown:P,onMouseDown:P,onTouchStart:P,children:o(`div`,{class:`content`,children:[o(`div`,{class:`seams-export-header`,children:[o(`h2`,{class:`title`,children:o(l,{message:`Exported Keys`})}),t&&o(`button`,{type:`button`,class:`seams-export-modal-close`,"aria-label":r(n,`Close exported keys`),onClick:t,children:`×`})]}),e.kind===`failed`&&o(`div`,{class:`error-banner`,role:`alert`,children:o(l,{copy:e.message})}),o(`div`,{class:`fields`,children:[a&&o(`div`,{class:`field`,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Near Account ID`})}),o(`div`,{class:`field-value`,children:o(`span`,{class:`value`,children:e.accountId||`—`})})]}),i.length>0?i.map(N):o(`div`,{class:`field`,children:o(`div`,{class:`field-value`,children:o(`span`,{class:`muted`,children:e.kind===`loading`?o(l,{message:`Preparing private key…`}):o(l,{message:`No keys available`})})})})]}),e.guidance&&o(F,{guidance:e.guidance}),o(`div`,{class:`warning`,children:o(l,{message:`Warning: your private keys grant full control of your account and funds. Keep it in a secret place.`})})]})})}function M(e){return e.scheme===`ed25519`}function N(e){return o(L,{entry:e},e.id)}function P(e){e.stopPropagation()}function F({guidance:e}){return o(`div`,{class:`warning`,children:[o(`strong`,{children:o(l,{copy:e.title||`Next Steps`})}),e.body&&o(`div`,{children:o(l,{copy:e.body})}),e.steps?.length?o(`ol`,{children:e.steps.map(I)}):null]})}function I(e,t){return o(`li`,{children:o(l,{copy:e})},t)}var L=class extends i{static contextType=t;state={reveal:null,publicCopied:!1,privateCopied:!1};root=u();frame=null;timers=new Map;generation=0;copyLifetime=new AbortController;active=!1;componentDidMount(){this.active=!0,this.reset(this.props.entry)}componentWillReceiveProps(e){R(this.props.entry,e.entry)||this.reset(e.entry)}componentDidUpdate(){this.schedule()}componentWillUnmount(){this.active=!1,this.clearPending(),this.state.reveal=null}clearPending(){this.generation+=1,this.copyLifetime.abort();let e=this.root.current?.ownerDocument.defaultView;this.frame!==null&&e?.cancelAnimationFrame(this.frame),this.frame=null;for(let t of this.timers.values())e?.clearTimeout(t);this.timers.clear()}reset(e){this.clearPending(),this.copyLifetime=new AbortController;let t=this.root.current.ownerDocument.defaultView,n=t.matchMedia(`(prefers-reduced-motion: reduce)`).matches,r=t.performance.now(),i=null;switch(e.material.kind){case`loading`:i=C(e.id,e.scheme,n,r);break;case`ready`:i=n?{kind:`settled`,entryKey:e.id}:T(C(e.id,e.scheme,!1,r),w(e.material.value),r);break;case`unavailable`:break;default:H(e.material)}this.setState({reveal:i,publicCopied:!1,privateCopied:!1})}schedule(){let e=this.state.reveal;if(!this.active||this.frame!==null||!e||e.kind===`settled`)return;let t=this.root.current.ownerDocument.defaultView;t.matchMedia(`(prefers-reduced-motion: reduce)`).matches||(this.frame=t.requestAnimationFrame(this.tick))}tick=e=>{this.frame=null;let t=this.state.reveal;if(!this.active||!t||t.kind===`settled`)return;let n=A(t,e);n!==t&&this.setState({reveal:n}),this.schedule()};copyPublic=()=>{this.copy(`public`)};copyPrivate=()=>{this.copy(`private`)};clearPublic=()=>{this.timers.delete(`public`),this.active&&this.setState({publicCopied:!1})};clearPrivate=()=>{this.timers.delete(`private`),this.active&&this.setState({privateCopied:!1})};async copy(e){let t=this.props.entry;if(!this.active||e===`private`&&(t.material.kind!==`ready`||this.state.reveal?.kind!==`settled`))return;let n=t.publicKey;if(e===`private`){if(t.material.kind!==`ready`)return;n=t.material.value}if(!n)return;let r=this.generation,i=this.root.current,a=i.ownerDocument.defaultView;if(a.focus(),!await m(i,n,this.copyLifetime.signal).catch(z)||!this.active||r!==this.generation)return;let o=this.timers.get(e);o!==void 0&&a.clearTimeout(o),e===`public`?this.setState({publicCopied:!0}):this.setState({privateCopied:!0}),this.timers.set(e,a.setTimeout(e===`public`?this.clearPublic:this.clearPrivate,3e3))}render(){let e=this.props.entry,t=e.material.kind===`ready`&&this.state.reveal?.kind===`settled`;return o(`div`,{class:`key-card`,ref:this.root,children:[o(`div`,{class:`key-title`,children:o(l,{copy:e.label})}),e.address&&o(`div`,{class:`field`,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Address`})}),o(`div`,{class:`field-value`,children:o(`span`,{class:`value`,children:e.address})})]}),e.scheme===`ed25519`&&o(`button`,{type:`button`,class:`field copy-field${this.state.publicCopied?` copied`:``}`,"aria-label":p(this.context,this.state.publicCopied?`Public key copied`:`Copy public key`),disabled:!e.publicKey,onClick:this.copyPublic,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Public Key`})}),o(`div`,{class:`field-value`,children:[o(`span`,{class:`value`,children:e.publicKey||`—`}),o(g,{})]})]}),o(`button`,{type:`button`,class:`field copy-field${this.state.privateCopied?` copied`:``}`,"aria-label":p(this.context,this.state.privateCopied?`Private key copied`:`Copy private key`),disabled:!t,onClick:this.copyPrivate,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Private Key`})}),o(`div`,{class:`field-value`,children:[o(`span`,{class:`value private-key`,children:o(B,{material:e.material,reveal:this.state.reveal})}),o(g,{})]})]})]})}};function R(e,t){return e.id===t.id&&e.scheme===t.scheme&&e.publicKey===t.publicKey&&e.material.kind===t.material.kind&&e.material.value===t.material.value}function z(){return!1}function B({material:e,reveal:t}){return t&&t.kind!==`settled`?o(a,{children:[o(`span`,{class:`private-key-reel`,"aria-hidden":`true`,children:[o(`span`,{class:`reel-prefix`,children:t.prefix}),V(t)]}),o(`span`,{class:`seams-sr-only`,role:`status`,children:o(l,{message:`Decrypting private key`})})]}):e.kind===`ready`?o(a,{children:[o(`span`,{children:w(e.value)}),o(`span`,{class:`seams-sr-only`,role:`status`,children:o(l,{message:`Private key ready`})})]}):o(`span`,{class:`muted`,children:`—`})}function V(e){let t=e.kind===`settling`?e.lockedSlots:0,n=[];for(let r=0;r<e.slots.length;r+=1)n.push(o(`span`,{class:`reel-slot${r<t?` settled`:``}`,children:e.slots[r].glyph},r));return n}function H(e){throw Error(`Unexpected export key material: ${String(e)}`)}let U=0;var W=class{element;styles;context;state;constructor(t){this.styles=c(t.parent.ownerDocument),this.context=t.context,this.state={kind:`mounted`,onClosed:t.onClosed},this.element=t.parent.ownerDocument.createElement(`div`),this.element.id=`seams-export-surface-${++U}`,this.element.className=`seams-wallet-ui seams-export-surface`,this.element.dataset.seamsExportSurface=t.context,this.element.addEventListener(e.TX_CONFIRMER_CANCEL,this.handleCancel),t.parent.appendChild(this.element);try{this.update(t.model)}catch(e){throw this.remove(),e}}update(e){if(this.state.kind!==`disposed`){if(this.element.lang=e.appearance.locale??`en`,this.element.dataset.theme=e.appearance.theme.mode,this.element.dataset.seamsExportVariant=e.variant,this.styles.setDynamicRule(this.element.id,f(this.element.id,e.appearance)),e.variant===`modal`){s(n(e.appearance.locale??`en`,o(h,{context:this.context,label:`Exported Keys`,onCancel:this.dispose,children:o(j,{model:e.content,onClose:this.dispose})})),this.element);return}s(n(e.appearance.locale??`en`,o(_,{context:this.context,label:`Exported Keys`,dismissOnBackdrop:!1,styles:this.styles,state:{kind:`open`,interaction:`ready`},onCancel:this.dispose,children:o(j,{model:e.content})})),this.element)}}dispose=()=>{if(this.state.kind===`disposed`)return;let e=this.state.onClosed;this.remove(),e()};handleCancel=()=>{this.dispose()};remove(){this.state={kind:`disposed`},this.element.removeEventListener(e.TX_CONFIRMER_CANCEL,this.handleCancel),s(null,this.element),this.styles.deleteDynamicRule(this.element.id),this.element.remove()}};function G(e){return new W(e)}export{G as mountExportPrivateKeySurface};
|
|
1
|
+
import{t as e}from"./events-1dzC4Ocx.js";import{a as t,c as n,d as r,f as i,h as a,l as o,m as s,n as c,o as l,p as u,s as d,t as f,u as p}from"./appearance-token-vars-DxBm_cKA.js";import{i as m,n as h,r as g,t as _}from"./ConfirmationDrawer-DCw0m-Iv.js";function v(e){throw Error(`Unexpected private key reveal state: ${String(e)}`)}function y(e){switch(e){case`secp256k1`:return{prefix:`0x`,alphabet:`0123456789abcdef`,slotCount:64};case`ed25519`:return{prefix:`ed25519:`,alphabet:`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`,slotCount:88};default:return v(e)}}function b(e){return e[Math.floor(Math.random()*e.length)]??e[0]??`x`}function x(e,t){return e+Math.random()*(t-e)}function S(e,t,n){let r=[];for(let i=0;i<e.slotCount;i+=1)r.push({glyph:t?`x`:b(e.alphabet),nextChangeAtMs:t?1/0:n+i*37%90});return r}function C(e,t,n,r){let i=y(t);return{kind:`spinning`,entryKey:e,prefix:i.prefix,alphabet:i.alphabet,slots:S(i,n,r)}}function w(e){if(!e)return``;let t=(e.startsWith(`ed25519:`)?8:0)+6,n=Math.max(t,e.length-6);return`${e.slice(0,t)}${`x`.repeat(n-t)}${e.slice(n)}`}function T(e,t,n){let r=t.startsWith(e.prefix)?e.prefix:``,i=Array.from(t.slice(r.length)),a=i.length===e.slots.length?e.slots:i.map((t,r)=>({glyph:b(e.alphabet),nextChangeAtMs:n+r*37%90}));return{kind:`settling`,entryKey:e.entryKey,prefix:r,alphabet:e.alphabet,slots:a,targetSlots:i,lockedSlots:0,startedAtMs:n}}function E(e,t){let n=Math.max(1,e.targetSlots.length-1),r=0;for(let i=0;i<e.targetSlots.length;i+=1){let a=i/n*700;t>=e.startedAtMs+a+300&&(r+=1)}return r}function D(e,t,n){let r=t/Math.max(1,e.targetSlots.length-1)*700,i=e.startedAtMs+r;return Math.max(0,Math.min(1,(n-i)/300))}function O(e,t,n){let r=null;for(let i=0;i<e.length;i+=1){let a=e[i];!a||n<a.nextChangeAtMs||(r===null&&(r=[...e]),r[i]={glyph:b(t),nextChangeAtMs:n+x(90,150)})}return r??e}function k(e,t,n){let r=null;for(let i=0;i<e.slots.length;i+=1){let a=e.slots[i];if(!a)continue;if(i<t){let t=e.targetSlots[i]??a.glyph;if(a.glyph===t&&a.nextChangeAtMs===1/0)continue;r===null&&(r=[...e.slots]),r[i]={glyph:t,nextChangeAtMs:1/0};continue}if(n<a.nextChangeAtMs)continue;let o=D(e,i,n)*90;r===null&&(r=[...e.slots]),r[i]={glyph:b(e.alphabet),nextChangeAtMs:n+x(90+o,150+o)}}return r??e.slots}function A(e,t){if(e.kind===`spinning`){let n=O(e.slots,e.alphabet,t);return n===e.slots?e:{...e,slots:n}}if(e.kind===`settling`){let n=E(e,t);if(n>=e.targetSlots.length)return{kind:`settled`,entryKey:e.entryKey};let r=k(e,n,t);return r===e.slots&&n===e.lockedSlots?e:{...e,slots:r,lockedSlots:n}}return v(e)}function j({model:e,onClose:t}){let n=d(),i=e.kind===`failed`?[]:e.entries,a=i.length===0||i.some(M);return o(`div`,{class:`seams-export-key-viewer`,"data-seams-drawer-no-drag":!0,onPointerDown:P,onMouseDown:P,onTouchStart:P,children:o(`div`,{class:`content`,children:[o(`div`,{class:`seams-export-header`,children:[o(`h2`,{class:`title`,children:o(l,{message:`Exported Keys`})}),t&&o(`button`,{type:`button`,class:`seams-export-modal-close`,"aria-label":r(n,`Close exported keys`),onClick:t,children:`×`})]}),e.kind===`failed`&&o(`div`,{class:`error-banner`,role:`alert`,children:o(l,{copy:e.message})}),o(`div`,{class:`fields`,children:[a&&o(`div`,{class:`field`,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Near Account ID`})}),o(`div`,{class:`field-value`,children:o(`span`,{class:`value`,children:e.accountId||`—`})})]}),i.length>0?i.map(N):o(`div`,{class:`field`,children:o(`div`,{class:`field-value`,children:o(`span`,{class:`muted`,children:e.kind===`loading`?o(l,{message:`Preparing private key…`}):o(l,{message:`No keys available`})})})})]}),e.guidance&&o(F,{guidance:e.guidance}),o(`div`,{class:`warning`,children:o(l,{message:`Warning: your private keys grant full control of your account and funds. Keep it in a secret place.`})})]})})}function M(e){return e.scheme===`ed25519`}function N(e){return o(L,{entry:e},e.id)}function P(e){e.stopPropagation()}function F({guidance:e}){return o(`div`,{class:`warning`,children:[o(`strong`,{children:o(l,{copy:e.title||`Next Steps`})}),e.body&&o(`div`,{children:o(l,{copy:e.body})}),e.steps?.length?o(`ol`,{children:e.steps.map(I)}):null]})}function I(e,t){return o(`li`,{children:o(l,{copy:e})},t)}var L=class extends i{static contextType=t;state={reveal:null,publicCopied:!1,privateCopied:!1};root=u();frame=null;timers=new Map;generation=0;copyLifetime=new AbortController;active=!1;componentDidMount(){this.active=!0,this.reset(this.props.entry)}componentWillReceiveProps(e){R(this.props.entry,e.entry)||this.reset(e.entry)}componentDidUpdate(){this.schedule()}componentWillUnmount(){this.active=!1,this.clearPending(),this.state.reveal=null}clearPending(){this.generation+=1,this.copyLifetime.abort();let e=this.root.current?.ownerDocument.defaultView;this.frame!==null&&e?.cancelAnimationFrame(this.frame),this.frame=null;for(let t of this.timers.values())e?.clearTimeout(t);this.timers.clear()}reset(e){this.clearPending(),this.copyLifetime=new AbortController;let t=this.root.current.ownerDocument.defaultView,n=t.matchMedia(`(prefers-reduced-motion: reduce)`).matches,r=t.performance.now(),i=null;switch(e.material.kind){case`loading`:i=C(e.id,e.scheme,n,r);break;case`ready`:i=n?{kind:`settled`,entryKey:e.id}:T(C(e.id,e.scheme,!1,r),w(e.material.value),r);break;case`unavailable`:break;default:H(e.material)}this.setState({reveal:i,publicCopied:!1,privateCopied:!1})}schedule(){let e=this.state.reveal;if(!this.active||this.frame!==null||!e||e.kind===`settled`)return;let t=this.root.current.ownerDocument.defaultView;t.matchMedia(`(prefers-reduced-motion: reduce)`).matches||(this.frame=t.requestAnimationFrame(this.tick))}tick=e=>{this.frame=null;let t=this.state.reveal;if(!this.active||!t||t.kind===`settled`)return;let n=A(t,e);n!==t&&this.setState({reveal:n}),this.schedule()};copyPublic=()=>{this.copy(`public`)};copyPrivate=()=>{this.copy(`private`)};clearPublic=()=>{this.timers.delete(`public`),this.active&&this.setState({publicCopied:!1})};clearPrivate=()=>{this.timers.delete(`private`),this.active&&this.setState({privateCopied:!1})};async copy(e){let t=this.props.entry;if(!this.active||e===`private`&&(t.material.kind!==`ready`||this.state.reveal?.kind!==`settled`))return;let n=t.publicKey;if(e===`private`){if(t.material.kind!==`ready`)return;n=t.material.value}if(!n)return;let r=this.generation,i=this.root.current,a=i.ownerDocument.defaultView;if(a.focus(),!await m(i,n,this.copyLifetime.signal).catch(z)||!this.active||r!==this.generation)return;let o=this.timers.get(e);o!==void 0&&a.clearTimeout(o),e===`public`?this.setState({publicCopied:!0}):this.setState({privateCopied:!0}),this.timers.set(e,a.setTimeout(e===`public`?this.clearPublic:this.clearPrivate,3e3))}render(){let e=this.props.entry,t=e.material.kind===`ready`&&this.state.reveal?.kind===`settled`;return o(`div`,{class:`key-card`,ref:this.root,children:[o(`div`,{class:`key-title`,children:o(l,{copy:e.label})}),e.address&&o(`div`,{class:`field`,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Address`})}),o(`div`,{class:`field-value`,children:o(`span`,{class:`value`,children:e.address})})]}),e.scheme===`ed25519`&&o(`button`,{type:`button`,class:`field copy-field${this.state.publicCopied?` copied`:``}`,"aria-label":p(this.context,this.state.publicCopied?`Public key copied`:`Copy public key`),disabled:!e.publicKey,onClick:this.copyPublic,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Public Key`})}),o(`div`,{class:`field-value`,children:[o(`span`,{class:`value`,children:e.publicKey||`—`}),o(g,{})]})]}),o(`button`,{type:`button`,class:`field copy-field${this.state.privateCopied?` copied`:``}`,"aria-label":p(this.context,this.state.privateCopied?`Private key copied`:`Copy private key`),disabled:!t,onClick:this.copyPrivate,children:[o(`div`,{class:`field-label`,children:o(l,{message:`Private Key`})}),o(`div`,{class:`field-value`,children:[o(`span`,{class:`value private-key`,children:o(B,{material:e.material,reveal:this.state.reveal})}),o(g,{})]})]})]})}};function R(e,t){return e.id===t.id&&e.scheme===t.scheme&&e.publicKey===t.publicKey&&e.material.kind===t.material.kind&&e.material.value===t.material.value}function z(){return!1}function B({material:e,reveal:t}){return t&&t.kind!==`settled`?o(a,{children:[o(`span`,{class:`private-key-reel`,"aria-hidden":`true`,children:[o(`span`,{class:`reel-prefix`,children:t.prefix}),V(t)]}),o(`span`,{class:`seams-sr-only`,role:`status`,children:o(l,{message:`Decrypting private key`})})]}):e.kind===`ready`?o(a,{children:[o(`span`,{children:w(e.value)}),o(`span`,{class:`seams-sr-only`,role:`status`,children:o(l,{message:`Private key ready`})})]}):o(`span`,{class:`muted`,children:`—`})}function V(e){let t=e.kind===`settling`?e.lockedSlots:0,n=[];for(let r=0;r<e.slots.length;r+=1)n.push(o(`span`,{class:`reel-slot${r<t?` settled`:``}`,children:e.slots[r].glyph},r));return n}function H(e){throw Error(`Unexpected export key material: ${String(e)}`)}let U=0;var W=class{element;styles;context;state;constructor(t){this.styles=c(t.parent.ownerDocument),this.context=t.context,this.state={kind:`mounted`,onClosed:t.onClosed},this.element=t.parent.ownerDocument.createElement(`div`),this.element.id=`seams-export-surface-${++U}`,this.element.className=`seams-wallet-ui seams-export-surface`,this.element.dataset.seamsExportSurface=t.context,this.element.addEventListener(e.TX_CONFIRMER_CANCEL,this.handleCancel),t.parent.appendChild(this.element);try{this.update(t.model)}catch(e){throw this.remove(),e}}update(e){if(this.state.kind!==`disposed`){if(this.element.lang=e.appearance.locale??`en`,this.element.dataset.theme=e.appearance.theme.mode,this.element.dataset.seamsExportVariant=e.variant,this.styles.setDynamicRule(this.element.id,f(this.element.id,e.appearance)),e.variant===`modal`){s(n(e.appearance.locale??`en`,o(h,{context:this.context,label:`Exported Keys`,onCancel:this.dispose,children:o(j,{model:e.content,onClose:this.dispose})})),this.element);return}s(n(e.appearance.locale??`en`,o(_,{context:this.context,label:`Exported Keys`,dismissOnBackdrop:!1,styles:this.styles,state:{kind:`open`,interaction:`ready`},onCancel:this.dispose,children:o(j,{model:e.content})})),this.element)}}dispose=()=>{if(this.state.kind===`disposed`)return;let e=this.state.onClosed;this.remove(),e()};handleCancel=()=>{this.dispose()};remove(){this.state={kind:`disposed`},this.element.removeEventListener(e.TX_CONFIRMER_CANCEL,this.handleCancel),s(null,this.element),this.styles.deleteDynamicRule(this.element.id),this.element.remove()}};function G(e){return new W(e)}export{G as mountExportPrivateKeySurface};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,h as i,l as a,m as o,n as s,o as c,p as l,t as u}from"./appearance-token-vars-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,h as i,l as a,m as o,n as s,o as c,p as l,t as u}from"./appearance-token-vars-DxBm_cKA.js";function d(e){throw Error(`Unhandled recovery-code state: ${String(e)}`)}function f(e,t){return e instanceof Error&&e.message.trim()?e.message:t}function p(e){switch(e.kind){case`direct_backup`:return{kind:`recovery_codes`,request:e.request};case`account_menu`:return{kind:`summary`,walletId:e.walletId,loadState:{kind:`loading`},actionError:null};default:return d(e)}}function m(e){return{viewState:p(e),acknowledged:!1,statusMessage:``,copied:!1}}function h(e){switch(e.kind){case`summary`:case`opening`:case`recovery_codes`:return e.kind;default:return d(e)}}function g(e){switch(e.kind){case`ready`:return e.pendingLocalBackup||e.backupOutstanding?`Backup needed`:`Backed up`;case`no_recovery_set`:return`No recovery set`;case`unauthorized`:return`Authorization required`;case`transport_failed`:return`Could not load`;default:return d(e)}}function _(e){if(e.kind!==`loaded`)return!0;switch(e.status.kind){case`ready`:return e.status.pendingLocalBackup;case`unauthorized`:case`transport_failed`:return!0;case`no_recovery_set`:return!1;default:return d(e.status)}}function v(e){if(e.kind===`error`)return e.message;if(e.kind!==`loaded`)return null;switch(e.status.kind){case`unauthorized`:case`transport_failed`:return e.status.message;case`ready`:case`no_recovery_set`:return null;default:return d(e.status)}}function y(e){switch(e.kind){case`loading`:return`Loading`;case`error`:return`Could not load`;case`loaded`:return g(e.status);default:return d(e)}}function b(e){switch(e.kind){case`loading`:return`Checking your codes…`;case`error`:return`Status unavailable`;case`loaded`:return e.status.kind===`ready`?`${e.status.activeCodeCount} of ${e.status.totalCodeCount} codes left`:`Status unavailable`;default:return d(e)}}function x(e){return e.trim().replace(/[^A-Za-z0-9_.-]/g,`_`)||`wallet`}function S(e,t){let n=[`Seams wallet recovery codes`,``,`Wallet: ${e}`,``,`Save these codes somewhere private. Each code can be used once.`,``];for(let[e,r]of t.entries())n.push(`${String(e+1).padStart(2,`0`)} ${r}`);return`${n.join(`
|
|
2
2
|
`)}\n`}function C(e,t){return t?`Finish backup`:e.continuation===`registration_may_defer`?`Back up later`:`Close`}function w(e,t){return a(`li`,{class:`recovery-code-item`,children:[a(`span`,{class:`recovery-code-index`,children:t+1}),a(`span`,{class:`recovery-code-value`,children:e})]},`${t}-${e}`)}var T=class extends r{static contextType=e;state=m(this.props.experience);root=l();active=!1;loadGeneration=0;copiedResetTimer=null;focusFrame=null;componentDidMount(){this.active=!0,this.loadGeneration+=1,this.notifyStage(),this.beginAccountStatus(this.props.experience,this.loadGeneration)}componentWillReceiveProps(e){e.experience!==this.props.experience&&(this.loadGeneration+=1,this.clearFocusFrame(),this.clearCopiedFlash(),this.setState(m(e.experience)),this.beginAccountStatus(e.experience,this.loadGeneration))}componentDidUpdate(e,t){h(t.viewState)!==h(this.state.viewState)&&this.notifyStage(),t.viewState.kind!==`recovery_codes`&&this.state.viewState.kind===`recovery_codes`&&this.focusTitleAfterRender()}componentWillUnmount(){this.active=!1,this.loadGeneration+=1,this.clearFocusFrame(),this.clearCopiedFlash()}render(){let e=this.state.viewState,t=h(e),n=e.kind===`recovery_codes`?this.renderRecoveryCodes(e.request):this.renderSummary(e);return a(`div`,{ref:this.root,class:`seams-recovery-code-backup-viewer`,"data-seams-recovery-entry":this.props.experience.kind,"data-seams-recovery-stage":t,children:n})}notifyStage(){this.props.onStageChange(h(this.state.viewState))}beginAccountStatus(e,t){e.kind===`account_menu`&&this.loadSummaryStatus(e,t)}async loadSummaryStatus(e,t){try{let n=await e.loadStatus();this.updateSummaryLoadState(t,{kind:`loaded`,status:n})}catch(e){this.updateSummaryLoadState(t,{kind:`error`,message:f(e,`Could not load recovery-code status`)})}}updateSummaryLoadState(e,t){if(!this.active||e!==this.loadGeneration)return;let n=this.state.viewState;n.kind!==`summary`&&n.kind!==`opening`||this.setState({viewState:{...n,loadState:t}})}retryStatus=()=>{let e=this.props.experience;if(e.kind!==`account_menu`)return;let t=this.state.viewState;if(t.kind!==`summary`)return;let n=++this.loadGeneration;this.setState({viewState:{...t,loadState:{kind:`loading`},actionError:null}}),this.loadSummaryStatus(e,n)};openRecoveryCodes=async()=>{let e=this.props.experience,t=this.state.viewState;if(e.kind!==`account_menu`||t.kind!==`summary`)return;let n=this.loadGeneration;this.setState({viewState:{...t,kind:`opening`,actionError:null}});try{let r=await e.loadPendingBackup();if(!this.active||n!==this.loadGeneration)return;if(!r){this.setState({viewState:{...t,actionError:`Recovery codes are no longer available on this device.`}});return}this.setState({viewState:{kind:`recovery_codes`,request:r}})}catch(e){if(!this.active||n!==this.loadGeneration)return;this.setState({viewState:{...t,actionError:f(e,`Could not open recovery codes`)}})}};closeSummary=()=>{this.props.onClose({kind:`dismissed`})};closeRecoveryCodes=()=>{this.props.onClose({kind:`recovery_codes`,acknowledged:this.state.acknowledged})};onAcknowledgementChange=e=>{e.currentTarget instanceof HTMLInputElement&&this.setState({acknowledged:e.currentTarget.checked})};download=()=>{let e=this.state.viewState;if(e.kind!==`recovery_codes`)return;let t=this.root.current?.ownerDocument.defaultView;if(!t)return;let{walletId:n,recoveryCodes:r}=e.request;try{let e=t.URL.createObjectURL(new t.Blob([S(n,r)],{type:`text/plain;charset=utf-8`})),i=t.document.createElement(`a`);i.href=e,i.download=`seams-wallet-recovery-codes-${x(n)}.txt`;try{i.click()}finally{t.setTimeout(()=>t.URL.revokeObjectURL(e),0)}this.setState({statusMessage:`Recovery codes downloaded.`})}catch{this.setState({statusMessage:`Unable to download the codes. Copy them or try again.`})}};copy=async()=>{let e=this.state.viewState;if(e.kind!==`recovery_codes`||!this.active)return;let{walletId:t,recoveryCodes:n}=e.request,r=this.loadGeneration;try{if(await navigator.clipboard.writeText(S(t,n)),!this.active||r!==this.loadGeneration)return;this.setState({statusMessage:`Recovery codes copied.`}),this.flashCopied()}catch{if(!this.active||r!==this.loadGeneration)return;this.setState({statusMessage:`Unable to copy the codes. Download them or try again.`})}};flashCopied(){let e=this.root.current?.ownerDocument.defaultView;e&&(this.copiedResetTimer!==null&&e.clearTimeout(this.copiedResetTimer),this.setState({copied:!0}),this.copiedResetTimer=e.setTimeout(()=>{this.copiedResetTimer=null,this.active&&this.setState({copied:!1})},1800))}clearCopiedFlash(){let e=this.root.current?.ownerDocument.defaultView;e&&this.copiedResetTimer!==null&&e.clearTimeout(this.copiedResetTimer),this.copiedResetTimer=null}clearFocusFrame(){let e=this.root.current?.ownerDocument.defaultView;e&&this.focusFrame!==null&&e.cancelAnimationFrame(this.focusFrame),this.focusFrame=null}focusTitleAfterRender(){let e=this.root.current?.ownerDocument.defaultView;e&&(this.clearFocusFrame(),this.focusFrame=e.requestAnimationFrame(()=>{this.focusFrame=null,this.active&&this.root.current?.querySelector(`.recovery-backup-title`)?.focus()}))}renderSummary(e){let t=v(e.loadState),r=_(e.loadState),o=e.kind===`opening`;return a(i,{children:[a(`button`,{type:`button`,class:`recovery-summary-close`,"aria-label":n(this.context,`Close recovery codes`),onClick:this.closeSummary,children:a(`svg`,{"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,children:a(`path`,{d:`M6 6l12 12M18 6 6 18`})})}),a(`h1`,{id:`seams-wallet-recovery-title`,class:`recovery-backup-title`,tabIndex:-1,children:a(c,{message:`Wallet recovery codes`})}),a(`p`,{id:`seams-wallet-recovery-description`,class:`recovery-backup-description`,children:a(c,{message:`View and save the recovery codes retained by this wallet after registration.`})}),a(`div`,{class:`recovery-summary-body`,children:[a(`h2`,{class:`recovery-summary-section-label`,children:a(c,{message:`Security`})}),a(`div`,{class:`recovery-summary-item`,children:[a(`span`,{class:`recovery-summary-item-icon`,"aria-hidden":`true`,children:a(E,{})}),a(`span`,{class:`recovery-summary-item-text`,children:[a(`span`,{class:`recovery-summary-item-title`,children:a(c,{message:`Recovery codes`})}),a(`span`,{class:`recovery-summary-item-detail`,children:a(c,{copy:b(e.loadState)})})]}),a(`span`,{class:`recovery-summary-badge`,children:a(c,{copy:y(e.loadState)})})]}),a(`div`,{class:`recovery-summary-item`,children:[a(`span`,{class:`recovery-summary-item-icon`,"aria-hidden":`true`,children:a(D,{})}),a(`span`,{class:`recovery-summary-item-text`,children:[a(`span`,{class:`recovery-summary-item-title`,children:a(c,{message:`Wallet`})}),a(`span`,{class:`recovery-summary-item-detail`,children:e.walletId})]})]}),r&&a(`button`,{type:`button`,class:`recovery-backup-button secondary recovery-summary-open`,disabled:o,onClick:this.openRecoveryCodes,children:o?a(i,{children:[a(c,{message:`Opening recovery codes`}),a(`span`,{class:`recovery-summary-ellipsis`,"aria-hidden":`true`,children:[a(`span`,{children:`.`}),a(`span`,{children:`.`}),a(`span`,{children:`.`})]})]}):a(c,{message:`View recovery codes`})}),a(`p`,{class:`recovery-summary-live-status`,role:`status`,"aria-live":`polite`,children:e.loadState.kind===`loading`?a(c,{message:`Loading recovery-code status…`}):``}),t&&a(`p`,{class:`recovery-summary-error`,role:`alert`,children:a(c,{copy:t})}),e.actionError&&a(`p`,{class:`recovery-summary-error`,role:`alert`,children:a(c,{copy:e.actionError})}),e.loadState.kind===`error`&&a(`button`,{type:`button`,class:`recovery-backup-button secondary`,onClick:this.retryStatus,children:a(c,{message:`Retry status`})})]})]})}renderRecoveryCodes(e){let t=e.continuation===`registration_may_defer`?`Each code can recover your wallet once. Save them now, or back them up later from Recovery Codes.`:`Each code can recover your wallet once. Keep them somewhere private.`;return a(i,{children:[a(`h1`,{id:`seams-wallet-recovery-title`,class:`recovery-backup-title`,tabIndex:-1,children:a(c,{message:`Save your recovery codes`})}),a(`p`,{id:`seams-wallet-recovery-description`,class:`recovery-backup-description`,children:a(c,{copy:t})}),a(`div`,{class:`recovery-code-sheet`,children:[a(`div`,{class:`recovery-code-sheet-heading`,children:[a(`span`,{children:a(c,{message:`Recovery codes`})}),a(`span`,{children:a(c,{message:`{value0} single-use codes`,values:{value0:e.recoveryCodes.length}})})]}),a(`ol`,{class:`recovery-code-list`,children:e.recoveryCodes.map(w)})]}),a(`div`,{class:`recovery-backup-actions`,children:[a(`button`,{type:`button`,class:`recovery-backup-button primary`,onClick:this.download,children:a(c,{message:`Download codes`})}),a(`button`,{type:`button`,class:`recovery-backup-button secondary recovery-backup-copy${this.state.copied?` copied`:``}`,onClick:this.copy,children:[a(O,{}),a(c,{message:`Copy codes`})]})]}),a(`div`,{class:`recovery-backup-footer`,children:[a(`label`,{class:`recovery-backup-acknowledgement`,children:[a(`input`,{type:`checkbox`,"data-seams-wallet-recovery-backup-acknowledgement":!0,checked:this.state.acknowledged,onChange:this.onAcknowledgementChange}),a(`span`,{children:[a(c,{message:`I saved these recovery codes somewhere safe.`}),a(`small`,{children:a(c,{message:`They won’t be shown again after you finish.`})})]})]}),a(`button`,{type:`button`,class:`recovery-backup-button ${this.state.acknowledged?`primary`:`secondary`}`,"data-seams-wallet-recovery-backup-close":!0,onClick:this.closeRecoveryCodes,children:a(c,{copy:C(e,this.state.acknowledged)})})]}),a(`p`,{class:`recovery-backup-status`,role:`status`,children:a(c,{copy:this.state.statusMessage})})]})}};function E(){return a(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,children:[a(`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}),a(`path`,{d:`m9 12 2 2 4-4`})]})}function D(){return a(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,children:[a(`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`}),a(`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`})]})}function O(){return a(`span`,{class:`copy-icon`,"aria-hidden":`true`,children:[a(`span`,{class:`copy-icon-check`,children:a(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,children:a(`path`,{d:`M20 6 9 17l-5-5`})})}),a(`span`,{class:`copy-icon-copy`,children:a(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,children:[a(`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`}),a(`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`})]})})]})}let k=0;var A=class{element;dialog;document;input;state=`mounted`;constructor(e){this.input=e,this.document=e.parent.ownerDocument,this.element=this.document.createElement(`div`),this.element.id=`seams-recovery-surface-${++k}`,this.element.className=`seams-wallet-ui seams-recovery-code-backup-host`,this.element.lang=e.appearance?.locale??`en`,this.element.dataset.seamsRecoverySurface=e.surface,e.appearance&&(this.element.dataset.theme=e.appearance.theme.mode,s(this.document).setDynamicRule(this.element.id,u(this.element.id,e.appearance))),this.dialog=this.document.createElement(`dialog`),this.dialog.className=`seams-host-themed-dialog`,this.dialog.tabIndex=-1,this.dialog.setAttribute(`data-seams-wallet-recovery-backup-dialog`,``),this.dialog.dataset.seamsRecoverySurface=e.surface,this.dialog.setAttribute(`aria-labelledby`,`seams-wallet-recovery-title`),this.dialog.setAttribute(`aria-describedby`,`seams-wallet-recovery-description`),this.dialog.addEventListener(`cancel`,this.handleCancel),this.element.appendChild(this.dialog),e.parent.appendChild(this.element);try{this.render(e.experience),this.dialog.showModal(),this.focusTitle(),e.onShown(this.dialog)}catch(e){throw this.dispose(),e}}update(e){this.state!==`disposed`&&this.render(e)}dispose(){this.state!==`disposed`&&(this.state=`disposed`,this.dialog.removeEventListener(`cancel`,this.handleCancel),o(null,this.dialog),this.dialog.open&&this.dialog.close(),s(this.document).deleteDynamicRule(this.element.id),this.element.remove())}render(e){this.state!==`disposed`&&(this.element.dataset.seamsRecoveryEntry=e.kind,o(t(this.input.appearance?.locale??`en`,a(T,{experience:e,onClose:this.input.onClose,onStageChange:this.handleStageChange})),this.dialog))}handleCancel=e=>{e.preventDefault(),this.input.onCancel()};handleStageChange=e=>{this.state!==`disposed`&&(this.dialog.dataset.seamsRecoveryStage=e)};focusTitle(){this.dialog.querySelector(`.recovery-backup-title`)?.focus()}};function j(e){return new A(e)}export{j as mountRecoveryCodeBackupSurface};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,t}from"./singletons-CAsc9LvA.js";import{m as n}from"./wallet-recovery-DFaS3geI.js";import{t as r}from"./surface-measurement-reporter-BJhfiPw6.js";const i=`Recovery-code backup was cancelled before acknowledgement`;async function a(e,t={kind:`disabled`},n={}){if(typeof document>`u`)throw Error(`Wallet recovery-code backup requires a browser or a backup handler`);let a=document.activeElement instanceof HTMLElement?document.activeElement:null;if(n.shouldCancel?.())throw Error(i);let o=await import(`./mountRecoveryCodeBackupSurface-
|
|
1
|
+
import{i as e,t}from"./singletons-CAsc9LvA.js";import{m as n}from"./wallet-recovery-DFaS3geI.js";import{t as r}from"./surface-measurement-reporter-BJhfiPw6.js";const i=`Recovery-code backup was cancelled before acknowledgement`;async function a(e,t={kind:`disabled`},n={}){if(typeof document>`u`)throw Error(`Wallet recovery-code backup requires a browser or a backup handler`);let a=document.activeElement instanceof HTMLElement?document.activeElement:null;if(n.shouldCancel?.())throw Error(i);let o=await import(`./mountRecoveryCodeBackupSurface-B1D0ovqx.js`);if(n.shouldCancel?.())throw Error(i);let s=null,l=null,u=!1;return await new Promise((d,f)=>{let p=()=>{s?.disconnect(),s=null,l?.dispose(),l=null,a?.focus()},m=e=>{u||(u=!0,p(),e instanceof Error?f(e):d(e))},h=t=>{switch(t.kind){case`dismissed`:m(Error(i));return;case`recovery_codes`:if(t.acknowledged){m({kind:`wallet_recovery_codes_backed_up_v1`});return}if(e.kind===`direct_backup`&&e.request.continuation===`registration_may_defer`){m({kind:`wallet_recovery_code_backup_deferred_v1`});return}m(Error(i));return}};try{l=o.mountRecoveryCodeBackupSurface({parent:document.body,appearance:n.appearance,experience:e,surface:t.kind===`wallet_iframe`?`wallet-iframe`:`standalone`,onClose:h,onCancel:()=>m(Error(i)),onShown:e=>{u||t.kind!==`wallet_iframe`||(s=r({kind:`request_scroll_surface`,requestId:t.requestId,element:e,postMeasurement:c.bind(null,e,t.postMeasurement)}))}})}catch(e){m(e instanceof Error?e:Error(String(e)))}})}async function o(e,t={kind:`disabled`}){return await a({kind:`direct_backup`,request:e},t)}async function s(e,t={kind:`disabled`},n={}){return await a({kind:`account_menu`,...e},t,n)}function c(e,t,n){if(n.kind!==`measured_v1`)throw Error(`Recovery codes require a request surface measurement`);t({kind:`measured_v1`,requestId:n.requestId,sequence:n.sequence,widthCssPx:e.dataset.seamsRecoveryStage===`recovery_codes`?688:480,heightCssPx:n.heightCssPx})}const l=`wallet_recovery_codes_v1`,u=[`record_version`,`wallet_id`,`enrollment_id`,`recovery_codes_issued_at_ms`,`status`,`key`,`iv`,`ciphertext`];function d(e){return typeof CryptoKey<`u`&&e instanceof CryptoKey&&e.type===`secret`&&!e.extractable&&e.algorithm.name===`AES-GCM`&&e.usages.includes(`encrypt`)&&e.usages.includes(`decrypt`)}function f(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=new Map(Object.entries(e)),n=new Set(u);return t.size!==n.size||[...t.keys()].some(e=>!n.has(e))?null:{record_version:t.get(`record_version`),wallet_id:t.get(`wallet_id`),enrollment_id:t.get(`enrollment_id`),recovery_codes_issued_at_ms:t.get(`recovery_codes_issued_at_ms`),status:t.get(`status`),key:t.get(`key`),iv:t.get(`iv`),ciphertext:t.get(`ciphertext`)}}function p(e,t){let n=f(e);if(!n)return null;let r=Number(n.recovery_codes_issued_at_ms);return n.record_version!==1||n.wallet_id!==t||n.enrollment_id!==l||n.status!==`pending`||!Number.isSafeInteger(r)||r<=0||!d(n.key)||!(n.iv instanceof Uint8Array)||n.iv.byteLength!==12||!(n.ciphertext instanceof Uint8Array)||n.ciphertext.byteLength===0?null:{record_version:1,wallet_id:t,enrollment_id:l,recovery_codes_issued_at_ms:r,status:`pending`,key:n.key,iv:n.iv,ciphertext:n.ciphertext}}function m(e,t){return new TextEncoder().encode(JSON.stringify({kind:l,walletId:e,issuedAtMs:t}))}function h(e){return[e,l]}const g=new class{async write(r){let i=r.walletId.trim();if(!i)throw Error(`Pending recovery-code backup requires a wallet`);let a=n(r.recoveryCodes.map(String)),o=r.issuedAtMs??Date.now();if(!Number.isSafeInteger(o)||o<=0)throw Error(`Pending recovery-code backup issue time is invalid`);let s=await crypto.subtle.generateKey({name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`]),c=crypto.getRandomValues(new Uint8Array(12)),u=m(i,o),d=new TextEncoder().encode(JSON.stringify(a)),f=null;try{f=new Uint8Array(await crypto.subtle.encrypt({name:`AES-GCM`,iv:c,additionalData:u},s,d)),await t.runTransaction([e.pendingWalletRecoveryCodeBackups],`readwrite`,async t=>{await t.store(e.pendingWalletRecoveryCodeBackups).put({record_version:1,wallet_id:i,enrollment_id:l,recovery_codes_issued_at_ms:o,status:`pending`,key:s,iv:c,ciphertext:f})})}finally{u.fill(0),d.fill(0),f?.fill(0)}}async read(r){let i=r.trim();if(!i)return null;let a=p(await(await t.getDB()).get(e.pendingWalletRecoveryCodeBackups,h(i)),i);if(!a)return null;let o=m(i,a.recovery_codes_issued_at_ms),s=null;try{s=new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:a.iv.slice(),additionalData:o},a.key,a.ciphertext.slice()));let e=JSON.parse(new TextDecoder().decode(s));if(!Array.isArray(e))throw Error(`Pending recovery-code backup is invalid`);return{walletId:i,recoveryCodes:n(e.map(String))}}finally{o.fill(0),s?.fill(0)}}async has(n){let r=n.trim();return r?p(await(await t.getDB()).get(e.pendingWalletRecoveryCodeBackups,h(r)),r)!==null:!1}async delete(n){let r=n.trim();r&&await t.runTransaction([e.pendingWalletRecoveryCodeBackups],`readwrite`,async t=>{await t.store(e.pendingWalletRecoveryCodeBackups).delete(h(r))})}};export{o as n,s as r,g as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./chunk-dVx5-UGu.js";import{o as t}from"./errors-ADOZT8oV.js";import{c as n,r}from"./helpers-DS0bksx9.js";import{t as i}from"./webauthnPromptCoordinator-9bVeHcTZ.js";import{a}from"./intentDigest-Rh5Mg8X7.js";import{T as o,b as s,f as c,n as l,t as u,u as d,y as f}from"./adapters-
|
|
1
|
+
import{n as e}from"./chunk-dVx5-UGu.js";import{o as t}from"./errors-ADOZT8oV.js";import{c as n,r}from"./helpers-DS0bksx9.js";import{t as i}from"./webauthnPromptCoordinator-9bVeHcTZ.js";import{a}from"./intentDigest-Rh5Mg8X7.js";import{T as o,b as s,f as c,n as l,t as u,u as d,y as f}from"./adapters-BNmcyf9K.js";var p=e({handleRegistrationFlow:()=>_});function m(e){return Math.max(0,Math.round(performance.now()-e))}function h(e){return{kind:`passkey_registration_confirm_display_v1`,intendedUserName:e.walletId,accountId:e.walletId,rpId:e.rpId,signerSlot:e.signerSlot}}function g(e){let t={walletId:e.walletId,intendedUserName:e.walletId,prompt:e.prompt};return e.recoveryRegistration?{...t,kind:`wallet_recovery`,recoveryRegistration:e.recoveryRegistration}:e.addAuthMethodRegistration?{...t,kind:`wallet_add_auth_method`,registration:e.addAuthMethodRegistration}:{...t,kind:`wallet_registration`,challengeB64u:e.challengeB64u,signerSlot:e.signerSlot}}async function _(e,p,_,v){let{confirmationConfig:y,transactionSummary:b,theme:x,surface:S}=v,C=performance.now(),w=0,T=0,E=0,D=0,O=0,k=0,A=0,j=0,M=0,N=0,P=0,F=0,I=null,L=()=>({kind:`registration_confirmation_diagnostics_v1`,workerReadyMs:0,workerRequestRoundTripMs:0,workerResponseValidationMs:0,requestSetupMs:w,promptUserMs:T,promptElementDefineMs:E,promptMountMs:D,promptHostFirstUpdateMs:O,promptHostInteractiveMs:k,promptConfirmEventMs:A,promptDecisionWaitMs:j,credentialCreateStartMs:M,credentialCreateMs:N,credentialSerializeMs:P,duplicateRetryCount:F,mainThreadTotalMs:m(C)}),R=l(e),z=u({adapters:R,worker:_,request:p,confirmationConfig:y,transactionSummary:b,theme:x,surface:S}),B=o(p),V=s(p);try{let e=performance.now(),o=p.payload.walletRecoveryRegistration,s=p.payload.walletAddAuthMethodRegistration,c=p.payload.webauthnChallenge,l=o?o.challengeB64u:s?s.challengeB64u:c?.kind===`intent_digest`?String(c.challengeB64u||``).trim():``,u=async()=>{if(l)return l;let e=f(p);if(!e)throw Error(`Missing intentDigest for registration flow`);return a(e)},d=o?.rpId??s?.rpId??R.security.getRpId();if(!d)throw Error(`Missing rpId for registration challenge`);let _=p.payload?.signerSlot??1,v=await u(),y={rpId:d,passkeyRegistration:h({walletId:B,nearAccountId:V,rpId:d,signerSlot:_})};w=m(e);let b={kind:`registration_modal`,requestId:p.requestId};I=await i.reserveRegistrationPrompt({owner:b,expiresAtMs:Date.now()+300*1e3,cancellation:{kind:`none`}});let x=performance.now(),{confirmed:S,error:H,diagnostics:U}=await z.promptUser({securityContext:y});if(T=m(x),E=U.elementDefineMs,D=U.mountMs,O=U.hostFirstUpdateMs,k=U.hostInteractiveMs,A=U.confirmEventMs,j=U.decisionWaitMs,!S)return z.confirmAndCloseModal({requestId:p.requestId,intentDigest:f(p),confirmed:!1,registrationDiagnostics:L(),error:H});let W,G=p.payload?.signerSlot??1;M=m(C);let K=performance.now();try{try{let e={kind:`reserved`,reservation:I,owner:b,cancellation:{kind:`none`}};W=await R.webauthn.createRegistrationCredential(g(o?{walletId:B,recoveryRegistration:o,prompt:e}:s?{walletId:B,addAuthMethodRegistration:s,prompt:e}:{walletId:B,challengeB64u:v,signerSlot:G,prompt:e}))}catch(e){let n=t(e),r=String(n?.name||``),i=String(n?.message||``);if(r===`InvalidStateError`||/excluded|already\s*registered/i.test(i)){if(F+=1,l)throw Error(`Registration credential already exists for this wallet registration intent; create a fresh intent before retrying`);if(p.payload.walletRecoveryRegistration||s)throw Error(`Server-issued registration requires a fresh ceremony`);let e=G!==void 0&&Number.isFinite(G)?G+1:2;G=e,p.payload.signerSlot=e,p.intentDigest=p.type===`registerAccount`?`register:${B}:${e}`:`device2-register:${B}:${e}`,v=await u(),W=await R.webauthn.createRegistrationCredential(g({walletId:B,challengeB64u:v,signerSlot:e,prompt:{kind:`immediate`,requestId:p.requestId,cancellation:{kind:`none`}}}))}else throw console.error(`[RegistrationFlow] credentials.create failed (non-duplicate)`,{name:r,msg:i}),n}}finally{N=m(K)}let q=performance.now(),J=r(W)?W:n({credential:W,firstPrfOutput:!0,secondPrfOutput:!0});P=m(q),z.confirmAndCloseModal({requestId:p.requestId,intentDigest:f(p),confirmed:!0,credential:J,registrationDiagnostics:L()})}catch(e){let n=c(e),r=String(t(e)?.message||e||``);n&&window.parent?.postMessage({type:`WALLET_UI_CLOSED`},`*`);let i=/WebAuthn PRF output is missing from navigator\.credentials\.create\(\)/i.test(r)||/does not fully support the WebAuthn PRF extension during registration/i.test(r)||/roaming hardware authenticators .* not supported in this flow/i.test(r);return z.confirmAndCloseModal({requestId:p.requestId,intentDigest:f(p),confirmed:!1,registrationDiagnostics:L(),error:n?d.cancelled:i?r:r||d.collectCredentialsFailed})}finally{I&&i.releaseReservation(I)}}export{p as n,_ as t};
|