Socket
Socket
Sign inDemoInstall

@nimiq/accounts-client

Package Overview
Dependencies
1
Maintainers
8
Versions
11
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.2.1 to 0.3.0

1

dist/AccountsClient.es.js

@@ -213,3 +213,4 @@ import { PostMessageRpcClient, RedirectRpcClient } from '@nimiq/rpc';

AccountsClient.RedirectRequestBehavior = RedirectRequestBehavior;
AccountsClient.MSG_PREFIX = '\x16Nimiq Signed Message:\n';
export default AccountsClient;

@@ -217,2 +217,3 @@ (function (global, factory) {

AccountsClient.RedirectRequestBehavior = RedirectRequestBehavior;
AccountsClient.MSG_PREFIX = '\x16Nimiq Signed Message:\n';

@@ -219,0 +220,0 @@ return AccountsClient;

2

dist/standalone/AccountsClient.standalone.es.js

@@ -1,1 +0,1 @@

class RandomUtils{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}var ResponseStatus;!function(e){e.OK="ok",e.ERROR="error"}(ResponseStatus||(ResponseStatus={}));const POSTMESSAGE_RETURN_URL="<postMessage>";class Base64{static byteLength(e){const[t,s]=Base64._getLengths(e);return Base64._byteLength(t,s)}static decode(e){Base64._initRevLookup();const[t,s]=Base64._getLengths(e),r=new Uint8Array(Base64._byteLength(t,s));let i=0;const n=s>0?t-4:t;let o=0;for(;o<n;o+=4){const t=Base64._revLookup[e.charCodeAt(o)]<<18|Base64._revLookup[e.charCodeAt(o+1)]<<12|Base64._revLookup[e.charCodeAt(o+2)]<<6|Base64._revLookup[e.charCodeAt(o+3)];r[i++]=t>>16&255,r[i++]=t>>8&255,r[i++]=255&t}if(2===s){const t=Base64._revLookup[e.charCodeAt(o)]<<2|Base64._revLookup[e.charCodeAt(o+1)]>>4;r[i++]=255&t}if(1===s){const t=Base64._revLookup[e.charCodeAt(o)]<<10|Base64._revLookup[e.charCodeAt(o+1)]<<4|Base64._revLookup[e.charCodeAt(o+2)]>>2;r[i++]=t>>8&255,r[i]=255&t}return r}static encode(e){const t=e.length,s=t%3,r=[];for(let i=0,n=t-s;i<n;i+=16383)r.push(Base64._encodeChunk(e,i,i+16383>n?n:i+16383));if(1===s){const s=e[t-1];r.push(Base64._lookup[s>>2]+Base64._lookup[s<<4&63]+"==")}else if(2===s){const s=(e[t-2]<<8)+e[t-1];r.push(Base64._lookup[s>>10]+Base64._lookup[s>>4&63]+Base64._lookup[s<<2&63]+"=")}return r.join("")}static encodeUrl(e){return Base64.encode(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(e){return Base64.decode(e.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===Base64._revLookup.length){Base64._revLookup=[];for(let e=0,t=Base64._lookup.length;e<t;e++)Base64._revLookup[Base64._lookup.charCodeAt(e)]=e;Base64._revLookup["-".charCodeAt(0)]=62,Base64._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(e){return Base64._lookup[e>>18&63]+Base64._lookup[e>>12&63]+Base64._lookup[e>>6&63]+Base64._lookup[63&e]}static _encodeChunk(e,t,s){const r=[];for(let i=t;i<s;i+=3){const t=(e[i]<<16&16711680)+(e[i+1]<<8&65280)+(255&e[i+2]);r.push(Base64._tripletToBase64(t))}return r.join("")}}var ExtraJSONTypes,BehaviorType,RequestType;Base64._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Base64._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(ExtraJSONTypes||(ExtraJSONTypes={}));class JSONUtils{static stringify(e){return JSON.stringify(e,JSONUtils._jsonifyType)}static parse(e){return JSON.parse(e,JSONUtils._parseType)}static _parseType(e,t){if(t&&t.hasOwnProperty&&t.hasOwnProperty(JSONUtils.TYPE_SYMBOL)&&t.hasOwnProperty(JSONUtils.VALUE_SYMBOL))switch(t[JSONUtils.TYPE_SYMBOL]){case ExtraJSONTypes.UINT8_ARRAY:return Base64.decode(t[JSONUtils.VALUE_SYMBOL])}return t}static _jsonifyType(e,t){return t instanceof Uint8Array?JSONUtils._typedObject(ExtraJSONTypes.UINT8_ARRAY,Base64.encode(t)):t}static _typedObject(e,t){const s={};return s[JSONUtils.TYPE_SYMBOL]=e,s[JSONUtils.VALUE_SYMBOL]=t,s}}JSONUtils.TYPE_SYMBOL="__",JSONUtils.VALUE_SYMBOL="v";class RequestIdStorage{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=JSONUtils.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(RequestIdStorage.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return JSONUtils.stringify(e)}_restoreIds(){const e=this._store.getItem(RequestIdStorage.KEY);e&&(this._validIds=RequestIdStorage._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(RequestIdStorage.KEY,this._encodeIds())}}RequestIdStorage.KEY="rpcRequests";class UrlRpcEncoder{static receiveRedirectCommand(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),s=new URL(document.referrer);if(!t.has("command"))return null;if(!t.has("id"))return null;if(!t.has("returnURL"))return null;const r=t.get("returnURL")===POSTMESSAGE_RETURN_URL&&(window.opener||window.parent);if(!r){if(new URL(t.get("returnURL")).origin!==s.origin)return null}let i=[];if(t.has("args"))try{i=JSONUtils.parse(t.get("args"))}catch(e){}return i=Array.isArray(i)?i:[],{origin:s.origin,data:{id:parseInt(t.get("id"),10),command:t.get("command"),args:i},returnURL:t.get("returnURL"),source:r?window.opener||window.parent:null}}static receiveRedirectResponse(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),s=new URL(document.referrer);if(!t.has("status"))return null;if(!t.has("id"))return null;if(!t.has("result"))return null;const r=JSONUtils.parse(t.get("result")),i=t.get("status")===ResponseStatus.OK?ResponseStatus.OK:ResponseStatus.ERROR;return{origin:s.origin,data:{id:parseInt(t.get("id"),10),status:i,result:r}}}static prepareRedirectReply(e,t,s){const r=new URL(e.returnURL),i=r.searchParams;return i.set("status",t),i.set("result",JSONUtils.stringify(s)),i.set("id",e.id.toString()),r.href}static prepareRedirectInvocation(e,t,s,r,i){const n=new URL(e),o=n.searchParams;return o.set("id",t.toString()),o.set("returnURL",s),o.set("command",r),Array.isArray(i)&&o.set("args",JSONUtils.stringify(i)),n.href}}class RpcClient{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new RequestIdStorage(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return;const t=e.data,s=this._getCallback(t.id),r=this._waitingRequests.getState(t.id);if(s){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===ResponseStatus.OK)s.resolve(t.result,t.id,r);else if(t.status===ResponseStatus.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),s.reject(e,t.id,r)}}else console.warn("Unknown RPC response:",t)}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class PostMessageRpcClient extends RpcClient{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:RandomUtils.generateRandomId()})}async callAndPersist(e,...t){return this._call({command:e,args:t,id:RandomUtils.generateRandomId(),persistInUrl:!0})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const s=t=>{const{source:r,origin:i,data:n}=t;if(r===this._target&&n.status===ResponseStatus.OK&&"pong"===n.result&&1===n.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(n.result.stack){const e=new Error(n.result.message);e.stack=n.result.stack,n.result.name&&(e.name=n.result.name),console.error(e)}window.removeEventListener("message",s),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",s);const r=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",s),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(r,100)}};window.setTimeout(r,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class RedirectRpcClient extends RpcClient{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=UrlRpcEncoder.receiveRedirectResponse(window.location);e?this._receive(e):UrlRpcEncoder.receiveRedirectCommand(window.location)||this._rejectOnBack()}close(){}call(e,t,...s){this.callAndSaveLocalState(e,null,t,...s)}callAndSaveLocalState(e,t,s,...r){const i=RandomUtils.generateRandomId(),n=UrlRpcEncoder.prepareRedirectInvocation(this._target,i,e,s,r);this._waitingRequests.add(i,s,t),history.replaceState({rpcRequestId:i},document.title),console.debug("RpcClient REQUEST",s,r),window.location.href=n}_rejectOnBack(){if(history.state&&history.state.rpcRequestId){const e=history.state.rpcRequestId,t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");t.reject(r,e,s)}}}}class RequestBehavior{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(BehaviorType||(BehaviorType={}));class RedirectRequestBehavior extends RequestBehavior{static withLocalState(e){return new RedirectRequestBehavior(void 0,e)}constructor(e,t){super(BehaviorType.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=new RedirectRpcClient(e,r);await i.init();const n=Object.assign({},this._localState,{__command:t});i.callAndSaveLocalState(this._returnUrl,n,t,...s)}}class PopupRequestBehavior extends RequestBehavior{constructor(e=PopupRequestBehavior.DEFAULT_OPTIONS){super(BehaviorType.POPUP),this._options=e}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=this.createPopup(e),n=new PostMessageRpcClient(i,r);await n.init();try{return await n.callAndPersist(t,...s)}catch(e){throw e}finally{n.close(),i.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}PopupRequestBehavior.DEFAULT_OPTIONS="";class IFrameRequestBehavior extends RequestBehavior{constructor(){super(BehaviorType.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`)throw new Error("Accounts Manager iframe is already opened with another endpoint");const r=RequestBehavior.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new PostMessageRpcClient(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}IFrameRequestBehavior.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(RequestType||(RequestType={}));class AccountsClient{constructor(e=AccountsClient.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new PopupRequestBehavior(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new IFrameRequestBehavior,this._redirectClient=new RedirectRpcClient("",RequestBehavior.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://accounts.nimiq.com";case"nimiq-testnet.com":return"https://accounts.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,RequestType.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,RequestType.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,RequestType.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,RequestType.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,RequestType.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,RequestType.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,RequestType.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}AccountsClient.RequestType=RequestType,AccountsClient.RedirectRequestBehavior=RedirectRequestBehavior;export default AccountsClient;
class RandomUtils{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}var ResponseStatus;!function(e){e.OK="ok",e.ERROR="error"}(ResponseStatus||(ResponseStatus={}));const POSTMESSAGE_RETURN_URL="<postMessage>";class Base64{static byteLength(e){const[t,s]=Base64._getLengths(e);return Base64._byteLength(t,s)}static decode(e){Base64._initRevLookup();const[t,s]=Base64._getLengths(e),r=new Uint8Array(Base64._byteLength(t,s));let i=0;const n=s>0?t-4:t;let o=0;for(;o<n;o+=4){const t=Base64._revLookup[e.charCodeAt(o)]<<18|Base64._revLookup[e.charCodeAt(o+1)]<<12|Base64._revLookup[e.charCodeAt(o+2)]<<6|Base64._revLookup[e.charCodeAt(o+3)];r[i++]=t>>16&255,r[i++]=t>>8&255,r[i++]=255&t}if(2===s){const t=Base64._revLookup[e.charCodeAt(o)]<<2|Base64._revLookup[e.charCodeAt(o+1)]>>4;r[i++]=255&t}if(1===s){const t=Base64._revLookup[e.charCodeAt(o)]<<10|Base64._revLookup[e.charCodeAt(o+1)]<<4|Base64._revLookup[e.charCodeAt(o+2)]>>2;r[i++]=t>>8&255,r[i]=255&t}return r}static encode(e){const t=e.length,s=t%3,r=[];for(let i=0,n=t-s;i<n;i+=16383)r.push(Base64._encodeChunk(e,i,i+16383>n?n:i+16383));if(1===s){const s=e[t-1];r.push(Base64._lookup[s>>2]+Base64._lookup[s<<4&63]+"==")}else if(2===s){const s=(e[t-2]<<8)+e[t-1];r.push(Base64._lookup[s>>10]+Base64._lookup[s>>4&63]+Base64._lookup[s<<2&63]+"=")}return r.join("")}static encodeUrl(e){return Base64.encode(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(e){return Base64.decode(e.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===Base64._revLookup.length){Base64._revLookup=[];for(let e=0,t=Base64._lookup.length;e<t;e++)Base64._revLookup[Base64._lookup.charCodeAt(e)]=e;Base64._revLookup["-".charCodeAt(0)]=62,Base64._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(e){return Base64._lookup[e>>18&63]+Base64._lookup[e>>12&63]+Base64._lookup[e>>6&63]+Base64._lookup[63&e]}static _encodeChunk(e,t,s){const r=[];for(let i=t;i<s;i+=3){const t=(e[i]<<16&16711680)+(e[i+1]<<8&65280)+(255&e[i+2]);r.push(Base64._tripletToBase64(t))}return r.join("")}}var ExtraJSONTypes,BehaviorType,RequestType;Base64._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Base64._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(ExtraJSONTypes||(ExtraJSONTypes={}));class JSONUtils{static stringify(e){return JSON.stringify(e,JSONUtils._jsonifyType)}static parse(e){return JSON.parse(e,JSONUtils._parseType)}static _parseType(e,t){if(t&&t.hasOwnProperty&&t.hasOwnProperty(JSONUtils.TYPE_SYMBOL)&&t.hasOwnProperty(JSONUtils.VALUE_SYMBOL))switch(t[JSONUtils.TYPE_SYMBOL]){case ExtraJSONTypes.UINT8_ARRAY:return Base64.decode(t[JSONUtils.VALUE_SYMBOL])}return t}static _jsonifyType(e,t){return t instanceof Uint8Array?JSONUtils._typedObject(ExtraJSONTypes.UINT8_ARRAY,Base64.encode(t)):t}static _typedObject(e,t){const s={};return s[JSONUtils.TYPE_SYMBOL]=e,s[JSONUtils.VALUE_SYMBOL]=t,s}}JSONUtils.TYPE_SYMBOL="__",JSONUtils.VALUE_SYMBOL="v";class RequestIdStorage{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=JSONUtils.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(RequestIdStorage.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return JSONUtils.stringify(e)}_restoreIds(){const e=this._store.getItem(RequestIdStorage.KEY);e&&(this._validIds=RequestIdStorage._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(RequestIdStorage.KEY,this._encodeIds())}}RequestIdStorage.KEY="rpcRequests";class UrlRpcEncoder{static receiveRedirectCommand(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),s=new URL(document.referrer);if(!t.has("command"))return null;if(!t.has("id"))return null;if(!t.has("returnURL"))return null;const r=t.get("returnURL")===POSTMESSAGE_RETURN_URL&&(window.opener||window.parent);if(!r){if(new URL(t.get("returnURL")).origin!==s.origin)return null}let i=[];if(t.has("args"))try{i=JSONUtils.parse(t.get("args"))}catch(e){}return i=Array.isArray(i)?i:[],{origin:s.origin,data:{id:parseInt(t.get("id"),10),command:t.get("command"),args:i},returnURL:t.get("returnURL"),source:r?window.opener||window.parent:null}}static receiveRedirectResponse(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),s=new URL(document.referrer);if(!t.has("status"))return null;if(!t.has("id"))return null;if(!t.has("result"))return null;const r=JSONUtils.parse(t.get("result")),i=t.get("status")===ResponseStatus.OK?ResponseStatus.OK:ResponseStatus.ERROR;return{origin:s.origin,data:{id:parseInt(t.get("id"),10),status:i,result:r}}}static prepareRedirectReply(e,t,s){const r=new URL(e.returnURL),i=r.searchParams;return i.set("status",t),i.set("result",JSONUtils.stringify(s)),i.set("id",e.id.toString()),r.href}static prepareRedirectInvocation(e,t,s,r,i){const n=new URL(e),o=n.searchParams;return o.set("id",t.toString()),o.set("returnURL",s),o.set("command",r),Array.isArray(i)&&o.set("args",JSONUtils.stringify(i)),n.href}}class RpcClient{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new RequestIdStorage(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return;const t=e.data,s=this._getCallback(t.id),r=this._waitingRequests.getState(t.id);if(s){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===ResponseStatus.OK)s.resolve(t.result,t.id,r);else if(t.status===ResponseStatus.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),s.reject(e,t.id,r)}}else console.warn("Unknown RPC response:",t)}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class PostMessageRpcClient extends RpcClient{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:RandomUtils.generateRandomId()})}async callAndPersist(e,...t){return this._call({command:e,args:t,id:RandomUtils.generateRandomId(),persistInUrl:!0})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const s=t=>{const{source:r,origin:i,data:n}=t;if(r===this._target&&n.status===ResponseStatus.OK&&"pong"===n.result&&1===n.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(n.result.stack){const e=new Error(n.result.message);e.stack=n.result.stack,n.result.name&&(e.name=n.result.name),console.error(e)}window.removeEventListener("message",s),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",s);const r=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",s),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(r,100)}};window.setTimeout(r,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class RedirectRpcClient extends RpcClient{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=UrlRpcEncoder.receiveRedirectResponse(window.location);e?this._receive(e):UrlRpcEncoder.receiveRedirectCommand(window.location)||this._rejectOnBack()}close(){}call(e,t,...s){this.callAndSaveLocalState(e,null,t,...s)}callAndSaveLocalState(e,t,s,...r){const i=RandomUtils.generateRandomId(),n=UrlRpcEncoder.prepareRedirectInvocation(this._target,i,e,s,r);this._waitingRequests.add(i,s,t),history.replaceState({rpcRequestId:i},document.title),console.debug("RpcClient REQUEST",s,r),window.location.href=n}_rejectOnBack(){if(history.state&&history.state.rpcRequestId){const e=history.state.rpcRequestId,t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");t.reject(r,e,s)}}}}class RequestBehavior{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(BehaviorType||(BehaviorType={}));class RedirectRequestBehavior extends RequestBehavior{static withLocalState(e){return new RedirectRequestBehavior(void 0,e)}constructor(e,t){super(BehaviorType.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=new RedirectRpcClient(e,r);await i.init();const n=Object.assign({},this._localState,{__command:t});i.callAndSaveLocalState(this._returnUrl,n,t,...s)}}class PopupRequestBehavior extends RequestBehavior{constructor(e=PopupRequestBehavior.DEFAULT_OPTIONS){super(BehaviorType.POPUP),this._options=e}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=this.createPopup(e),n=new PostMessageRpcClient(i,r);await n.init();try{return await n.callAndPersist(t,...s)}catch(e){throw e}finally{n.close(),i.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}PopupRequestBehavior.DEFAULT_OPTIONS="";class IFrameRequestBehavior extends RequestBehavior{constructor(){super(BehaviorType.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`)throw new Error("Accounts Manager iframe is already opened with another endpoint");const r=RequestBehavior.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new PostMessageRpcClient(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}IFrameRequestBehavior.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(RequestType||(RequestType={}));class AccountsClient{constructor(e=AccountsClient.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new PopupRequestBehavior(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new IFrameRequestBehavior,this._redirectClient=new RedirectRpcClient("",RequestBehavior.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://accounts.nimiq.com";case"nimiq-testnet.com":return"https://accounts.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,RequestType.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,RequestType.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,RequestType.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,RequestType.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,RequestType.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,RequestType.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,RequestType.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}AccountsClient.RequestType=RequestType,AccountsClient.RedirectRequestBehavior=RedirectRequestBehavior,AccountsClient.MSG_PREFIX="Nimiq Signed Message:\n";export default AccountsClient;

@@ -1,1 +0,1 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.AccountsClient=t()}(this,function(){"use strict";class e{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}var t;!function(e){e.OK="ok",e.ERROR="error"}(t||(t={}));const s="<postMessage>";class r{static byteLength(e){const[t,s]=r._getLengths(e);return r._byteLength(t,s)}static decode(e){r._initRevLookup();const[t,s]=r._getLengths(e),n=new Uint8Array(r._byteLength(t,s));let i=0;const o=s>0?t-4:t;let a=0;for(;a<o;a+=4){const t=r._revLookup[e.charCodeAt(a)]<<18|r._revLookup[e.charCodeAt(a+1)]<<12|r._revLookup[e.charCodeAt(a+2)]<<6|r._revLookup[e.charCodeAt(a+3)];n[i++]=t>>16&255,n[i++]=t>>8&255,n[i++]=255&t}if(2===s){const t=r._revLookup[e.charCodeAt(a)]<<2|r._revLookup[e.charCodeAt(a+1)]>>4;n[i++]=255&t}if(1===s){const t=r._revLookup[e.charCodeAt(a)]<<10|r._revLookup[e.charCodeAt(a+1)]<<4|r._revLookup[e.charCodeAt(a+2)]>>2;n[i++]=t>>8&255,n[i]=255&t}return n}static encode(e){const t=e.length,s=t%3,n=[];for(let i=0,o=t-s;i<o;i+=16383)n.push(r._encodeChunk(e,i,i+16383>o?o:i+16383));if(1===s){const s=e[t-1];n.push(r._lookup[s>>2]+r._lookup[s<<4&63]+"==")}else if(2===s){const s=(e[t-2]<<8)+e[t-1];n.push(r._lookup[s>>10]+r._lookup[s>>4&63]+r._lookup[s<<2&63]+"=")}return n.join("")}static encodeUrl(e){return r.encode(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(e){return r.decode(e.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===r._revLookup.length){r._revLookup=[];for(let e=0,t=r._lookup.length;e<t;e++)r._revLookup[r._lookup.charCodeAt(e)]=e;r._revLookup["-".charCodeAt(0)]=62,r._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(e){return r._lookup[e>>18&63]+r._lookup[e>>12&63]+r._lookup[e>>6&63]+r._lookup[63&e]}static _encodeChunk(e,t,s){const n=[];for(let i=t;i<s;i+=3){const t=(e[i]<<16&16711680)+(e[i+1]<<8&65280)+(255&e[i+2]);n.push(r._tripletToBase64(t))}return n.join("")}}var n,i,o;r._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(n||(n={}));class a{static stringify(e){return JSON.stringify(e,a._jsonifyType)}static parse(e){return JSON.parse(e,a._parseType)}static _parseType(e,t){if(t&&t.hasOwnProperty&&t.hasOwnProperty(a.TYPE_SYMBOL)&&t.hasOwnProperty(a.VALUE_SYMBOL))switch(t[a.TYPE_SYMBOL]){case n.UINT8_ARRAY:return r.decode(t[a.VALUE_SYMBOL])}return t}static _jsonifyType(e,t){return t instanceof Uint8Array?a._typedObject(n.UINT8_ARRAY,r.encode(t)):t}static _typedObject(e,t){const s={};return s[a.TYPE_SYMBOL]=e,s[a.VALUE_SYMBOL]=t,s}}a.TYPE_SYMBOL="__",a.VALUE_SYMBOL="v";class c{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=a.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(c.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return a.stringify(e)}_restoreIds(){const e=this._store.getItem(c.KEY);e&&(this._validIds=c._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(c.KEY,this._encodeIds())}}c.KEY="rpcRequests";class l{static receiveRedirectCommand(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),r=new URL(document.referrer);if(!t.has("command"))return null;if(!t.has("id"))return null;if(!t.has("returnURL"))return null;const n=t.get("returnURL")===s&&(window.opener||window.parent);if(!n){if(new URL(t.get("returnURL")).origin!==r.origin)return null}let i=[];if(t.has("args"))try{i=a.parse(t.get("args"))}catch(e){}return i=Array.isArray(i)?i:[],{origin:r.origin,data:{id:parseInt(t.get("id"),10),command:t.get("command"),args:i},returnURL:t.get("returnURL"),source:n?window.opener||window.parent:null}}static receiveRedirectResponse(e){if(!document.referrer)return null;const s=new URLSearchParams(e.search),r=new URL(document.referrer);if(!s.has("status"))return null;if(!s.has("id"))return null;if(!s.has("result"))return null;const n=a.parse(s.get("result")),i=s.get("status")===t.OK?t.OK:t.ERROR;return{origin:r.origin,data:{id:parseInt(s.get("id"),10),status:i,result:n}}}static prepareRedirectReply(e,t,s){const r=new URL(e.returnURL),n=r.searchParams;return n.set("status",t),n.set("result",a.stringify(s)),n.set("id",e.id.toString()),r.href}static prepareRedirectInvocation(e,t,s,r,n){const i=new URL(e),o=i.searchParams;return o.set("id",t.toString()),o.set("returnURL",s),o.set("command",r),Array.isArray(n)&&o.set("args",a.stringify(n)),i.href}}class d{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new c(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return;const s=e.data,r=this._getCallback(s.id),n=this._waitingRequests.getState(s.id);if(r){if(this._preserveRequests||(this._waitingRequests.remove(s.id),this._responseHandlers.delete(s.id)),console.debug("RpcClient RECEIVE",s),s.status===t.OK)r.resolve(s.result,s.id,n);else if(s.status===t.ERROR){const e=new Error(s.result.message);s.result.stack&&(e.stack=s.result.stack),s.result.name&&(e.name=s.result.name),r.reject(e,s.id,n)}}else console.warn("Unknown RPC response:",s)}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class u extends d{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(t,...s){return this._call({command:t,args:s,id:e.generateRandomId()})}async callAndPersist(t,...s){return this._call({command:t,args:s,id:e.generateRandomId(),persistInUrl:!0})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,s)=>{const r=s=>{const{source:n,origin:i,data:o}=s;if(n===this._target&&o.status===t.OK&&"pong"===o.result&&1===o.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(o.result.stack){const e=new Error(o.result.message);e.stack=o.result.stack,o.result.name&&(e.name=o.result.name),console.error(e)}window.removeEventListener("message",r),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",r);const n=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",r),void s(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(n,100)}};window.setTimeout(n,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class h extends d{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=l.receiveRedirectResponse(window.location);e?this._receive(e):l.receiveRedirectCommand(window.location)||this._rejectOnBack()}close(){}call(e,t,...s){this.callAndSaveLocalState(e,null,t,...s)}callAndSaveLocalState(t,s,r,...n){const i=e.generateRandomId(),o=l.prepareRedirectInvocation(this._target,i,t,r,n);this._waitingRequests.add(i,r,s),history.replaceState({rpcRequestId:i},document.title),console.debug("RpcClient REQUEST",r,n),window.location.href=o}_rejectOnBack(){if(history.state&&history.state.rpcRequestId){const e=history.state.rpcRequestId,t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");t.reject(r,e,s)}}}}class _{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(i||(i={}));class p extends _{static withLocalState(e){return new p(void 0,e)}constructor(e,t){super(i.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=_.getAllowedOrigin(e),n=new h(e,r);await n.init();const i=Object.assign({},this._localState,{__command:t});n.callAndSaveLocalState(this._returnUrl,i,t,...s)}}class g extends _{constructor(e=g.DEFAULT_OPTIONS){super(i.POPUP),this._options=e}async request(e,t,s){const r=_.getAllowedOrigin(e),n=this.createPopup(e),i=new u(n,r);await i.init();try{return await i.callAndPersist(t,...s)}catch(e){throw e}finally{i.close(),n.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}g.DEFAULT_OPTIONS="";class w extends _{constructor(){super(i.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${w.IFRAME_PATH_SUFFIX}`)throw new Error("Accounts Manager iframe is already opened with another endpoint");const r=_.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new u(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${w.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}w.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(o||(o={}));class m{constructor(e=m.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new g(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new w,this._redirectClient=new h("",_.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://accounts.nimiq.com";case"nimiq-testnet.com":return"https://accounts.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,o.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,o.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,o.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,o.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,o.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,o.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,o.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,o.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,o.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,o.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,o.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,o.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,o.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,o.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}return m.RequestType=o,m.RedirectRequestBehavior=p,m});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.AccountsClient=t()}(this,function(){"use strict";class e{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}var t;!function(e){e.OK="ok",e.ERROR="error"}(t||(t={}));const s="<postMessage>";class r{static byteLength(e){const[t,s]=r._getLengths(e);return r._byteLength(t,s)}static decode(e){r._initRevLookup();const[t,s]=r._getLengths(e),n=new Uint8Array(r._byteLength(t,s));let i=0;const o=s>0?t-4:t;let a=0;for(;a<o;a+=4){const t=r._revLookup[e.charCodeAt(a)]<<18|r._revLookup[e.charCodeAt(a+1)]<<12|r._revLookup[e.charCodeAt(a+2)]<<6|r._revLookup[e.charCodeAt(a+3)];n[i++]=t>>16&255,n[i++]=t>>8&255,n[i++]=255&t}if(2===s){const t=r._revLookup[e.charCodeAt(a)]<<2|r._revLookup[e.charCodeAt(a+1)]>>4;n[i++]=255&t}if(1===s){const t=r._revLookup[e.charCodeAt(a)]<<10|r._revLookup[e.charCodeAt(a+1)]<<4|r._revLookup[e.charCodeAt(a+2)]>>2;n[i++]=t>>8&255,n[i]=255&t}return n}static encode(e){const t=e.length,s=t%3,n=[];for(let i=0,o=t-s;i<o;i+=16383)n.push(r._encodeChunk(e,i,i+16383>o?o:i+16383));if(1===s){const s=e[t-1];n.push(r._lookup[s>>2]+r._lookup[s<<4&63]+"==")}else if(2===s){const s=(e[t-2]<<8)+e[t-1];n.push(r._lookup[s>>10]+r._lookup[s>>4&63]+r._lookup[s<<2&63]+"=")}return n.join("")}static encodeUrl(e){return r.encode(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(e){return r.decode(e.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===r._revLookup.length){r._revLookup=[];for(let e=0,t=r._lookup.length;e<t;e++)r._revLookup[r._lookup.charCodeAt(e)]=e;r._revLookup["-".charCodeAt(0)]=62,r._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(e){return r._lookup[e>>18&63]+r._lookup[e>>12&63]+r._lookup[e>>6&63]+r._lookup[63&e]}static _encodeChunk(e,t,s){const n=[];for(let i=t;i<s;i+=3){const t=(e[i]<<16&16711680)+(e[i+1]<<8&65280)+(255&e[i+2]);n.push(r._tripletToBase64(t))}return n.join("")}}var n,i,o;r._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(n||(n={}));class a{static stringify(e){return JSON.stringify(e,a._jsonifyType)}static parse(e){return JSON.parse(e,a._parseType)}static _parseType(e,t){if(t&&t.hasOwnProperty&&t.hasOwnProperty(a.TYPE_SYMBOL)&&t.hasOwnProperty(a.VALUE_SYMBOL))switch(t[a.TYPE_SYMBOL]){case n.UINT8_ARRAY:return r.decode(t[a.VALUE_SYMBOL])}return t}static _jsonifyType(e,t){return t instanceof Uint8Array?a._typedObject(n.UINT8_ARRAY,r.encode(t)):t}static _typedObject(e,t){const s={};return s[a.TYPE_SYMBOL]=e,s[a.VALUE_SYMBOL]=t,s}}a.TYPE_SYMBOL="__",a.VALUE_SYMBOL="v";class c{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=a.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(c.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return a.stringify(e)}_restoreIds(){const e=this._store.getItem(c.KEY);e&&(this._validIds=c._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(c.KEY,this._encodeIds())}}c.KEY="rpcRequests";class l{static receiveRedirectCommand(e){if(!document.referrer)return null;const t=new URLSearchParams(e.search),r=new URL(document.referrer);if(!t.has("command"))return null;if(!t.has("id"))return null;if(!t.has("returnURL"))return null;const n=t.get("returnURL")===s&&(window.opener||window.parent);if(!n){if(new URL(t.get("returnURL")).origin!==r.origin)return null}let i=[];if(t.has("args"))try{i=a.parse(t.get("args"))}catch(e){}return i=Array.isArray(i)?i:[],{origin:r.origin,data:{id:parseInt(t.get("id"),10),command:t.get("command"),args:i},returnURL:t.get("returnURL"),source:n?window.opener||window.parent:null}}static receiveRedirectResponse(e){if(!document.referrer)return null;const s=new URLSearchParams(e.search),r=new URL(document.referrer);if(!s.has("status"))return null;if(!s.has("id"))return null;if(!s.has("result"))return null;const n=a.parse(s.get("result")),i=s.get("status")===t.OK?t.OK:t.ERROR;return{origin:r.origin,data:{id:parseInt(s.get("id"),10),status:i,result:n}}}static prepareRedirectReply(e,t,s){const r=new URL(e.returnURL),n=r.searchParams;return n.set("status",t),n.set("result",a.stringify(s)),n.set("id",e.id.toString()),r.href}static prepareRedirectInvocation(e,t,s,r,n){const i=new URL(e),o=i.searchParams;return o.set("id",t.toString()),o.set("returnURL",s),o.set("command",r),Array.isArray(n)&&o.set("args",a.stringify(n)),i.href}}class d{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new c(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return;const s=e.data,r=this._getCallback(s.id),n=this._waitingRequests.getState(s.id);if(r){if(this._preserveRequests||(this._waitingRequests.remove(s.id),this._responseHandlers.delete(s.id)),console.debug("RpcClient RECEIVE",s),s.status===t.OK)r.resolve(s.result,s.id,n);else if(s.status===t.ERROR){const e=new Error(s.result.message);s.result.stack&&(e.stack=s.result.stack),s.result.name&&(e.name=s.result.name),r.reject(e,s.id,n)}}else console.warn("Unknown RPC response:",s)}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class u extends d{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(t,...s){return this._call({command:t,args:s,id:e.generateRandomId()})}async callAndPersist(t,...s){return this._call({command:t,args:s,id:e.generateRandomId(),persistInUrl:!0})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,s)=>{const r=s=>{const{source:n,origin:i,data:o}=s;if(n===this._target&&o.status===t.OK&&"pong"===o.result&&1===o.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(o.result.stack){const e=new Error(o.result.message);e.stack=o.result.stack,o.result.name&&(e.name=o.result.name),console.error(e)}window.removeEventListener("message",r),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",r);const n=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",r),void s(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(n,100)}};window.setTimeout(n,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class h extends d{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=l.receiveRedirectResponse(window.location);e?this._receive(e):l.receiveRedirectCommand(window.location)||this._rejectOnBack()}close(){}call(e,t,...s){this.callAndSaveLocalState(e,null,t,...s)}callAndSaveLocalState(t,s,r,...n){const i=e.generateRandomId(),o=l.prepareRedirectInvocation(this._target,i,t,r,n);this._waitingRequests.add(i,r,s),history.replaceState({rpcRequestId:i},document.title),console.debug("RpcClient REQUEST",r,n),window.location.href=o}_rejectOnBack(){if(history.state&&history.state.rpcRequestId){const e=history.state.rpcRequestId,t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");t.reject(r,e,s)}}}}class _{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(i||(i={}));class p extends _{static withLocalState(e){return new p(void 0,e)}constructor(e,t){super(i.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=_.getAllowedOrigin(e),n=new h(e,r);await n.init();const i=Object.assign({},this._localState,{__command:t});n.callAndSaveLocalState(this._returnUrl,i,t,...s)}}class g extends _{constructor(e=g.DEFAULT_OPTIONS){super(i.POPUP),this._options=e}async request(e,t,s){const r=_.getAllowedOrigin(e),n=this.createPopup(e),i=new u(n,r);await i.init();try{return await i.callAndPersist(t,...s)}catch(e){throw e}finally{i.close(),n.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}g.DEFAULT_OPTIONS="";class w extends _{constructor(){super(i.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${w.IFRAME_PATH_SUFFIX}`)throw new Error("Accounts Manager iframe is already opened with another endpoint");const r=_.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new u(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${w.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}w.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(o||(o={}));class m{constructor(e=m.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new g(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new w,this._redirectClient=new h("",_.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://accounts.nimiq.com";case"nimiq-testnet.com":return"https://accounts.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,o.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,o.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,o.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,o.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,o.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,o.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,o.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,o.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,o.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,o.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,o.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,o.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,o.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,o.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}return m.RequestType=o,m.RedirectRequestBehavior=p,m.MSG_PREFIX="Nimiq Signed Message:\n",m});
{
"name": "@nimiq/accounts-client",
"version": "0.2.1",
"version": "0.3.0",
"main": "dist/AccountsClient.umd.js",

@@ -5,0 +5,0 @@ "module": "dist/AccountsClient.es.js",

@@ -199,2 +199,18 @@ # Nimiq Accounts Manager <!-- omit in toc -->

// [optional] Human-readable address of the sender.
// If the address exists in the user's Accounts Manager, this parameter
// forwards the user directly to the transaction-signing after the
// balance check.
// Default: undefined
//sender: 'NQ07 0000 0000 0000 0000 0000 0000 0000 0000',
// [optional] Whether to force the submitted sender address
// If this parameter is true, an exception is thrown when either the
// submitted sender address does not exist or does not have sufficient
// balance. When false, the user will be shown the address selector
// for the above conditions instead.
// (Only relevant in connection with the `sender` parameter)
// Default: false
//forceSender: true,
// [optional] Nimiq.Transaction.Flag, only required if the transaction

@@ -435,2 +451,10 @@ // creates a contract.

accountId: 'xxxxxxxx',
// [optional] Limit the export flow to Login File download
// Default: false,
//fileOnly: true,
// [optional] Limit the export flow to Recovery Words export
// Default: false,
//wordsOnly: true,
};

@@ -553,3 +577,5 @@

// [optional] The human-readable address with which to sign
signer: 'NQxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx';
// When not passed, an address selector will be displayed to the user.
// Default: undefined,
//signer: 'NQxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx';
};

@@ -568,4 +594,2 @@

signature: Uint8Array; // Signature for the message
message: string | Uint8Array; // The signed message (as the same type as it
// was handed in)
}

@@ -575,7 +599,17 @@ ```

**Note:** To prevent users from signing valid transactions or other
blockchain-related proofs which could be used to impersonate them, the Nimiq
Keyguard prefixes the string `'Nimiq Signed Message: '` (22 one-byte-characters)
to the input message. The signature is then created over the combined message.
The prefix is already included in the result's `message` property.
blockchain-related proofs which could be used to impersonate them, the
Nimiq Keyguard prefixes additional data to the message before signing.
This prefix consists of
- 1 byte length of the prefix (`22` or `0x16`)
- a 22 bytes prefix (`'Nimiq Signed Message:\n'`, available as `AccountsClient.MSG_PREFIX`)
- the length of the message as a stringified number
This data is then hashed with SHA256 before being signed. Together, this leads
to the following data structure:
```javascript
sign( sha256( '\x16' + 'Nimiq Signed Message:\n' + message.length + message ) );
```
Verifying a signed message could go like this:

@@ -587,8 +621,12 @@

const message = typeof signedMessage.message === 'string'
? Nimiq.BufferUtils.fromUtf8(signedMessage.message))
: signedMessage.message;
// For string messages:
const data = String.fromCharCode(AccountsClient.MSG_PREFIX.length)
+ AccountsClient.MSG_PREFIX
+ message.length
+ message;
const dataBytes = Nimiq.BufferUtils.fromUtf8(data);
const hash = Nimiq.Hash.computeSha256(dataBytes);
// Check signature against the message
const isValid = signature.verify(publicKey, message);
// Check signature against the hashed message
const isValid = signature.verify(publicKey, hash);
```

@@ -670,3 +708,3 @@

```bash
git clone git@github.com:nimiq/accounts.git
git clone https://github.com/nimiq/accounts.git
cd accounts

@@ -673,0 +711,0 @@ yarn

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc