From 7721f37e23f93bcca8d7fa2796962742cacc68a5 Mon Sep 17 00:00:00 2001
From: Jakub Ner <jakub.at.work@gmail.com>
Date: Thu, 13 May 2021 00:31:55 -0700
Subject: [PATCH 1/4] WIP

---
 src/imparters/ohledger-social.js | 158 +++++++++++++++++++++++++++++++
 src/ledgers.js                   |   6 +-
 2 files changed, 163 insertions(+), 1 deletion(-)
 create mode 100644 src/imparters/ohledger-social.js

diff --git a/src/imparters/ohledger-social.js b/src/imparters/ohledger-social.js
new file mode 100644
index 0000000..9028dea
--- /dev/null
+++ b/src/imparters/ohledger-social.js
@@ -0,0 +1,158 @@
+import ohledger_fns from '../fns/ohledger_fns.js';
+import imparter_fns from '../fns/imparter_fns.js';
+
+class ohledger_social {
+  static tag = 'ohledger-social';
+
+  address = null;
+  mode = 'test';
+  social = null;
+
+  constructor(domFns, overhide_wallet, web3_wallet, getToken, __fetch, fire) {
+    this.domFns = domFns;
+    this.overhide_wallet = overhide_wallet;
+    this.eth_accounts = web3_wallet.eth_accounts;
+    this.getToken = getToken;
+    this.__fetch = __fetch;
+    this.fire = fire;
+
+    window.document.addEventListener('oh$-login-success', (e) => {
+      this.domFns.makePopupHidden('login success', true);
+    });    
+    window.document.addEventListener('oh$-login-failed', (e) => {
+      this.domFns.makePopupHidden('login failure', true);
+    });    
+    window.document.addEventListener('oh$-logout-success', (e) => {
+      this.domFns.makePopupHidden('logout', true);
+    });    
+  }
+
+  canSetCredentials() {
+    return true;
+  }  
+
+  canGenerateCredentials() {
+    return false;
+  }  
+
+  canChangeNetwork() {
+    return true;
+  }  
+
+  setCredentials(credentials) {
+    if (!credentials) {
+      if (!this.social) throw new Error("Not logged in");    
+      this.domFns.hideAllPopupContents();
+      this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/logout?redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Flogout`);
+      await this.domFns.makePopupVisible();  
+      this.address = null;
+    } else if ('provider' in credentials) {
+      await this.sign(`setting credentials on ${new Date()}`);      
+    } else {
+      throw new Error("Incorrect credentials options.");
+    }
+    this.fire('onCredentialsUpdate', { imparterTag: ohledger_social.tag, address: this.address });
+    return true;
+  }  
+
+  getCredentials() {
+    return {"address":this.address};
+  }
+
+  generateCredentials(options) {
+    return false;
+  }
+
+  setNetwork(details) {
+    ohledger_fns.setNetwork_check_details(details);
+
+    this.mode = details.mode;
+    this.fire('onNetworkChange', { imparterTag: ohledger_social.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode]});
+    return true;
+  }  
+
+  getNetwork() {
+    return { "currency": "USD", "mode": this.mode, "uri": this.overhide_wallet.remuneration_uri[this.mode]};
+  }
+
+  getOverhideRemunerationAPIUri() {
+    if (!this.mode) throw new Error("network 'mode' must be set, use setNetwork");
+    return this.overhide_wallet.remuneration_uri[this.mode];
+  }
+
+  async getFromDollars(dollarAmount) {
+    return dollarAmount * 100;
+  }
+
+  async getTxs(recipient, date, tallyOnly, tallyDollars) {
+    imparter_fns.getTxs_check_details(recipient, date);
+
+    const to = recipient.address;
+    const uri = this.getOverhideRemunerationAPIUri();
+
+    if (!this.mode) throw new Error("network 'mode' must be set, use setNetwork");
+    if (!this.address) throw new Error("from 'address' not set: use setCredentials");
+    const from = this.address;
+
+    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);
+  }
+
+  async isOnLedger() {
+    const uri = this.getOverhideRemunerationAPIUri();
+    if (!this.mode) throw new Error("network 'mode' must be set, use setNetwork");
+    if (!this.address) throw new Error("from 'address' not set: use setCredentials");
+    const from = this.address;
+    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');
+    const message = 'verify ownership of address by signing';
+    const signature = await this.sign(message);
+
+    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);
+  }
+
+  async sign(message) {
+    const res = this.eth_accounts.create();
+    const karnet = res.privateKey;
+    this.domFns.hideAllPopupContents();
+    this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`);
+    await this.domFns.makePopupVisible();     
+    return await __fetch(`https://social.overhide.io/sign?karnet=${karnet}&message=${btoa(message)}`, {
+      method: "GET",
+      headers: { 
+        'Content-Type': 'application/json; charset=utf-8',
+        'Authorization': `Bearer ${this.getToken()}`
+      }})
+    .then((result) => {
+      if (result.status == 200) {
+        const resultValue = await result.json();
+        this.address = resultValue.address;
+        return atob(resultValue.signature);
+      } else {
+        return false;
+      }
+    })
+    .catch(e => {
+      throw String(e)
+    });
+  
+  }
+
+  async createTransaction(amount, to, options) {
+    if (!this.mode) throw new Error("network 'mode' must be set, use setNetwork");
+    if (!this.address) throw new Error("from 'address' not set: use setCredentials");
+    const from = this.address;
+    const uri = this.getOverhideRemunerationAPIUri();
+
+    await ohledger_fns.createTransaction(
+      amount, 
+      from,
+      to,
+      (message) => this.sign(message),
+      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), 
+      this.overhide_wallet.oh_ledger_transact_fn[this.mode], 
+      options);
+
+    return true;
+  }  
+}
+
+export default ohledger_social;
\ No newline at end of file
diff --git a/src/ledgers.js b/src/ledgers.js
index 9b451a4..0898672 100644
--- a/src/ledgers.js
+++ b/src/ledgers.js
@@ -228,6 +228,7 @@ const oh$ = (function() {
      *  > | eth-web3 | `{imparterTag:..,address:..}` |
      *  > | ohledger | `{imparterTag:..,address:..,secret:..}` |
      *  > | ohledger-web3 | `{imparterTag:..,address:..}` |
+     *  > | ohledger-social | `{imparterTag:..,address:..}` |
      *  > | btc-manual | `{imparterTag:..,address:..}` |
      *  >
      *  > *imparterTag* - causing the event
@@ -394,6 +395,7 @@ const oh$ = (function() {
      *  > | eth-web3 | N/A | not suppoted |
      *  > | ohledger | `{address:..,secret:..}` | `address` is optional, if not set will be extracted from `secret` |
      *  > | ohledger-web3 | N/A | not supported |
+     *  > | ohledger-social | `{provider:..}` | `provider` is one of 'google' or 'microsoft'; if null, log-out |
      *  > | btc-manual | `{address:..}` | |
      *
      * @returns {Promise} representing a 'true' if success else 'false'; also fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`
@@ -446,6 +448,7 @@ const oh$ = (function() {
      *  > | eth-web3 | `{address:..}` |
      *  > | ohledger | `{address:..,secret:..}` |
      *  > | ohledger-web3 | `{address:..}` |
+     *  > | ohledger-social | `{address:..}` |
      *  > | btc-manual | `{address:..}` |
      */
     getCredentials = getCredentials;
@@ -596,11 +599,12 @@ const oh$ = (function() {
      * 
      *  > The options objects are as follows:
      *  > 
-     *  > | imparter tag | credentials object |
+     *  > | imparter tag | credentials object | 
      *  > | --- | --- |
      *  > | eth-web3 | null |
      *  > | ohledger | {message:.., signature:..} |
      *  > | ohledger-web3 | {message:.., signature:..} |
+     *  > | ohledger-social | {message:.., signature:..} |
      *  > | btc-manual | null |
      *  > 
      *  > If *message* and *signature* are provided they are used instead of oh$ asking for wallet to resign message.

From 8e08f7daa5a73a80415b94884a7d6791651214dc Mon Sep 17 00:00:00 2001
From: Jakub Ner <jakub.at.work@gmail.com>
Date: Thu, 13 May 2021 23:51:47 -0700
Subject: [PATCH 2/4] WIP

---
 docs/ledgers.js-rendered-docs/index.html | 23 ++++++++++++++++++++++-
 play/index.html                          |  7 ++++---
 src/imparters/ohledger-social.js         |  6 +++---
 src/ledgers.js                           | 18 ++++++++++++++++--
 4 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/docs/ledgers.js-rendered-docs/index.html b/docs/ledgers.js-rendered-docs/index.html
index ae668f1..dc5113b 100644
--- a/docs/ledgers.js-rendered-docs/index.html
+++ b/docs/ledgers.js-rendered-docs/index.html
@@ -367,7 +367,11 @@ <h3>IMPARTERS</h3>
 <ul>
 <li>ohledger</li>
 <li>ohledger-web3</li>
+<li>ohledger-social</li>
 </ul>
+<p>The <em>ohledger-social</em> imparter is to use the <em>overhide-ledger</em> with credentials stored online behind a Microsoft or
+Google social login.  The <em>overhide-ledger</em> credentials are not transferred to the client.  They sit in the cloud and
+are used once a social provider allows it.</p>
 <p>Thus far Bitcoin is only supported in manual mode (no Bitcoin wallet injection into target site):</p>
 <ul>
 <li>btc-manual</li>
@@ -418,7 +422,7 @@ <h4>eth-web3</h4>
 </blockquote>
 <p>The denomination for amounts is the Wei</p>
 </blockquote>
-<h4>ohledger, ohledger-web3</h4>
+<h4>ohledger, ohledger-web3, ohledger-social</h4>
 <blockquote>
 <p>Addresses and secret keys use Ethereum format.</p>
 <p>Addresses are 20 bytes: 42 character 'hex' strings prefixed with '0x'.</p>
@@ -724,6 +728,10 @@ <h3 class='fl m0' id='eventoncredentialsupdate'>
 <td><code>{imparterTag:..,address:..}</code></td>
 </tr>
 <tr>
+<td>ohledger-social</td>
+<td><code>{imparterTag:..,address:..}</code></td>
+</tr>
+<tr>
 <td>btc-manual</td>
 <td><code>{imparterTag:..,address:..}</code></td>
 </tr>
@@ -1397,6 +1405,11 @@ <h3 class='fl m0' id='setcredentials'>
 <td>not supported</td>
 </tr>
 <tr>
+<td>ohledger-social</td>
+<td><code>{provider:..}</code></td>
+<td><code>provider</code> is one of 'google' or 'microsoft'; if null, log-out</td>
+</tr>
+<tr>
 <td>btc-manual</td>
 <td><code>{address:..}</code></td>
 <td></td>
@@ -1698,6 +1711,10 @@ <h3 class='fl m0' id='getcredentials'>
 <td><code>{address:..}</code></td>
 </tr>
 <tr>
+<td>ohledger-social</td>
+<td><code>{address:..}</code></td>
+</tr>
+<tr>
 <td>btc-manual</td>
 <td><code>{address:..}</code></td>
 </tr>
@@ -2503,6 +2520,10 @@ <h3 class='fl m0' id='createtransaction'>
 <td>{message:.., signature:..}</td>
 </tr>
 <tr>
+<td>ohledger-social</td>
+<td>{message:.., signature:..}</td>
+</tr>
+<tr>
 <td>btc-manual</td>
 <td>null</td>
 </tr>
diff --git a/play/index.html b/play/index.html
index 6e1bcf4..0979c63 100644
--- a/play/index.html
+++ b/play/index.html
@@ -49,7 +49,7 @@
             <p>Invalid <em>imparterTag</em>.</p>
           </div>
           <div id="ohledgernote" class="w3-panel w3-yellow">
-            <p>For <em>ohledger</em> and <em>ohledger-web3</em> imparters please first <a href="https://test.ledger.overhide.io/onboard" target="_blank">register a provider address</a> with the <em>overhide-ledger</em> test network.</p>
+            <p>For <em>ohledger</em>, <em>ohledger-web3</em>, and <em>ohledger-social</em> imparters please first <a href="https://test.ledger.overhide.io/onboard" target="_blank">register a provider address</a> with the <em>overhide-ledger</em> test network.</p>
           </div>
           <div id="ethnote" class="w3-panel w3-yellow">
             <p>For the <em>eth-web3</em> imparter please use addresses from the <em>Rinkeby</em> testnet.</p>
@@ -267,9 +267,9 @@
      $("#invalidnote").hide();
     $("[name='imparterTag']").change(() => {
       data.imparterTag = data.imparterTag.trim();
-      /^ohledger(-web3)?$/.test(data.imparterTag) ? $("#ohledgernote").show() : $("#ohledgernote").hide();
+      /^ohledger(-web3|-social)?$/.test(data.imparterTag) ? $("#ohledgernote").show() : $("#ohledgernote").hide();
       /^eth-web3$/.test(data.imparterTag) ? $("#ethnote").show() : $("#ethnote").hide();
-      /^(ohledger(-web3)?|eth-web3|btc-manual)?$/.test(data.imparterTag) ? $("#invalidnote").hide() : $("#invalidnote").show();
+      /^(ohledger(-web3|-social)?|eth-web3|btc-manual)?$/.test(data.imparterTag) ? $("#invalidnote").hide() : $("#invalidnote").show();
     })
   
     /* =========================================================================
@@ -283,6 +283,7 @@
         el.append(new Option('btc-manual','btc-manual'));
         el.append(new Option('ohledger-web3','ohledger-web3'));
         el.append(new Option('ohledger','ohledger'));
+        el.append(new Option('ohledger-social','ohledger-social'));
       }
     }
 
diff --git a/src/imparters/ohledger-social.js b/src/imparters/ohledger-social.js
index 9028dea..1b3943c 100644
--- a/src/imparters/ohledger-social.js
+++ b/src/imparters/ohledger-social.js
@@ -39,7 +39,7 @@ class ohledger_social {
     return true;
   }  
 
-  setCredentials(credentials) {
+  async setCredentials(credentials) {
     if (!credentials) {
       if (!this.social) throw new Error("Not logged in");    
       this.domFns.hideAllPopupContents();
@@ -121,13 +121,13 @@ class ohledger_social {
         'Content-Type': 'application/json; charset=utf-8',
         'Authorization': `Bearer ${this.getToken()}`
       }})
-    .then((result) => {
+    .then(async (result) => {
       if (result.status == 200) {
         const resultValue = await result.json();
         this.address = resultValue.address;
         return atob(resultValue.signature);
       } else {
-        return false;
+        throw new Error(await result.text());
       }
     })
     .catch(e => {
diff --git a/src/ledgers.js b/src/ledgers.js
index 0898672..03a8170 100644
--- a/src/ledgers.js
+++ b/src/ledgers.js
@@ -3,6 +3,7 @@ import eth_web3 from './imparters/eth-web3.js';
 import btc_manual from './imparters/btc-manual.js';
 import ohledger_web3 from './imparters/ohledger-web3.js';
 import ohledger from './imparters/ohledger.js';
+import ohledger_social from './imparters/ohledger-social.js';
 import web3_wallet from './wallets/web3_wallet.js';
 import overhide_wallet from './wallets/overhide_wallet.js';
 
@@ -89,6 +90,11 @@ import overhide_wallet from './wallets/overhide_wallet.js';
  * 
  * - ohledger
  * - ohledger-web3
+ * - ohledger-social
+ * 
+ * The *ohledger-social* imparter is to use the *overhide-ledger* with credentials stored online behind a Microsoft or
+ * Google social login.  The *overhide-ledger* credentials are not transferred to the client.  They sit in the cloud and
+ * are used once a social provider allows it.
  * 
  * Thus far Bitcoin is only supported in manual mode (no Bitcoin wallet injection into target site):
  * 
@@ -114,7 +120,7 @@ import overhide_wallet from './wallets/overhide_wallet.js';
  * >
  * > The denomination for amounts is the Wei
  * 
- * #### ohledger, ohledger-web3
+ * #### ohledger, ohledger-web3, ohledger-social
  * 
  * > Addresses and secret keys use Ethereum format.
  * >
@@ -618,7 +624,7 @@ const oh$ = (function() {
   const isEnabled = new Promise((resolve) => doEnable = resolve);
   var token = null;
   var __fetch = null;
-  var imparterTags = [ohledger.tag, btc_manual.tag];
+  var imparterTags = [ohledger.tag, ohledger_social.tag, btc_manual.tag];
 
   /**
    * Function to fire events.
@@ -683,6 +689,14 @@ const oh$ = (function() {
     (...args) => __fetch(...args),
     (which, params) => fire(which, params)
   );
+  imparters[ohledger_social.tag] = new ohledger_social(
+    domFns,
+    overhideWallet,
+    web3Wallet,
+    () => token,
+    (...args) => __fetch(...args),
+    (which, params) => fire(which, params)
+  );
 
   domFns.init();
   web3Wallet.init();

From b9013a0ae8c62023d7cfcff8a2a315698640a0c6 Mon Sep 17 00:00:00 2001
From: Jakub Ner <jakub.at.work@gmail.com>
Date: Sat, 15 May 2021 14:49:28 -0700
Subject: [PATCH 3/4] WIP

---
 package.json                                 |  2 +-
 src/fns/dom_fns.js                           | 19 +++--
 src/frames/btc_manual_createTransaction.html |  2 +-
 src/frames/btc_manual_sign.html              |  4 +-
 src/imparters/btc-manual.js                  | 16 +++--
 src/imparters/ohledger-social.js             | 76 +++++++++++---------
 6 files changed, 71 insertions(+), 48 deletions(-)

diff --git a/package.json b/package.json
index 2bab6af..da95368 100644
--- a/package.json
+++ b/package.json
@@ -51,6 +51,6 @@
     "pack-prod": "webpack --mode=production",
     "all": "npm run docs & npm run pack-prod",
     "watch": "watch \"npm run pack-dev\" ./src",
-    "play": "http-server ./"
+    "play": "http-server -c-1 ./"
   }
 }
diff --git a/src/fns/dom_fns.js b/src/fns/dom_fns.js
index 55605d0..eccdd35 100644
--- a/src/fns/dom_fns.js
+++ b/src/fns/dom_fns.js
@@ -4,8 +4,13 @@ class dom_fns {
   reject = null;
 
   constructor() {
-    window.document.addEventListener('oh$-popup-close', (e) => {
-      this.makePopupHidden('user close', true);
+    window.addEventListener('message', (e) => {
+      if (!e.data || !e.data.event) return;
+      switch(e.data.event) {
+        case 'oh$-popup-close':
+          this.makePopupHidden('user close', true);
+          break;
+      }
     });    
   }
 
@@ -19,11 +24,11 @@ class dom_fns {
   // @param {string} triggerFor 
   // @param {Object} data - to stringify and sent as event.details.
   raiseEventClick(imparterTag, triggerFor) {
-    window.parent.document.dispatchEvent(new CustomEvent('oh$-event', {detail: JSON.stringify({
+    window.parent.postMessage({event: 'oh$-event', detail: JSON.stringify({
       imparterTag: imparterTag,
       triggerFor: triggerFor,
       click: true
-    })}));
+    })});
   }
 
   // raise oh$-event
@@ -31,11 +36,11 @@ class dom_fns {
   // @param {string} triggerFor 
   // @param {Object} data - to stringify and sent as event.details.
   raiseEvent(imparterTag, triggerFor, data) {
-    window.parent.document.dispatchEvent(new CustomEvent('oh$-event', {detail: JSON.stringify({
+    window.parent.postMessage({event: 'oh$-event', detail: JSON.stringify({
       ...data,
       imparterTag: imparterTag,
       triggerFor: triggerFor
-    })}));    
+    })});    
   }
 
   // promise used for popups and resolutions via oh-ledger-* messages.
@@ -85,7 +90,7 @@ class dom_fns {
     popup.style.display='none';
     popup.innerHTML = `
       <div id="oh-popup-container-div">
-        <a href="#" title="Close" id="oh-popup-close" onclick="window.parent.document.dispatchEvent(new CustomEvent('oh$-popup-close',{})); return false;">X</a>
+        <a href="#" title="Close" id="oh-popup-close" onclick="window.parent.postMessage({event: 'oh$-popup-close'}); return false;">X</a>
         <iframe id="oh-ledger-iframe"></iframe>
       </div>
     `;
diff --git a/src/frames/btc_manual_createTransaction.html b/src/frames/btc_manual_createTransaction.html
index e37b9ee..1bf8828 100644
--- a/src/frames/btc_manual_createTransaction.html
+++ b/src/frames/btc_manual_createTransaction.html
@@ -158,7 +158,7 @@
     } 
 
     function ok() {
-      window.parent.document.dispatchEvent(new CustomEvent('oh$-popup-close',{detail:'ok'}));
+      window.parent.postMessage({event: 'oh$-popup-close'}, '*');
     }
   </script>
 </html>
diff --git a/src/frames/btc_manual_sign.html b/src/frames/btc_manual_sign.html
index 1978af1..1b983b2 100644
--- a/src/frames/btc_manual_sign.html
+++ b/src/frames/btc_manual_sign.html
@@ -155,7 +155,7 @@
 
 
     function cancel() {
-      window.parent.document.dispatchEvent(new CustomEvent('oh$-popup-close',{detail:'cancel'}));
+      window.parent.postMessage({event: 'oh$-popup-close'}, '*');
     }
 
     function submit() {
@@ -177,7 +177,7 @@
         })
       }).then((result) => {
         if (result.status == 200) {
-          window.parent.document.dispatchEvent(new CustomEvent('oh$-popup-signature',{detail: {signature:btoa(data.signature)}}));
+          window.parent.postMessage({event: 'oh$-popup-signature', detail: {signature:btoa(data.signature)}}, '*');
         } else {
           data.toast = "Invalid signature.";
           fillValues();
diff --git a/src/imparters/btc-manual.js b/src/imparters/btc-manual.js
index 04ef13f..2260274 100644
--- a/src/imparters/btc-manual.js
+++ b/src/imparters/btc-manual.js
@@ -8,7 +8,7 @@ class btc_manual {
     'test':'https://test.bitcoin.overhide.io'
   };
 
-  url = 'http://localhost:8080/src/frames';
+  url = 'https://overhide.github.io/ledgers.js/src/frames';
   address = null;
   mode = 'test';
 
@@ -18,11 +18,17 @@ class btc_manual {
     this.__fetch = __fetch;
     this.fire = fire;
 
-    window.document.addEventListener('oh$-popup-signature', (e) => {
-      if ('detail' in e && e.detail && 'signature' in e.detail) {
-        this.domFns.makePopupHidden(e.detail.signature, false);
+    window.addEventListener('message', (e) => {
+      if (!e.data || !e.data.event) return;
+      switch(e.data.event) {
+        case 'oh$-popup-signature':
+          if ('detail' in e.data && e.data.detail && 'signature' in e.data.detail) {
+            this.domFns.makePopupHidden(e.data.detail.signature, false);
+          } else {
+            this.domFns.makePopupHidden(`no signature`, true);      
+          }          
+          break;
       }
-      this.domFns.makePopupHidden(`no signature`, true);      
     });    
   }
 
diff --git a/src/imparters/ohledger-social.js b/src/imparters/ohledger-social.js
index 1b3943c..d3cf37a 100644
--- a/src/imparters/ohledger-social.js
+++ b/src/imparters/ohledger-social.js
@@ -16,14 +16,19 @@ class ohledger_social {
     this.__fetch = __fetch;
     this.fire = fire;
 
-    window.document.addEventListener('oh$-login-success', (e) => {
-      this.domFns.makePopupHidden('login success', true);
-    });    
-    window.document.addEventListener('oh$-login-failed', (e) => {
-      this.domFns.makePopupHidden('login failure', true);
-    });    
-    window.document.addEventListener('oh$-logout-success', (e) => {
-      this.domFns.makePopupHidden('logout', true);
+    window.addEventListener('message', (e) => {
+      if (!e.data || !e.data.event) return;
+      switch(e.data.event) {
+        case 'oh$-login-success':
+          this.domFns.makePopupHidden('login success', false);          
+          break;
+        case 'oh$-login-failed':
+          this.domFns.makePopupHidden('login failure', true);
+          break;
+        case 'oh$-logout-success':
+          this.domFns.makePopupHidden('logout', false);
+          break;
+      }
     });    
   }
 
@@ -43,10 +48,11 @@ class ohledger_social {
     if (!credentials) {
       if (!this.social) throw new Error("Not logged in");    
       this.domFns.hideAllPopupContents();
-      this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/logout?redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Flogout`);
+      this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/logout?redirect_uri=http%3A%2F%2Fsocial.overhide.io%2Flogout`);
       await this.domFns.makePopupVisible();  
       this.address = null;
     } else if ('provider' in credentials) {
+      this.social = credentials.provider;
       await this.sign(`setting credentials on ${new Date()}`);      
     } else {
       throw new Error("Incorrect credentials options.");
@@ -110,30 +116,36 @@ class ohledger_social {
   }
 
   async sign(message) {
-    const res = this.eth_accounts.create();
-    const karnet = res.privateKey;
-    this.domFns.hideAllPopupContents();
-    this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`);
-    await this.domFns.makePopupVisible();     
-    return await __fetch(`https://social.overhide.io/sign?karnet=${karnet}&message=${btoa(message)}`, {
-      method: "GET",
-      headers: { 
-        'Content-Type': 'application/json; charset=utf-8',
-        'Authorization': `Bearer ${this.getToken()}`
-      }})
-    .then(async (result) => {
-      if (result.status == 200) {
-        const resultValue = await result.json();
-        this.address = resultValue.address;
-        return atob(resultValue.signature);
-      } else {
-        throw new Error(await result.text());
-      }
-    })
-    .catch(e => {
+    try {
+      const res = this.eth_accounts.create();
+      const karnet = res.privateKey;
+      this.domFns.hideAllPopupContents();
+      this.domFns.setFrame(`http://localhost:8120/pending`, 30, 10);
+      const popupPromise = this.domFns.makePopupVisible();     
+      window.open(
+        `https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=http%3A%2F%2Flocalhost:8120%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`,
+        '_blank',
+        {height: 300, width: 300}
+      );
+      await popupPromise;
+      return await this.__fetch(`http://localhost:8120/sign?karnet=${karnet}&message=${btoa(message)}`, {
+        method: "GET",
+        headers: { 
+          'Content-Type': 'application/json; charset=utf-8',
+          'Authorization': `Bearer ${this.getToken()}`
+        }})
+      .then(async (result) => {
+        if (result.status == 200) {
+          const resultValue = await result.json();
+          this.address = resultValue.address;
+          return atob(resultValue.signature);
+        } else {
+          throw new Error(await result.text());
+        }
+      });
+    } catch(e) {
       throw String(e)
-    });
-  
+    }  
   }
 
   async createTransaction(amount, to, options) {

From 052dd5faa0fea7f9ba78511d8a613dd07ff95fc6 Mon Sep 17 00:00:00 2001
From: Jakub Ner <jakub.at.work@gmail.com>
Date: Sat, 15 May 2021 16:08:32 -0700
Subject: [PATCH 4/4] Feature complete.

---
 dist/ledgers.js                  | 2 +-
 dist/ledgers.js.map              | 2 +-
 package.json                     | 2 +-
 src/imparters/ohledger-social.js | 6 +++---
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/dist/ledgers.js b/dist/ledgers.js
index 5d544fa..2732668 100644
--- a/dist/ledgers.js
+++ b/dist/ledgers.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("web3")):"function"==typeof define&&define.amd?define("__oh$__",["web3"],t):"object"==typeof exports?exports.__oh$__=t(require("web3")):e.__oh$__=t(e.Web3)}(window,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=10)}([function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e){return function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var o=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,r=null,n=[{key:"getTxs_check_details",value:function(e,t){if(t&&!(t instanceof Date))throw new Error("'date' must be a Date is passed in");if(!("address"in e&&e.address))throw new Error("'address' required in recipient")}},{key:"getTxs_retrieve",value:function(){var e=a(regeneratorRuntime.mark(function e(t,r,n,a,i,o,s,u){var c,l;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 2:return c="",o&&(c="&since=".concat(o.toISOString())),l="",i&&(l="&tally-dollars=true"),e.next=8,u("".concat(t,"/get-transactions/").concat(r,"/").concat(n,"?tally-only=").concat(a?"true":"false").concat(l).concat(c,"&include-refunds=true"),{headers:new Headers({Authorization:"Bearer ".concat(s)})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 8:return e.abrupt("return",e.sent);case 9:case"end":return e.stop()}},e)}));return function(t,r,n,a,i,o,s,u){return e.apply(this,arguments)}}()},{key:"isSignatureValid_call",value:function(){var e=a(regeneratorRuntime.mark(function e(t,r,n,a,i,o){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,o("".concat(t,"/is-signature-valid"),{method:"POST",headers:{"Content-Type":"application/json; charset=utf-8",Authorization:"Bearer ".concat(i)},body:JSON.stringify({signature:btoa(r),message:btoa(n),address:a})}).then(function(e){return 200==e.status}).catch(function(e){throw String(e)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t,r,n,a,i,o){return e.apply(this,arguments)}}()}],r&&i(t.prototype,r),n&&i(t,n),e}();t.a=o},function(e,t,r){"use strict";var n=r(0);function a(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function i(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function s(e){a(o,n,i,s,u,"next",e)}function u(e){a(o,n,i,s,u,"throw",e)}s(void 0)})}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var u=function(){function e(t,r,n,a){var i=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),s(this,"remuneration_uri",{main:"https://ethereum.overhide.io",rinkeby:"https://rinkeby.ethereum.overhide.io"}),this.web3_wallet=t,this.eth_accounts=t.eth_accounts,this.getToken=r,this.__fetch=n,this.fire=a,t.networkChangeDelegates.push(function(e){return i.onNetworkChange(e)})}var t,r,a;return t=e,(r=[{key:"onNetworkChange",value:function(t){this.fire("onNetworkChange",{imparterTag:e.tag,name:t,mode:"main"==t?"prod":"test",uri:this.remuneration_uri[t]})}},{key:"canSetCredentials",value:function(){return!1}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!1}},{key:"setCredentials",value:function(e){return!1}},{key:"getCredentials",value:function(){return{address:this.web3_wallet.walletAddress}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(e){return!1}},{key:"getNetwork",value:function(){return{name:this.web3_wallet.network,mode:"main"==this.web3_wallet.network?"prod":"test",uri:this.remuneration_uri[this.web3_wallet.network]}}},{key:"getOverhideRemunerationAPIUri",value:function(){return this.remuneration_uri[this.web3_wallet.network]}},{key:"getFromDollars",value:function(){var e=i(regeneratorRuntime.mark(function e(t){var r,n,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r="main"===this.web3_wallet.network?"":"test.",n=(new Date).toISOString(),e.next=4,this.__fetch("https://".concat(r,"rates.overhide.io/rates/wei/").concat(n),{headers:new Headers({Authorization:"Bearer ".concat(this.getToken())})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 4:if((a=e.sent)&&0!==a.length&&!(!1 in a[0])&&0!==a[0].minrate){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",t/a[0].minrate);case 8:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,a,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.web3_wallet.network){e.next=5;break}throw new Error("network must be set in wallet");case 5:if(this.web3_wallet.walletAddress){e.next=7;break}throw new Error("from 'walletAddress' not set: use wallet");case 7:return u=this.web3_wallet.walletAddress,e.next=10,n.a.getTxs_retrieve(s,u,o,a,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=i(regeneratorRuntime.mark(function e(){var t,r,a,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.web3_wallet.network){e.next=3;break}throw new Error("no network for imparter tag");case 3:if(this.web3_wallet.walletAddress){e.next=5;break}throw new Error("from 'walletAddress' not set: use wallet");case 5:if(r=this.web3_wallet.walletAddress,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return a="verify ownership of address by signing",e.next=11,this.sign(a);case 11:return i=e.sent,e.next=14,n.a.isSignatureValid_call(t,i,a,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=i(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.walletAddress){t.next=2;break}throw new Error("imparter ".concat(e.tag," not active"));case 2:return this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=5,window.web3.eth.personal.sign(r,this.web3_wallet.walletAddress,"");case 5:return t.abrupt("return",t.sent);case 6:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var t=i(regeneratorRuntime.mark(function t(r,n,a){var i;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.network){t.next=2;break}throw new Error("no network for imparter tag");case 2:if(this.web3_wallet.walletAddress){t.next=4;break}throw new Error("from 'walletAddress' not set: use wallet");case 4:return i=this.web3_wallet.walletAddress,this.getOverhideRemunerationAPIUri(),this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=9,new Promise(function(e,t){window.web3.eth.sendTransaction({from:i,to:n,value:r}).on("confirmation",function(t,r){e()}).on("error",function(e){t(e)})});case 9:return t.abrupt("return",!0);case 10:case"end":return t.stop()}},t,this)}));return function(e,r,n){return t.apply(this,arguments)}}()}])&&o(t.prototype,r),a&&o(t,a),e}();s(u,"tag","eth-web3"),t.a=u},function(e,t,r){"use strict";var n=r(3),a=r(0);function i(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function o(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function s(e){i(o,n,a,s,u,"next",e)}function u(e){i(o,n,a,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(){function e(t,r,n,a,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,"mode","test"),this.web3_wallet=r,this.overhide_wallet=t,this.__fetch=a,this.getToken=n,this.fire=i}var t,r,i;return t=e,(r=[{key:"canSetCredentials",value:function(){return!1}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(e){return!1}},{key:"getCredentials",value:function(){return{address:this.web3_wallet.walletAddress}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(t){return n.a.setNetwork_check_details(t),this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,currency:"USD",mode:t.mode,uri:this.overhide_wallet.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{currency:"USD",mode:this.mode,uri:this.overhide_wallet.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.overhide_wallet.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=o(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",100*t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,n,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.web3_wallet.walletAddress){e.next=7;break}throw new Error("from 'walletAddress' not set: use wallet");case 7:return u=this.web3_wallet.walletAddress,e.next=10,a.a.getTxs_retrieve(s,u,o,n,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=o(regeneratorRuntime.mark(function e(){var t,r,n,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.web3_wallet.walletAddress){e.next=5;break}throw new Error("from 'walletAddress' not set: use wallet");case 5:if(r=this.web3_wallet.walletAddress,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return n="verify ownership of address by signing",e.next=11,this.sign(n);case 11:return i=e.sent,e.next=14,a.a.isSignatureValid_call(t,i,n,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=o(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.walletAddress){t.next=2;break}throw new Error("imparter ".concat(e.tag," not active"));case 2:return this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=5,window.web3.eth.personal.sign(r,this.web3_wallet.walletAddress,"");case 5:return t.abrupt("return",t.sent);case 6:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,a){var i,o,s=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.web3_wallet.walletAddress){e.next=4;break}throw new Error("from 'walletAddress' not set: use wallet");case 4:return i=this.web3_wallet.walletAddress,o=this.getOverhideRemunerationAPIUri(),e.next=8,n.a.createTransaction(t,i,r,function(e){return s.sign(e)},function(e,t,r){return s.overhide_wallet.showOhLedgerGratisIframeUri(o,e,t,r)},this.overhide_wallet.oh_ledger_transact_fn[this.mode],a);case 8:return e.abrupt("return",!0);case 9:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&s(t.prototype,r),i&&s(t,i),e}();u(c,"tag","ohledger-web3"),t.a=c},function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,i;return t=e,r=null,i=[{key:"setNetwork_check_details",value:function(e){if(!("currency"in e))throw new Error("'currency' must be passed in");if(!("mode"in e))throw new Error("'mode' must be passed in");if(e.currency=e.currency.toUpperCase(),e.mode=e.mode.toLowerCase(),"USD"!==e.currency)throw new Error("'currency' must be 'USD'");if("prod"!==e.mode&&"test"!==e.mode)throw new Error("'mode' must be 'prod' or 'test'")}},{key:"createTransaction",value:function(){var e,t=(e=regeneratorRuntime.mark(function e(t,r,n,a,i,o,s){var u,c;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(0!=t){e.next=14;break}if(!("message"in s&&s.message&&"signature"in s&&s.signature)){e.next=6;break}u=s.message,c=s.signature,e.next=10;break;case 6:return u="verify ownership of address by signing on ".concat((new Date).toLocaleString()),e.next=9,a(u);case 9:c=e.sent;case 10:return e.next=12,i(r,c,u);case 12:e.next=16;break;case 14:return e.next=16,o(t,r,n);case 16:case"end":return e.stop()}},e)}),function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})});return function(e,r,n,a,i,o,s){return t.apply(this,arguments)}}()}],r&&a(t.prototype,r),i&&a(t,i),e}();t.a=i},function(e,t,r){"use strict";var n=r(0);function a(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function i(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function s(e){a(o,n,i,s,u,"next",e)}function u(e){a(o,n,i,s,u,"throw",e)}s(void 0)})}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var u=function(){function e(t,r,n,a){var i=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),s(this,"remuneration_uri",{prod:"https://bitcoin.overhide.io",test:"https://test.bitcoin.overhide.io"}),s(this,"url","http://localhost:8080/src/frames"),s(this,"address",null),s(this,"mode","test"),this.domFns=t,this.getToken=r,this.__fetch=n,this.fire=a,window.document.addEventListener("oh$-popup-signature",function(e){"detail"in e&&e.detail&&"signature"in e.detail&&i.domFns.makePopupHidden(e.detail.signature,!1),i.domFns.makePopupHidden("no signature",!0)})}var t,r,a;return t=e,(r=[{key:"canSetCredentials",value:function(){return!0}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(t){if(!("address"in t))throw new Error("'address' must be passed in");switch(this.mode){case"bitcoin_testnet":if(!/(tb(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[mn2][a-km-zA-HJ-NP-Z1-9]{25,39})/.test(t.address))throw new Error("invalid bitcoin_testnet address: ".concat(t.address));break;case"bitcoin":if(!/(bc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[13][a-km-zA-HJ-NP-Z1-9]{25,35})/.test(t.address))throw new Error("invalid bitcoin address: ".concat(t.address))}return this.address=t.address,this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address}),!0}},{key:"getCredentials",value:function(){return{address:this.address}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(t){if(!("mode"in t))throw new Error("'mode' must be passed in");if(t.mode=t.mode.toLowerCase(),"prod"!==t.mode&&"test"!==t.mode)throw new Error("'mode' must be 'prod' or 'test'");return this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,mode:t.mode,uri:this.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{mode:this.mode,uri:this.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=i(regeneratorRuntime.mark(function e(t){var r,n,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r="main"===this.mode?"":"test.",n=(new Date).toISOString(),e.next=4,this.__fetch("https://".concat(r,"rates.overhide.io/rates/sat/").concat(n),{headers:new Headers({Authorization:"Bearer ".concat(this.getToken())})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 4:if((a=e.sent)&&0!==a.length&&!(!1 in a[0])&&0!==a[0].minrate){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",t/a[0].minrate);case 8:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,a,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.address){e.next=7;break}throw new Error("from 'address' not set: use setCredentials");case 7:return u=this.address,e.next=10,n.a.getTxs_retrieve(s,u,o,a,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=i(regeneratorRuntime.mark(function e(){var t,r,a,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.address){e.next=5;break}throw new Error("from 'address' not set: use setCredentials");case 5:if(r=this.address,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return a="verify ownership of address by signing",e.next=11,this.sign(a);case 11:return i=e.sent,e.next=14,n.a.isSignatureValid_call(t,i,a,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=i(regeneratorRuntime.mark(function t(r){var n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.address){t.next=2;break}throw new Error("credentials for imparter ".concat(e.tag," not set"));case 2:return this.domFns.hideAllPopupContents(),n=btoa(r),this.domFns.setFrame("".concat(this.url,"/btc_manual_sign.html?address=").concat(this.address,"&message=").concat(n,"&token=").concat(this.getToken(),"&isTest=").concat("test"==this.mode)),t.t0=atob,t.next=8,this.domFns.makePopupVisible();case 8:return t.t1=t.sent,t.abrupt("return",(0,t.t0)(t.t1));case 10:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.address){e.next=4;break}throw new Error("from 'address' not set: use setCredentials");case 4:return this.address,this.domFns.hideAllPopupContents(),this.domFns.setFrame("".concat(this.url,"/btc_manual_createTransaction.html?from=").concat(this.address,"&to=").concat(r,"&value=").concat(t,"&isTest=").concat("test"==this.mode)),e.next=9,this.domFns.makePopupVisible();case 9:return e.abrupt("return",!0);case 10:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&o(t.prototype,r),a&&o(t,a),e}();s(u,"tag","btc-manual"),t.a=u},function(e,t,r){"use strict";var n=r(3),a=r(0);function i(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function o(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function s(e){i(o,n,a,s,u,"next",e)}function u(e){i(o,n,a,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(){function e(t,r,n,a,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,"address",null),u(this,"secret",null),u(this,"mode","test"),this.overhide_wallet=t,this.eth_accounts=r.eth_accounts,this.getToken=n,this.__fetch=a,this.fire=i}var t,r,i;return t=e,(r=[{key:"canSetCredentials",value:function(){return!0}},{key:"canGenerateCredentials",value:function(){return!0}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(t){if(!("secret"in t))throw new Error("'secret' must be passed in");"address"in t&&t.address?this.address=t.address.toLowerCase():this.address=this.eth_accounts.privateKeyToAccount(t.secret).address.toLowerCase(),this.secret=t.secret;try{if(this.eth_accounts.recover(this.eth_accounts.sign("test message",this.secret)).toLowerCase()!=this.address)throw new Error("'secret' not valid for 'address")}catch(e){throw new Error("'secret' not valid for 'address")}return this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address,secret:this.secret}),!0}},{key:"getCredentials",value:function(){return{address:this.address,secret:this.secret}}},{key:"generateCredentials",value:function(t){var r=this.eth_accounts.create();return this.address=r.address.toLowerCase(),this.secret=r.privateKey,this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address,secret:this.secret}),!0}},{key:"setNetwork",value:function(t){return n.a.setNetwork_check_details(t),this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,currency:"USD",mode:t.mode,uri:this.overhide_wallet.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{currency:"USD",mode:this.mode,uri:this.overhide_wallet.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.overhide_wallet.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=o(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",100*t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,n,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.address){e.next=7;break}throw new Error("from 'address' not set: use setCredentials");case 7:return u=this.address,e.next=10,a.a.getTxs_retrieve(s,u,o,n,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=o(regeneratorRuntime.mark(function e(){var t,r,n,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.address){e.next=5;break}throw new Error("from 'address' not set: use setCredentials");case 5:if(r=this.address,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return n="verify ownership of address by signing",e.next=11,this.sign(n);case 11:return i=e.sent,e.next=14,a.a.isSignatureValid_call(t,i,n,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=o(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.secret){t.next=2;break}throw new Error("credentials for imparter ".concat(e.tag," not set"));case 2:return t.abrupt("return",this.eth_accounts.sign(r,this.secret).signature);case 3:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,a){var i,o,s=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.address){e.next=4;break}throw new Error("from 'address' not set: use setCredentials");case 4:return i=this.address,o=this.getOverhideRemunerationAPIUri(),e.next=8,n.a.createTransaction(t,i,r,function(e){return s.sign(e)},function(e,t,r){return s.overhide_wallet.showOhLedgerGratisIframeUri(o,e,t,r)},this.overhide_wallet.oh_ledger_transact_fn[this.mode],a);case 8:return e.abrupt("return",!0);case 9:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&s(t.prototype,r),i&&s(t,i),e}();u(c,"tag","ohledger"),t.a=c},function(t,r){t.exports=e},function(e,t,r){"use strict";function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach(function(t){o(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var s=function(){function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),o(this,"resolve",null),o(this,"reject",null),window.document.addEventListener("oh$-popup-close",function(e){t.makePopupHidden("user close",!0)})}var t,r,n;return t=e,(r=[{key:"init",value:function(){this.createPopup()}},{key:"raiseEventClick",value:function(e,t){window.parent.document.dispatchEvent(new CustomEvent("oh$-event",{detail:JSON.stringify({imparterTag:e,triggerFor:t,click:!0})}))}},{key:"raiseEvent",value:function(e,t,r){window.parent.document.dispatchEvent(new CustomEvent("oh$-event",{detail:JSON.stringify(a(a({},r),{},{imparterTag:e,triggerFor:t}))}))}},{key:"setupNewPromise",value:function(){var e=this;return console.assert(!this.resolve,"oh-popup promise being set but already set when calling setupNewPromise(..)"),new Promise(function(t,r){e.resolve=t,e.reject=r})}},{key:"setFrame",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:80,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:60,n=document.getElementById("oh-ledger-iframe");n.setAttribute("src",e),n.style.display="block";var a=document.getElementById("oh-popup-container-div");a.style.width="".concat(t,"em"),a.style.height="".concat(r,"em")}},{key:"makePopupVisible",value:function(){return document.getElementById("oh-popup-container").style.display="block",this.setupNewPromise()}},{key:"makePopupHidden",value:function(e,t){var r=document.getElementById("oh-popup-container");this.hideAllPopupContents(),r.style.display="none",console.assert(this.resolve,"oh-popup promise not set yet calling makePopupHidden(..)"),t?this.reject(e):this.resolve(e),this.resolve=null,this.reject=null}},{key:"hideAllPopupContents",value:function(){document.getElementById("oh-ledger-iframe").style.display="none"}},{key:"createPopup",value:function(){var e=document.createElement("div");e.setAttribute("id","oh-popup-container"),e.style.display="none",e.innerHTML='\n      <div id="oh-popup-container-div">\n        <a href="#" title="Close" id="oh-popup-close" onclick="window.parent.document.dispatchEvent(new CustomEvent(\'oh$-popup-close\',{})); return false;">X</a>\n        <iframe id="oh-ledger-iframe"></iframe>\n      </div>\n    ';var t=document.createElement("style");t.innerHTML='\n      #oh-popup-container {\n          position: fixed;\n          font-family: arial, "lucida console", sans-serif;\n          top: 0;\n          right: 0;\n          bottom: 0;\n          left: 0;\n          background: rgba(0, 0, 0, 0.8);\n          z-index: 999;\n          opacity:1;\n          pointer-events: auto;\n      }\n      #oh-popup-container-div {\n          max-width: 80vw;\n          max-height: 75vh;\n          position: relative;\n          top: 15vh;\n          margin: auto auto;\n          padding: 5px 5px 5px 5px;\n          background: white;\n      }\n      #oh-popup-close {\n          background: grey;\n          color: white;\n          line-height: 25px;\n          position: absolute;\n          right: 2px;\n          text-align: center;\n          top: 2px;\n          width: 24px;\n          text-decoration: none;\n          font-weight: bold;\n      }\n      #oh-popup-close:hover {\n          background: black;\n      }\n\n      #oh-ledger-iframe {\n        display: none;\n        border: 0;\n        overflow: hidden;\n        width: 100%;\n        height: 100%;\n      }\n    ';!function r(){document.body?(document.body.appendChild(e),document.body.appendChild(t)):setTimeout(r,100)}()}}])&&i(t.prototype,r),n&&i(t,n),e}();t.a=s},function(e,t,r){"use strict";var n=r(6),a=r.n(n),i=r(1),o=r(2);function s(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function u(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var i=e.apply(t,r);function o(e){s(i,n,a,o,u,"next",e)}function u(e){s(i,n,a,o,u,"throw",e)}o(void 0)})}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){function e(t,r,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),l(this,"eth_accounts",new a.a("http://localhost:8545").eth.accounts),l(this,"walletAddress",null),l(this,"network",null),l(this,"networkChangeDelegates",[]),this.addTag=t,this.removeTag=r,this.fire=n}var t,r,n;return t=e,(r=[{key:"init",value:function(){this.detectWeb3Wallet()}},{key:"detectWeb3Wallet",value:function(){var e=this;if(window.ethereum){u(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,window.ethereum.enable();case 3:window.web3=new a.a(window.ethereum),e.next=8;break;case 6:e.prev=6,e.t0=e.catch(0);case 8:return e.next=10,t();case 10:setInterval(u(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t();case 2:case"end":return e.stop()}},e)})),500);case 11:case"end":return e.stop()}},e,null,[[0,6]])}))();var t=function(){var t=u(regeneratorRuntime.mark(function t(){var r,n,a;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,window.web3.eth.getAccounts();case 3:return r=t.sent,n=r&&r.length>0?r[0]:null,t.next=7,window.web3.eth.net.getNetworkType();case 7:a=t.sent,t.next=12;break;case 10:t.prev=10,t.t0=t.catch(0);case 12:a!==e.network&&(e.network=a,e.networkChangeDelegates.forEach(function(t){return t(e.network)})),n!==e.walletAddress&&(n?(e.addTag(i.a.tag),e.addTag(o.a.tag)):(e.removeTag(i.a.tag),e.removeTag(o.a.tag)),e.walletAddress=n,e.fire("onWalletChange",{imparterTag:i.a.tag,isPresent:!!n}),e.fire("onWalletChange",{imparterTag:o.a.tag,isPresent:!!n}),n&&(e.fire("onCredentialsUpdate",{imparterTag:i.a.tag,address:n}),e.fire("onCredentialsUpdate",{imparterTag:o.a.tag,address:n})));case 14:case"end":return t.stop()}},t,null,[[0,10]])}));return function(){return t.apply(this,arguments)}}()}}}])&&c(t.prototype,r),n&&c(t,n),e}();t.a=f},function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=function(){function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"oh_ledger_transact_fn",{prod:null,test:null}),i(this,"remuneration_uri",{prod:"https://ledger.overhide.io/v1",test:"https://test.ledger.overhide.io/v1"}),i(this,"attach",function(){document.body?r.loadOhLedgerTransactFns():setTimeout(r.attach,100)}),this.domFns=t,window.addEventListener("message",function(e){e.data&&"oh-ledger-ok"===e.data.event?r.domFns.makePopupHidden(e.data.detail):e.data&&"oh-ledger-error"===e.data.event&&r.domFns.makePopupHidden(e.data.detail,!0)},!1)}var t,r,o;return t=e,(r=[{key:"init",value:function(){this.attach()}},{key:"showOhLedgerGratisIframeUri",value:function(){var e,t=(e=regeneratorRuntime.mark(function e(t,r,n,a){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.domFns.hideAllPopupContents(),this.domFns.setFrame("".concat(t,"/gratis.html?address=").concat(r,"&signature=").concat(n,"&message=").concat(a)),e.next=4,this.domFns.makePopupVisible();case 4:case"end":return e.stop()}},e,this)}),function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})});return function(e,r,n,a){return t.apply(this,arguments)}}()},{key:"loadJS",value:function(e,t,r){var n=document.createElement("script");n.src=e,n.onload=t,n.onreadystatechange=t,r.appendChild(n)}},{key:"loadOhLedgerTransactFns",value:function(){var e=this;this.loadJS("".concat(this.remuneration_uri.prod,"/transact.js"),function(){var t=oh_ledger_transact;e.oh_ledger_transact_fn.prod=function(){return t.apply(void 0,arguments),e.domFns.setupNewPromise()}},document.body),this.loadJS("".concat(this.remuneration_uri.test,"/transact.js"),function(){var t=oh_ledger_transact;e.oh_ledger_transact_fn.test=function(){return t.apply(void 0,arguments),e.domFns.setupNewPromise()}},document.body)}}])&&a(t.prototype,r),o&&a(t,o),e}();t.a=o},function(e,t,r){"use strict";r.r(t),function(e){var n=r(7),a=r(1),i=r(4),o=r(2),s=r(5),u=r(8),c=r(9);function l(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function f(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var i=e.apply(t,r);function o(e){l(i,n,a,o,s,"next",e)}function s(e){l(i,n,a,o,s,"throw",e)}o(void 0)})}}function d(e){var t=m();return function(){var r,n=g(e);if(t){var a=g(this).constructor;r=Reflect.construct(n,arguments,a)}else r=n.apply(this,arguments);return function(e,t){if(t&&("object"===y(t)||"function"==typeof t))return t;return h(e)}(this,r)}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){var t="function"==typeof Map?new Map:void 0;return(p=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return w(e,arguments,g(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),v(n,e)})(e)}function w(e,t,r){return(w=m()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var a=new(Function.bind.apply(e,n));return r&&v(a,r.prototype),a}).apply(null,arguments)}function m(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function v(e,t){return(v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function b(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var k=function(){var t="object"==("undefined"==typeof self?"undefined":y(self))&&self.self===self&&self||"object"==(void 0===e?"undefined":y(e))&&e.global===e&&e||this||{};t.oh$=new(function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(r,p(EventTarget));var t=d(r);function r(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r);for(var n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return b(h(e=t.call.apply(t,[this].concat(a))),"enable",R),b(h(e),"getImparterTags",C),b(h(e),"canSetCredentials",O),b(h(e),"canGenerateCredentials",j),b(h(e),"canChangeNetwork",A),b(h(e),"generateCredentials",I),b(h(e),"setCredentials",N),b(h(e),"setNetwork",D),b(h(e),"getOverhideRemunerationAPIUri",H),b(h(e),"getCredentials",F),b(h(e),"getNetwork",$),b(h(e),"getFromDollars",z),b(h(e),"getTallyDollars",W),b(h(e),"getTally",V),b(h(e),"getTransactions",J),b(h(e),"isOnLedger",X),b(h(e),"sign",Y),b(h(e),"createTransaction",te),e}return r}());var r=null,l=new Promise(function(e){return r=e}),w=null,m=null,g=[s.a.tag,i.a.tag];function x(e,t){var r=document.createEvent("Event");for(var n in r.initEvent(e,!0,!0),t)r[n]=t[n];k.dispatchEvent(r)}var _=new n.a,E=new u.a(function(e){return function(e){-1==g.findIndex(function(t){return t===e})&&g.push(e)}(e)},function(e){return function(e){var t=g.findIndex(function(t){return t===e});t>-1&&g.splice(t,1)}(e)},function(e,t){return x(e,t)}),T=new c.a(_),P={};function R(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{fetcher:fetch}).fetcher;w=e,m=t,r(!0)}function C(){return g}function O(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].canSetCredentials()}function j(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].canGenerateCredentials()}function A(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].canChangeNetwork()}function N(e,t){return S.apply(this,arguments)}function S(){return(S=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",P[t].setCredentials(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function F(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].getCredentials()}function I(e,t){return U.apply(this,arguments)}function U(){return(U=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",P[t].generateCredentials(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function D(e,t){return L.apply(this,arguments)}function L(){return(L=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",P[t].setNetwork(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function $(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].getNetwork()}function H(e){if(!e in P)throw new Error("invalid imparterTag");return P[e].getOverhideRemunerationAPIUri()}function z(e,t){return B.apply(this,arguments)}function B(){return(B=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,l;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!m;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,P[t].getFromDollars(r);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function W(e,t,r){return G.apply(this,arguments)}function G(){return(G=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,K(t,r,n,!0,!0);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function V(e,t,r){return q.apply(this,arguments)}function q(){return(q=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,K(t,r,n,!0,!1);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function J(e,t,r){return M.apply(this,arguments)}function M(){return(M=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,K(t,r,n,!1,!1);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function K(e,t,r,n,a){return Z.apply(this,arguments)}function Z(){return(Z=f(regeneratorRuntime.mark(function e(t,r,n,a,i){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,l;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!m;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,P[t].getTxs(r,n,a,i);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function X(e){return Q.apply(this,arguments)}function Q(){return(Q=f(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,l;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!m;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,P[t].isOnLedger();case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Y(e,t){return ee.apply(this,arguments)}function ee(){return(ee=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,l;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!m;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,P[t].sign(r);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function te(e,t,r,n){return re.apply(this,arguments)}function re(){return(re=f(regeneratorRuntime.mark(function e(t,r,n,a){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in P)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,l;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!m;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,P[t].createTransaction(r,n,a);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}return P[a.a.tag]=new a.a(E,function(){return w},function(){return m.apply(void 0,arguments)},function(e,t){return x(e,t)}),P[i.a.tag]=new i.a(_,function(){return w},function(){return m.apply(void 0,arguments)},function(e,t){return x(e,t)}),P[o.a.tag]=new o.a(T,E,function(){return w},function(){return m.apply(void 0,arguments)},function(e,t){return x(e,t)}),P[s.a.tag]=new s.a(T,E,function(){return w},function(){return m.apply(void 0,arguments)},function(e,t){return x(e,t)}),_.init(),E.init(),T.init(),t.oh$}();t.default=k}.call(this,r(11))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r}])});
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("web3")):"function"==typeof define&&define.amd?define("__oh$__",["web3"],t):"object"==typeof exports?exports.__oh$__=t(require("web3")):e.__oh$__=t(e.Web3)}(window,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=11)}([function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e){return function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})}}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var o=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,n;return t=e,r=null,n=[{key:"getTxs_check_details",value:function(e,t){if(t&&!(t instanceof Date))throw new Error("'date' must be a Date is passed in");if(!("address"in e&&e.address))throw new Error("'address' required in recipient")}},{key:"getTxs_retrieve",value:function(){var e=a(regeneratorRuntime.mark(function e(t,r,n,a,i,o,s,u){var c,l;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 2:return c="",o&&(c="&since=".concat(o.toISOString())),l="",i&&(l="&tally-dollars=true"),e.next=8,u("".concat(t,"/get-transactions/").concat(r,"/").concat(n,"?tally-only=").concat(a?"true":"false").concat(l).concat(c,"&include-refunds=true"),{headers:new Headers({Authorization:"Bearer ".concat(s)})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 8:return e.abrupt("return",e.sent);case 9:case"end":return e.stop()}},e)}));return function(t,r,n,a,i,o,s,u){return e.apply(this,arguments)}}()},{key:"isSignatureValid_call",value:function(){var e=a(regeneratorRuntime.mark(function e(t,r,n,a,i,o){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,o("".concat(t,"/is-signature-valid"),{method:"POST",headers:{"Content-Type":"application/json; charset=utf-8",Authorization:"Bearer ".concat(i)},body:JSON.stringify({signature:btoa(r),message:btoa(n),address:a})}).then(function(e){return 200==e.status}).catch(function(e){throw String(e)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t,r,n,a,i,o){return e.apply(this,arguments)}}()}],r&&i(t.prototype,r),n&&i(t,n),e}();t.a=o},function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,r,i;return t=e,r=null,i=[{key:"setNetwork_check_details",value:function(e){if(!("currency"in e))throw new Error("'currency' must be passed in");if(!("mode"in e))throw new Error("'mode' must be passed in");if(e.currency=e.currency.toUpperCase(),e.mode=e.mode.toLowerCase(),"USD"!==e.currency)throw new Error("'currency' must be 'USD'");if("prod"!==e.mode&&"test"!==e.mode)throw new Error("'mode' must be 'prod' or 'test'")}},{key:"createTransaction",value:function(){var e,t=(e=regeneratorRuntime.mark(function e(t,r,n,a,i,o,s){var u,c;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(0!=t){e.next=14;break}if(!("message"in s&&s.message&&"signature"in s&&s.signature)){e.next=6;break}u=s.message,c=s.signature,e.next=10;break;case 6:return u="verify ownership of address by signing on ".concat((new Date).toLocaleString()),e.next=9,a(u);case 9:c=e.sent;case 10:return e.next=12,i(r,c,u);case 12:e.next=16;break;case 14:return e.next=16,o(t,r,n);case 16:case"end":return e.stop()}},e)}),function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})});return function(e,r,n,a,i,o,s){return t.apply(this,arguments)}}()}],r&&a(t.prototype,r),i&&a(t,i),e}();t.a=i},function(e,t,r){"use strict";var n=r(0);function a(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function i(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function s(e){a(o,n,i,s,u,"next",e)}function u(e){a(o,n,i,s,u,"throw",e)}s(void 0)})}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var u=function(){function e(t,r,n,a){var i=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),s(this,"remuneration_uri",{main:"https://ethereum.overhide.io",rinkeby:"https://rinkeby.ethereum.overhide.io"}),this.web3_wallet=t,this.eth_accounts=t.eth_accounts,this.getToken=r,this.__fetch=n,this.fire=a,t.networkChangeDelegates.push(function(e){return i.onNetworkChange(e)})}var t,r,a;return t=e,(r=[{key:"onNetworkChange",value:function(t){this.fire("onNetworkChange",{imparterTag:e.tag,name:t,mode:"main"==t?"prod":"test",uri:this.remuneration_uri[t]})}},{key:"canSetCredentials",value:function(){return!1}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!1}},{key:"setCredentials",value:function(e){return!1}},{key:"getCredentials",value:function(){return{address:this.web3_wallet.walletAddress}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(e){return!1}},{key:"getNetwork",value:function(){return{name:this.web3_wallet.network,mode:"main"==this.web3_wallet.network?"prod":"test",uri:this.remuneration_uri[this.web3_wallet.network]}}},{key:"getOverhideRemunerationAPIUri",value:function(){return this.remuneration_uri[this.web3_wallet.network]}},{key:"getFromDollars",value:function(){var e=i(regeneratorRuntime.mark(function e(t){var r,n,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r="main"===this.web3_wallet.network?"":"test.",n=(new Date).toISOString(),e.next=4,this.__fetch("https://".concat(r,"rates.overhide.io/rates/wei/").concat(n),{headers:new Headers({Authorization:"Bearer ".concat(this.getToken())})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 4:if((a=e.sent)&&0!==a.length&&!(!1 in a[0])&&0!==a[0].minrate){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",t/a[0].minrate);case 8:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,a,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.web3_wallet.network){e.next=5;break}throw new Error("network must be set in wallet");case 5:if(this.web3_wallet.walletAddress){e.next=7;break}throw new Error("from 'walletAddress' not set: use wallet");case 7:return u=this.web3_wallet.walletAddress,e.next=10,n.a.getTxs_retrieve(s,u,o,a,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=i(regeneratorRuntime.mark(function e(){var t,r,a,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.web3_wallet.network){e.next=3;break}throw new Error("no network for imparter tag");case 3:if(this.web3_wallet.walletAddress){e.next=5;break}throw new Error("from 'walletAddress' not set: use wallet");case 5:if(r=this.web3_wallet.walletAddress,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return a="verify ownership of address by signing",e.next=11,this.sign(a);case 11:return i=e.sent,e.next=14,n.a.isSignatureValid_call(t,i,a,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=i(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.walletAddress){t.next=2;break}throw new Error("imparter ".concat(e.tag," not active"));case 2:return this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=5,window.web3.eth.personal.sign(r,this.web3_wallet.walletAddress,"");case 5:return t.abrupt("return",t.sent);case 6:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var t=i(regeneratorRuntime.mark(function t(r,n,a){var i;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.network){t.next=2;break}throw new Error("no network for imparter tag");case 2:if(this.web3_wallet.walletAddress){t.next=4;break}throw new Error("from 'walletAddress' not set: use wallet");case 4:return i=this.web3_wallet.walletAddress,this.getOverhideRemunerationAPIUri(),this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=9,new Promise(function(e,t){window.web3.eth.sendTransaction({from:i,to:n,value:r}).on("confirmation",function(t,r){e()}).on("error",function(e){t(e)})});case 9:return t.abrupt("return",!0);case 10:case"end":return t.stop()}},t,this)}));return function(e,r,n){return t.apply(this,arguments)}}()}])&&o(t.prototype,r),a&&o(t,a),e}();s(u,"tag","eth-web3"),t.a=u},function(e,t,r){"use strict";var n=r(1),a=r(0);function i(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function o(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function s(e){i(o,n,a,s,u,"next",e)}function u(e){i(o,n,a,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(){function e(t,r,n,a,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,"mode","test"),this.web3_wallet=r,this.overhide_wallet=t,this.__fetch=a,this.getToken=n,this.fire=i}var t,r,i;return t=e,(r=[{key:"canSetCredentials",value:function(){return!1}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(e){return!1}},{key:"getCredentials",value:function(){return{address:this.web3_wallet.walletAddress}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(t){return n.a.setNetwork_check_details(t),this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,currency:"USD",mode:t.mode,uri:this.overhide_wallet.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{currency:"USD",mode:this.mode,uri:this.overhide_wallet.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.overhide_wallet.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=o(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",100*t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,n,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.web3_wallet.walletAddress){e.next=7;break}throw new Error("from 'walletAddress' not set: use wallet");case 7:return u=this.web3_wallet.walletAddress,e.next=10,a.a.getTxs_retrieve(s,u,o,n,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=o(regeneratorRuntime.mark(function e(){var t,r,n,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.web3_wallet.walletAddress){e.next=5;break}throw new Error("from 'walletAddress' not set: use wallet");case 5:if(r=this.web3_wallet.walletAddress,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return n="verify ownership of address by signing",e.next=11,this.sign(n);case 11:return i=e.sent,e.next=14,a.a.isSignatureValid_call(t,i,n,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=o(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.web3_wallet.walletAddress){t.next=2;break}throw new Error("imparter ".concat(e.tag," not active"));case 2:return this.fire("onWalletPopup",{imparterTag:e.tag}),t.next=5,window.web3.eth.personal.sign(r,this.web3_wallet.walletAddress,"");case 5:return t.abrupt("return",t.sent);case 6:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,a){var i,o,s=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.web3_wallet.walletAddress){e.next=4;break}throw new Error("from 'walletAddress' not set: use wallet");case 4:return i=this.web3_wallet.walletAddress,o=this.getOverhideRemunerationAPIUri(),e.next=8,n.a.createTransaction(t,i,r,function(e){return s.sign(e)},function(e,t,r){return s.overhide_wallet.showOhLedgerGratisIframeUri(o,e,t,r)},this.overhide_wallet.oh_ledger_transact_fn[this.mode],a);case 8:return e.abrupt("return",!0);case 9:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&s(t.prototype,r),i&&s(t,i),e}();u(c,"tag","ohledger-web3"),t.a=c},function(e,t,r){"use strict";var n=r(0);function a(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function i(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function s(e){a(o,n,i,s,u,"next",e)}function u(e){a(o,n,i,s,u,"throw",e)}s(void 0)})}}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var u=function(){function e(t,r,n,a){var i=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),s(this,"remuneration_uri",{prod:"https://bitcoin.overhide.io",test:"https://test.bitcoin.overhide.io"}),s(this,"url","https://overhide.github.io/ledgers.js/src/frames"),s(this,"address",null),s(this,"mode","test"),this.domFns=t,this.getToken=r,this.__fetch=n,this.fire=a,window.addEventListener("message",function(e){if(e.data&&e.data.event)switch(e.data.event){case"oh$-popup-signature":"detail"in e.data&&e.data.detail&&"signature"in e.data.detail?i.domFns.makePopupHidden(e.data.detail.signature,!1):i.domFns.makePopupHidden("no signature",!0)}})}var t,r,a;return t=e,(r=[{key:"canSetCredentials",value:function(){return!0}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(t){if(!("address"in t))throw new Error("'address' must be passed in");switch(this.mode){case"bitcoin_testnet":if(!/(tb(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[mn2][a-km-zA-HJ-NP-Z1-9]{25,39})/.test(t.address))throw new Error("invalid bitcoin_testnet address: ".concat(t.address));break;case"bitcoin":if(!/(bc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[13][a-km-zA-HJ-NP-Z1-9]{25,35})/.test(t.address))throw new Error("invalid bitcoin address: ".concat(t.address))}return this.address=t.address,this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address}),!0}},{key:"getCredentials",value:function(){return{address:this.address}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(t){if(!("mode"in t))throw new Error("'mode' must be passed in");if(t.mode=t.mode.toLowerCase(),"prod"!==t.mode&&"test"!==t.mode)throw new Error("'mode' must be 'prod' or 'test'");return this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,mode:t.mode,uri:this.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{mode:this.mode,uri:this.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=i(regeneratorRuntime.mark(function e(t){var r,n,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r="main"===this.mode?"":"test.",n=(new Date).toISOString(),e.next=4,this.__fetch("https://".concat(r,"rates.overhide.io/rates/sat/").concat(n),{headers:new Headers({Authorization:"Bearer ".concat(this.getToken())})}).then(function(e){return e.json()}).catch(function(e){throw String(e)});case 4:if((a=e.sent)&&0!==a.length&&!(!1 in a[0])&&0!==a[0].minrate){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",t/a[0].minrate);case 8:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,a,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.address){e.next=7;break}throw new Error("from 'address' not set: use setCredentials");case 7:return u=this.address,e.next=10,n.a.getTxs_retrieve(s,u,o,a,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=i(regeneratorRuntime.mark(function e(){var t,r,a,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.address){e.next=5;break}throw new Error("from 'address' not set: use setCredentials");case 5:if(r=this.address,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return a="verify ownership of address by signing",e.next=11,this.sign(a);case 11:return i=e.sent,e.next=14,n.a.isSignatureValid_call(t,i,a,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=i(regeneratorRuntime.mark(function t(r){var n;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.address){t.next=2;break}throw new Error("credentials for imparter ".concat(e.tag," not set"));case 2:return this.domFns.hideAllPopupContents(),n=btoa(r),this.domFns.setFrame("".concat(this.url,"/btc_manual_sign.html?address=").concat(this.address,"&message=").concat(n,"&token=").concat(this.getToken(),"&isTest=").concat("test"==this.mode)),t.t0=atob,t.next=8,this.domFns.makePopupVisible();case 8:return t.t1=t.sent,t.abrupt("return",(0,t.t0)(t.t1));case 10:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=i(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.address){e.next=4;break}throw new Error("from 'address' not set: use setCredentials");case 4:return this.address,this.domFns.hideAllPopupContents(),this.domFns.setFrame("".concat(this.url,"/btc_manual_createTransaction.html?from=").concat(this.address,"&to=").concat(r,"&value=").concat(t,"&isTest=").concat("test"==this.mode)),e.next=9,this.domFns.makePopupVisible();case 9:return e.abrupt("return",!0);case 10:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&o(t.prototype,r),a&&o(t,a),e}();s(u,"tag","btc-manual"),t.a=u},function(e,t,r){"use strict";var n=r(1),a=r(0);function i(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function o(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function s(e){i(o,n,a,s,u,"next",e)}function u(e){i(o,n,a,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(){function e(t,r,n,a,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,"address",null),u(this,"secret",null),u(this,"mode","test"),this.overhide_wallet=t,this.eth_accounts=r.eth_accounts,this.getToken=n,this.__fetch=a,this.fire=i}var t,r,i;return t=e,(r=[{key:"canSetCredentials",value:function(){return!0}},{key:"canGenerateCredentials",value:function(){return!0}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(t){if(!("secret"in t))throw new Error("'secret' must be passed in");"address"in t&&t.address?this.address=t.address.toLowerCase():this.address=this.eth_accounts.privateKeyToAccount(t.secret).address.toLowerCase(),this.secret=t.secret;try{if(this.eth_accounts.recover(this.eth_accounts.sign("test message",this.secret)).toLowerCase()!=this.address)throw new Error("'secret' not valid for 'address")}catch(e){throw new Error("'secret' not valid for 'address")}return this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address,secret:this.secret}),!0}},{key:"getCredentials",value:function(){return{address:this.address,secret:this.secret}}},{key:"generateCredentials",value:function(t){var r=this.eth_accounts.create();return this.address=r.address.toLowerCase(),this.secret=r.privateKey,this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address,secret:this.secret}),!0}},{key:"setNetwork",value:function(t){return n.a.setNetwork_check_details(t),this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,currency:"USD",mode:t.mode,uri:this.overhide_wallet.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{currency:"USD",mode:this.mode,uri:this.overhide_wallet.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.overhide_wallet.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=o(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",100*t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,n,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.address){e.next=7;break}throw new Error("from 'address' not set: use setCredentials");case 7:return u=this.address,e.next=10,a.a.getTxs_retrieve(s,u,o,n,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=o(regeneratorRuntime.mark(function e(){var t,r,n,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.address){e.next=5;break}throw new Error("from 'address' not set: use setCredentials");case 5:if(r=this.address,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return n="verify ownership of address by signing",e.next=11,this.sign(n);case 11:return i=e.sent,e.next=14,a.a.isSignatureValid_call(t,i,n,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var t=o(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(this.secret){t.next=2;break}throw new Error("credentials for imparter ".concat(e.tag," not set"));case 2:return t.abrupt("return",this.eth_accounts.sign(r,this.secret).signature);case 3:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,a){var i,o,s=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.address){e.next=4;break}throw new Error("from 'address' not set: use setCredentials");case 4:return i=this.address,o=this.getOverhideRemunerationAPIUri(),e.next=8,n.a.createTransaction(t,i,r,function(e){return s.sign(e)},function(e,t,r){return s.overhide_wallet.showOhLedgerGratisIframeUri(o,e,t,r)},this.overhide_wallet.oh_ledger_transact_fn[this.mode],a);case 8:return e.abrupt("return",!0);case 9:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&s(t.prototype,r),i&&s(t,i),e}();u(c,"tag","ohledger"),t.a=c},function(e,t,r){"use strict";var n=r(1),a=r(0);function i(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function o(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function s(e){i(o,n,a,s,u,"next",e)}function u(e){i(o,n,a,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=function(){function e(t,r,n,a,i,o){var s=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),u(this,"address",null),u(this,"mode","test"),u(this,"social",null),this.domFns=t,this.overhide_wallet=r,this.eth_accounts=n.eth_accounts,this.getToken=a,this.__fetch=i,this.fire=o,window.addEventListener("message",function(e){if(e.data&&e.data.event)switch(e.data.event){case"oh$-login-success":s.domFns.makePopupHidden("login success",!1);break;case"oh$-login-failed":s.domFns.makePopupHidden("login failure",!0);break;case"oh$-logout-success":s.domFns.makePopupHidden("logout",!1)}})}var t,r,i;return t=e,(r=[{key:"canSetCredentials",value:function(){return!0}},{key:"canGenerateCredentials",value:function(){return!1}},{key:"canChangeNetwork",value:function(){return!0}},{key:"setCredentials",value:function(){var t=o(regeneratorRuntime.mark(function t(r){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(r){t.next=10;break}if(this.social){t.next=3;break}throw new Error("Not logged in");case 3:return this.domFns.hideAllPopupContents(),this.domFns.setFrame("https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_".concat(this.social,"/oauth2/v2.0/logout?redirect_uri=http%3A%2F%2Fsocial.overhide.io%2Flogout")),t.next=7,this.domFns.makePopupVisible();case 7:this.address=null,t.next=17;break;case 10:if(!("provider"in r)){t.next=16;break}return this.social=r.provider,t.next=14,this.sign("setting credentials on ".concat(new Date));case 14:t.next=17;break;case 16:throw new Error("Incorrect credentials options.");case 17:return this.fire("onCredentialsUpdate",{imparterTag:e.tag,address:this.address}),t.abrupt("return",!0);case 19:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}()},{key:"getCredentials",value:function(){return{address:this.address}}},{key:"generateCredentials",value:function(e){return!1}},{key:"setNetwork",value:function(t){return n.a.setNetwork_check_details(t),this.mode=t.mode,this.fire("onNetworkChange",{imparterTag:e.tag,currency:"USD",mode:t.mode,uri:this.overhide_wallet.remuneration_uri[t.mode]}),!0}},{key:"getNetwork",value:function(){return{currency:"USD",mode:this.mode,uri:this.overhide_wallet.remuneration_uri[this.mode]}}},{key:"getOverhideRemunerationAPIUri",value:function(){if(!this.mode)throw new Error("network 'mode' must be set, use setNetwork");return this.overhide_wallet.remuneration_uri[this.mode]}},{key:"getFromDollars",value:function(){var e=o(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",100*t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"getTxs",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,n,i){var o,s,u;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a.a.getTxs_check_details(t,r),o=t.address,s=this.getOverhideRemunerationAPIUri(),this.mode){e.next=5;break}throw new Error("network 'mode' must be set, use setNetwork");case 5:if(this.address){e.next=7;break}throw new Error("from 'address' not set: use setCredentials");case 7:return u=this.address,e.next=10,a.a.getTxs_retrieve(s,u,o,n,i,r,this.getToken(),this.__fetch);case 10:return e.abrupt("return",e.sent);case 11:case"end":return e.stop()}},e,this)}));return function(t,r,n,a){return e.apply(this,arguments)}}()},{key:"isOnLedger",value:function(){var e=o(regeneratorRuntime.mark(function e(){var t,r,n,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.getOverhideRemunerationAPIUri(),this.mode){e.next=3;break}throw new Error("network 'mode' must be set, use setNetwork");case 3:if(this.address){e.next=5;break}throw new Error("from 'address' not set: use setCredentials");case 5:if(r=this.address,t){e.next=8;break}throw new Error("no uri for request, unsupported network selected in wallet?");case 8:return n="verify ownership of address by signing",e.next=11,this.sign(n);case 11:return i=e.sent,e.next=14,a.a.isSignatureValid_call(t,i,n,r,this.getToken(),this.__fetch);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"sign",value:function(){var e=o(regeneratorRuntime.mark(function e(t){var r,n,a,i=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r=this.eth_accounts.create(),n=r.privateKey,this.domFns.hideAllPopupContents(),this.domFns.setFrame("https://social.overhide.io/pending",30,10),a=this.domFns.makePopupVisible(),window.open("https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_".concat(this.social,"/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Fredirect/").concat(this.social,"&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=").concat(n),"_blank",{height:300,width:300}),e.next=9,a;case 9:return e.next=11,this.__fetch("https://social.overhide.io/sign?karnet=".concat(n,"&message=").concat(btoa(t)),{method:"GET",headers:{"Content-Type":"application/json; charset=utf-8",Authorization:"Bearer ".concat(this.getToken())}}).then(function(){var e=o(regeneratorRuntime.mark(function e(t){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(200!=t.status){e.next=8;break}return e.next=3,t.json();case 3:return r=e.sent,i.address=r.address,e.abrupt("return",atob(r.signature));case 8:return e.t0=Error,e.next=11,t.text();case 11:throw e.t1=e.sent,new e.t0(e.t1);case 13:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}());case 11:return e.abrupt("return",e.sent);case 14:throw e.prev=14,e.t0=e.catch(0),String(e.t0);case 17:case"end":return e.stop()}},e,this,[[0,14]])}));return function(t){return e.apply(this,arguments)}}()},{key:"createTransaction",value:function(){var e=o(regeneratorRuntime.mark(function e(t,r,a){var i,o,s=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this.mode){e.next=2;break}throw new Error("network 'mode' must be set, use setNetwork");case 2:if(this.address){e.next=4;break}throw new Error("from 'address' not set: use setCredentials");case 4:return i=this.address,o=this.getOverhideRemunerationAPIUri(),e.next=8,n.a.createTransaction(t,i,r,function(e){return s.sign(e)},function(e,t,r){return s.overhide_wallet.showOhLedgerGratisIframeUri(o,e,t,r)},this.overhide_wallet.oh_ledger_transact_fn[this.mode],a);case 8:return e.abrupt("return",!0);case 9:case"end":return e.stop()}},e,this)}));return function(t,r,n){return e.apply(this,arguments)}}()}])&&s(t.prototype,r),i&&s(t,i),e}();u(c,"tag","ohledger-social"),t.a=c},function(t,r){t.exports=e},function(e,t,r){"use strict";function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach(function(t){o(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var s=function(){function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),o(this,"resolve",null),o(this,"reject",null),window.addEventListener("message",function(e){if(e.data&&e.data.event)switch(e.data.event){case"oh$-popup-close":t.makePopupHidden("user close",!0)}})}var t,r,n;return t=e,(r=[{key:"init",value:function(){this.createPopup()}},{key:"raiseEventClick",value:function(e,t){window.parent.postMessage({event:"oh$-event",detail:JSON.stringify({imparterTag:e,triggerFor:t,click:!0})})}},{key:"raiseEvent",value:function(e,t,r){window.parent.postMessage({event:"oh$-event",detail:JSON.stringify(a(a({},r),{},{imparterTag:e,triggerFor:t}))})}},{key:"setupNewPromise",value:function(){var e=this;return console.assert(!this.resolve,"oh-popup promise being set but already set when calling setupNewPromise(..)"),new Promise(function(t,r){e.resolve=t,e.reject=r})}},{key:"setFrame",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:80,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:60,n=document.getElementById("oh-ledger-iframe");n.setAttribute("src",e),n.style.display="block";var a=document.getElementById("oh-popup-container-div");a.style.width="".concat(t,"em"),a.style.height="".concat(r,"em")}},{key:"makePopupVisible",value:function(){return document.getElementById("oh-popup-container").style.display="block",this.setupNewPromise()}},{key:"makePopupHidden",value:function(e,t){var r=document.getElementById("oh-popup-container");this.hideAllPopupContents(),r.style.display="none",console.assert(this.resolve,"oh-popup promise not set yet calling makePopupHidden(..)"),t?this.reject(e):this.resolve(e),this.resolve=null,this.reject=null}},{key:"hideAllPopupContents",value:function(){document.getElementById("oh-ledger-iframe").style.display="none"}},{key:"createPopup",value:function(){var e=document.createElement("div");e.setAttribute("id","oh-popup-container"),e.style.display="none",e.innerHTML='\n      <div id="oh-popup-container-div">\n        <a href="#" title="Close" id="oh-popup-close" onclick="window.parent.postMessage({event: \'oh$-popup-close\'}); return false;">X</a>\n        <iframe id="oh-ledger-iframe"></iframe>\n      </div>\n    ';var t=document.createElement("style");t.innerHTML='\n      #oh-popup-container {\n          position: fixed;\n          font-family: arial, "lucida console", sans-serif;\n          top: 0;\n          right: 0;\n          bottom: 0;\n          left: 0;\n          background: rgba(0, 0, 0, 0.8);\n          z-index: 999;\n          opacity:1;\n          pointer-events: auto;\n      }\n      #oh-popup-container-div {\n          max-width: 80vw;\n          max-height: 75vh;\n          position: relative;\n          top: 15vh;\n          margin: auto auto;\n          padding: 5px 5px 5px 5px;\n          background: white;\n      }\n      #oh-popup-close {\n          background: grey;\n          color: white;\n          line-height: 25px;\n          position: absolute;\n          right: 2px;\n          text-align: center;\n          top: 2px;\n          width: 24px;\n          text-decoration: none;\n          font-weight: bold;\n      }\n      #oh-popup-close:hover {\n          background: black;\n      }\n\n      #oh-ledger-iframe {\n        display: none;\n        border: 0;\n        overflow: hidden;\n        width: 100%;\n        height: 100%;\n      }\n    ';!function r(){document.body?(document.body.appendChild(e),document.body.appendChild(t)):setTimeout(r,100)}()}}])&&i(t.prototype,r),n&&i(t,n),e}();t.a=s},function(e,t,r){"use strict";var n=r(7),a=r.n(n),i=r(2),o=r(3);function s(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function u(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var i=e.apply(t,r);function o(e){s(i,n,a,o,u,"next",e)}function u(e){s(i,n,a,o,u,"throw",e)}o(void 0)})}}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var d=function(){function e(t,r,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),l(this,"eth_accounts",new a.a("http://localhost:8545").eth.accounts),l(this,"walletAddress",null),l(this,"network",null),l(this,"networkChangeDelegates",[]),this.addTag=t,this.removeTag=r,this.fire=n}var t,r,n;return t=e,(r=[{key:"init",value:function(){this.detectWeb3Wallet()}},{key:"detectWeb3Wallet",value:function(){var e=this;if(window.ethereum){u(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,window.ethereum.enable();case 3:window.web3=new a.a(window.ethereum),e.next=8;break;case 6:e.prev=6,e.t0=e.catch(0);case 8:return e.next=10,t();case 10:setInterval(u(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t();case 2:case"end":return e.stop()}},e)})),500);case 11:case"end":return e.stop()}},e,null,[[0,6]])}))();var t=function(){var t=u(regeneratorRuntime.mark(function t(){var r,n,a;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,window.web3.eth.getAccounts();case 3:return r=t.sent,n=r&&r.length>0?r[0]:null,t.next=7,window.web3.eth.net.getNetworkType();case 7:a=t.sent,t.next=12;break;case 10:t.prev=10,t.t0=t.catch(0);case 12:a!==e.network&&(e.network=a,e.networkChangeDelegates.forEach(function(t){return t(e.network)})),n!==e.walletAddress&&(n?(e.addTag(i.a.tag),e.addTag(o.a.tag)):(e.removeTag(i.a.tag),e.removeTag(o.a.tag)),e.walletAddress=n,e.fire("onWalletChange",{imparterTag:i.a.tag,isPresent:!!n}),e.fire("onWalletChange",{imparterTag:o.a.tag,isPresent:!!n}),n&&(e.fire("onCredentialsUpdate",{imparterTag:i.a.tag,address:n}),e.fire("onCredentialsUpdate",{imparterTag:o.a.tag,address:n})));case 14:case"end":return t.stop()}},t,null,[[0,10]])}));return function(){return t.apply(this,arguments)}}()}}}])&&c(t.prototype,r),n&&c(t,n),e}();t.a=d},function(e,t,r){"use strict";function n(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=function(){function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"oh_ledger_transact_fn",{prod:null,test:null}),i(this,"remuneration_uri",{prod:"https://ledger.overhide.io/v1",test:"https://test.ledger.overhide.io/v1"}),i(this,"attach",function(){document.body?r.loadOhLedgerTransactFns():setTimeout(r.attach,100)}),this.domFns=t,window.addEventListener("message",function(e){e.data&&"oh-ledger-ok"===e.data.event?r.domFns.makePopupHidden(e.data.detail):e.data&&"oh-ledger-error"===e.data.event&&r.domFns.makePopupHidden(e.data.detail,!0)},!1)}var t,r,o;return t=e,(r=[{key:"init",value:function(){this.attach()}},{key:"showOhLedgerGratisIframeUri",value:function(){var e,t=(e=regeneratorRuntime.mark(function e(t,r,n,a){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.domFns.hideAllPopupContents(),this.domFns.setFrame("".concat(t,"/gratis.html?address=").concat(r,"&signature=").concat(n,"&message=").concat(a)),e.next=4,this.domFns.makePopupVisible();case 4:case"end":return e.stop()}},e,this)}),function(){var t=this,r=arguments;return new Promise(function(a,i){var o=e.apply(t,r);function s(e){n(o,a,i,s,u,"next",e)}function u(e){n(o,a,i,s,u,"throw",e)}s(void 0)})});return function(e,r,n,a){return t.apply(this,arguments)}}()},{key:"loadJS",value:function(e,t,r){var n=document.createElement("script");n.src=e,n.onload=t,n.onreadystatechange=t,r.appendChild(n)}},{key:"loadOhLedgerTransactFns",value:function(){var e=this;this.loadJS("".concat(this.remuneration_uri.prod,"/transact.js"),function(){var t=oh_ledger_transact;e.oh_ledger_transact_fn.prod=function(){return t.apply(void 0,arguments),e.domFns.setupNewPromise()}},document.body),this.loadJS("".concat(this.remuneration_uri.test,"/transact.js"),function(){var t=oh_ledger_transact;e.oh_ledger_transact_fn.test=function(){return t.apply(void 0,arguments),e.domFns.setupNewPromise()}},document.body)}}])&&a(t.prototype,r),o&&a(t,o),e}();t.a=o},function(e,t,r){"use strict";r.r(t),function(e){var n=r(8),a=r(2),i=r(4),o=r(3),s=r(5),u=r(6),c=r(9),l=r(10);function d(e,t,r,n,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void r(e)}s.done?t(u):Promise.resolve(u).then(n,a)}function f(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var i=e.apply(t,r);function o(e){d(i,n,a,o,s,"next",e)}function s(e){d(i,n,a,o,s,"throw",e)}o(void 0)})}}function h(e){var t=v();return function(){var r,n=b(e);if(t){var a=b(this).constructor;r=Reflect.construct(n,arguments,a)}else r=n.apply(this,arguments);return function(e,t){if(t&&("object"===y(t)||"function"==typeof t))return t;return p(e)}(this,r)}}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e){var t="function"==typeof Map?new Map:void 0;return(w=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return m(e,arguments,b(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),g(n,e)})(e)}function m(e,t,r){return(m=v()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var a=new(Function.bind.apply(e,n));return r&&g(a,r.prototype),a}).apply(null,arguments)}function v(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function g(e,t){return(g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function b(e){return(b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function k(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var x=function(){var t="object"==("undefined"==typeof self?"undefined":y(self))&&self.self===self&&self||"object"==(void 0===e?"undefined":y(e))&&e.global===e&&e||this||{};t.oh$=new(function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&g(e,t)}(r,w(EventTarget));var t=h(r);function r(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r);for(var n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return k(p(e=t.call.apply(t,[this].concat(a))),"enable",C),k(p(e),"getImparterTags",O),k(p(e),"canSetCredentials",j),k(p(e),"canGenerateCredentials",A),k(p(e),"canChangeNetwork",N),k(p(e),"generateCredentials",I),k(p(e),"setCredentials",S),k(p(e),"setNetwork",L),k(p(e),"getOverhideRemunerationAPIUri",z),k(p(e),"getCredentials",U),k(p(e),"getNetwork",H),k(p(e),"getFromDollars",B),k(p(e),"getTallyDollars",V),k(p(e),"getTally",q),k(p(e),"getTransactions",J),k(p(e),"isOnLedger",Q),k(p(e),"sign",ee),k(p(e),"createTransaction",re),e}return r}());var r=null,d=new Promise(function(e){return r=e}),m=null,v=null,b=[s.a.tag,u.a.tag,i.a.tag];function _(e,t){var r=document.createEvent("Event");for(var n in r.initEvent(e,!0,!0),t)r[n]=t[n];x.dispatchEvent(r)}var T=new n.a,P=new c.a(function(e){return function(e){-1==b.findIndex(function(t){return t===e})&&b.push(e)}(e)},function(e){return function(e){var t=b.findIndex(function(t){return t===e});t>-1&&b.splice(t,1)}(e)},function(e,t){return _(e,t)}),R=new l.a(T),E={};function C(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{fetcher:fetch}).fetcher;m=e,v=t,r(!0)}function O(){return b}function j(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].canSetCredentials()}function A(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].canGenerateCredentials()}function N(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].canChangeNetwork()}function S(e,t){return F.apply(this,arguments)}function F(){return(F=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",E[t].setCredentials(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function U(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].getCredentials()}function I(e,t){return D.apply(this,arguments)}function D(){return(D=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",E[t].generateCredentials(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function L(e,t){return $.apply(this,arguments)}function $(){return($=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.abrupt("return",E[t].setNetwork(r));case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function H(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].getNetwork()}function z(e){if(!e in E)throw new Error("invalid imparterTag");return E[e].getOverhideRemunerationAPIUri()}function B(e,t){return G.apply(this,arguments)}function G(){return(G=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,d;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!v;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,E[t].getFromDollars(r);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function V(e,t,r){return M.apply(this,arguments)}function M(){return(M=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Z(t,r,n,!0,!0);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function q(e,t,r){return W.apply(this,arguments)}function W(){return(W=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Z(t,r,n,!0,!1);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function J(e,t,r){return K.apply(this,arguments)}function K(){return(K=f(regeneratorRuntime.mark(function e(t,r,n){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Z(t,r,n,!1,!1);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Z(e,t,r,n,a){return X.apply(this,arguments)}function X(){return(X=f(regeneratorRuntime.mark(function e(t,r,n,a,i){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,d;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!v;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,E[t].getTxs(r,n,a,i);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Q(e){return Y.apply(this,arguments)}function Y(){return(Y=f(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,d;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!v;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,E[t].isOnLedger();case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function ee(e,t){return te.apply(this,arguments)}function te(){return(te=f(regeneratorRuntime.mark(function e(t,r){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,d;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!v;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,E[t].sign(r);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}function re(e,t,r,n){return ne.apply(this,arguments)}function ne(){return(ne=f(regeneratorRuntime.mark(function e(t,r,n,a){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(!t in E)){e.next=2;break}throw new Error("invalid imparterTag");case 2:return e.next=4,d;case 4:if(e.t0=e.sent,!e.t0){e.next=7;break}e.t0=!v;case 7:if(!e.t0){e.next=9;break}throw new Error("did you forget to `oh$.enable(..)`?");case 9:return e.next=11,E[t].createTransaction(r,n,a);case 11:return e.abrupt("return",e.sent);case 12:case"end":return e.stop()}},e)}))).apply(this,arguments)}return E[a.a.tag]=new a.a(P,function(){return m},function(){return v.apply(void 0,arguments)},function(e,t){return _(e,t)}),E[i.a.tag]=new i.a(T,function(){return m},function(){return v.apply(void 0,arguments)},function(e,t){return _(e,t)}),E[o.a.tag]=new o.a(R,P,function(){return m},function(){return v.apply(void 0,arguments)},function(e,t){return _(e,t)}),E[s.a.tag]=new s.a(R,P,function(){return m},function(){return v.apply(void 0,arguments)},function(e,t){return _(e,t)}),E[u.a.tag]=new u.a(T,R,P,function(){return m},function(){return v.apply(void 0,arguments)},function(e,t){return _(e,t)}),T.init(),P.init(),R.init(),t.oh$}();t.default=x}.call(this,r(12))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r}])});
 //# sourceMappingURL=ledgers.js.map
\ No newline at end of file
diff --git a/dist/ledgers.js.map b/dist/ledgers.js.map
index da903dd..cdacef7 100644
--- a/dist/ledgers.js.map
+++ b/dist/ledgers.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://__oh$__/webpack/universalModuleDefinition","webpack://__oh$__/webpack/bootstrap","webpack://__oh$__/./src/fns/imparter_fns.js","webpack://__oh$__/./src/imparters/eth-web3.js","webpack://__oh$__/./src/imparters/ohledger-web3.js","webpack://__oh$__/./src/fns/ohledger_fns.js","webpack://__oh$__/./src/imparters/btc-manual.js","webpack://__oh$__/./src/imparters/ohledger.js","webpack://__oh$__/external {\"commonjs\":\"web3\",\"commonjs2\":\"web3\",\"amd\":\"web3\",\"root\":\"Web3\"}","webpack://__oh$__/./src/fns/dom_fns.js","webpack://__oh$__/./src/wallets/web3_wallet.js","webpack://__oh$__/./src/wallets/overhide_wallet.js","webpack://__oh$__/./src/ledgers.js","webpack://__oh$__/(webpack)/buildin/global.js"],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__6__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","imparter_fns","recipient","date","Date","Error","address","_callee","uri","from","to","tallyOnly","tallyDollars","token","__fetch","since","dollarsQuery","regeneratorRuntime","wrap","_context","prev","next","concat","toISOString","headers","Headers","Authorization","then","res","json","e","String","abrupt","sent","stop","_callee2","signature","message","_context2","method","Content-Type","body","JSON","stringify","btoa","result","status","eth_web3","web3_wallet","getToken","fire","_this","this","_classCallCheck","_defineProperty","main","rinkeby","eth_accounts","networkChangeDelegates","push","network","onNetworkChange","imparterTag","tag","remuneration_uri","credentials","walletAddress","options","details","dollarAmount","hostPrefix","now","length","minrate","getTxs_check_details","getOverhideRemunerationAPIUri","getTxs_retrieve","_callee3","_context3","sign","isSignatureValid_call","_callee4","_context4","web3","eth","personal","_callee5","amount","_context5","Promise","resolve","reject","sendTransaction","on","confirmationNumber","receipt","error","ohledger_web3","overhide_wallet","ohledger_fns","setNetwork_check_details","currency","createTransaction","showOhLedgerGratisIframeUri","oh_ledger_transact_fn","toUpperCase","toLowerCase","signFn","showGratisFn","ohLedgerTransactFn","toLocaleString","btc_manual","domFns","prod","test","document","addEventListener","detail","makePopupHidden","base64Message","hideAllPopupContents","setFrame","url","t0","atob","makePopupVisible","t1","ohledger","privateKeyToAccount","secret","recover","err","privateKey","dom_fns","createPopup","triggerFor","parent","dispatchEvent","CustomEvent","click","data","_objectSpread","_this2","console","assert","rs","rj","src","widthEm","arguments","undefined","heightEm","frame","getElementById","setAttribute","style","display","container","width","height","setupNewPromise","params","isError","popup","createElement","innerHTML","attach","appendChild","setTimeout","addTag","removeTag","Web3","accounts","detectWeb3Wallet","ethereum","_asyncToGenerator","mark","enable","detectWalletCb","setInterval","_ref3","currentAccounts","currentAddress","currentNetwork","getAccounts","net","getNetworkType","forEach","isPresent","apply","loadOhLedgerTransactFns","event","implementationCode","location","scriptTag","onload","onreadystatechange","loadJS","fn","oh_ledger_transact","oh$","self","_typeof","global","_EventTarget","_inherits","_class2","_wrapNativeSuper","EventTarget","_super","_createSuper","_len","args","Array","_key","_assertThisInitialized","getImparterTags","canSetCredentials","canGenerateCredentials","canChangeNetwork","generateCredentials","setCredentials","setNetwork","getCredentials","getNetwork","getFromDollars","getTallyDollars","getTally","getTransactions","isOnLedger","doEnable","isEnabled","imparterTags","which","createEvent","param","initEvent","web3Wallet","findIndex","v","imparterTagIndex","splice","overhideWallet","imparters","_token","fetcher","fetch","_x","_x2","_setCredentials","_x3","_x4","_generateCredentials","_x5","_x6","_setNetwork","_x7","_x8","_getFromDollars","_x9","_x10","_x11","_getTallyDollars","getTxs","_x12","_x13","_x14","_getTally","_callee6","_context6","_x15","_x16","_x17","_getTransactions","_callee7","_context7","_x18","_x19","_x20","_x21","_x22","_getTxs","_callee8","_context8","_x23","_isOnLedger","_callee9","_context9","_x24","_x25","_sign","_callee10","_context10","_x26","_x27","_x28","_x29","_createTransaction","_callee11","_context11","init","g","Function"],"mappings":"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","file":"ledgers.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"web3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"__oh$__\", [\"web3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"__oh$__\"] = factory(require(\"web3\"));\n\telse\n\t\troot[\"__oh$__\"] = factory(root[\"Web3\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__6__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 10);\n","class imparter_fns {\r\n  static getTxs_check_details(recipient, date) {\r\n    if (date && !(date instanceof Date)) throw new Error(\"'date' must be a Date is passed in\");\r\n    if (!('address' in recipient) || !recipient.address) throw new Error(\"'address' required in recipient\");  }\r\n\r\n  static async getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, token, __fetch) {\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    let since = '';\r\n    if (date) {\r\n      since = `&since=${date.toISOString()}`;\r\n    }\r\n    let dollarsQuery = '';\r\n    if (tallyDollars) {\r\n      dollarsQuery = `&tally-dollars=true`\r\n    }\r\n    return await __fetch(`${uri}/get-transactions/${from}/${to}?tally-only=${tallyOnly ? 'true' : 'false'}${dollarsQuery}${since}&include-refunds=true`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${token}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });    \r\n  }\r\n\r\n  static async isSignatureValid_call(uri, signature, message, from, token, __fetch) {\r\n    return await __fetch(`${uri}/is-signature-valid`, {\r\n      method: \"POST\",\r\n      headers: { \r\n        'Content-Type': 'application/json; charset=utf-8',\r\n        'Authorization': `Bearer ${token}`\r\n      },\r\n      body: JSON.stringify({\r\n        signature: btoa(signature),\r\n        message: btoa(message),\r\n        address: from\r\n      })\r\n    })\r\n      .then((result) => {\r\n        if (result.status == 200) {\r\n          return true;\r\n        } else {\r\n          return false;\r\n        }\r\n      })\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n  }\r\n}\r\n\r\nexport default imparter_fns;","import imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass eth_web3 {\r\n  static tag = 'eth-web3';\r\n\r\n  remuneration_uri = {\r\n    'main':'https://ethereum.overhide.io',\r\n    'rinkeby':'https://rinkeby.ethereum.overhide.io'\r\n  };\r\n\r\n  constructor(web3_wallet, getToken, __fetch, fire) {\r\n    this.web3_wallet = web3_wallet;\r\n    this.eth_accounts = web3_wallet.eth_accounts;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n\r\n    web3_wallet.networkChangeDelegates.push((network) => this.onNetworkChange(network));\r\n  }\r\n\r\n  onNetworkChange(network) {\r\n    this.fire('onNetworkChange',{imparterTag: eth_web3.tag, name: network, mode: network == 'main' ? 'prod' : 'test', uri: this.remuneration_uri[network]});\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return false;\r\n  }\r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }    \r\n\r\n  canChangeNetwork() {\r\n    return false;\r\n  }   \r\n\r\n  setCredentials(credentials) {\r\n    return false;\r\n  }\r\n\r\n  getCredentials() {\r\n    return {\"address\":this.web3_wallet.walletAddress};\r\n  }    \r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }  \r\n\r\n  setNetwork(details) {\r\n    return false;\r\n  }\r\n\r\n  getNetwork() {\r\n    return { \"name\": this.web3_wallet.network, \"mode\": this.web3_wallet.network == 'main' ? 'prod' : 'test', \"uri\": this.remuneration_uri[this.web3_wallet.network]};\r\n  }  \r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    return this.remuneration_uri[this.web3_wallet.network];      \r\n  }  \r\n\r\n  async getFromDollars(dollarAmount) {\r\n    const hostPrefix = this.web3_wallet.network === 'main' ? '' : 'test.';\r\n    const now = (new Date()).toISOString();\r\n    const result = await this.__fetch(`https://${hostPrefix}rates.overhide.io/rates/wei/${now}`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${this.getToken()}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n    if (!result || result.length === 0 || ! 'minrate' in result[0] || result[0].minrate === 0) return 0;\r\n    return dollarAmount / result[0].minrate;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.web3_wallet.network) throw new Error(\"network must be set in wallet\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    var from = this.web3_wallet.walletAddress;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }  \r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.web3_wallet.network) throw new Error(\"no network for imparter tag\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.web3_wallet.walletAddress) throw new Error(`imparter ${eth_web3.tag} not active`);\r\n    this.fire('onWalletPopup', {imparterTag: eth_web3.tag});\r\n    return (await window.web3.eth.personal.sign(message, this.web3_wallet.walletAddress, ''));\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.web3_wallet.network) throw new Error(\"no network for imparter tag\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    this.fire('onWalletPopup', {imparterTag: eth_web3.tag});\r\n    await (new Promise((resolve, reject) => {\r\n      window.web3.eth.sendTransaction({ from: from, to: to, value: amount })\r\n      .on('confirmation', function (confirmationNumber, receipt) {\r\n        resolve();\r\n      })\r\n      .on('error', (error) => {\r\n        reject(error);\r\n      }); \r\n    }));\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default eth_web3;","import ohledger_fns from '../fns/ohledger_fns.js';\r\nimport imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass ohledger_web3 {\r\n  static tag = 'ohledger-web3';\r\n\r\n  mode = 'test';\r\n\r\n  constructor(overhide_wallet, web3_wallet, getToken, __fetch, fire) {\r\n    this.web3_wallet = web3_wallet;\r\n    this.overhide_wallet = overhide_wallet;\r\n    this.__fetch = __fetch;\r\n    this.getToken = getToken;\r\n    this.fire = fire;\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return false;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }    \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n  \r\n  setCredentials(credentials) {\r\n    return false;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\": this.web3_wallet.walletAddress};\r\n  }  \r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    ohledger_fns.setNetwork_check_details(details);\r\n\r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: ohledger_web3.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode] });\r\n    return true;\r\n  }\r\n\r\n  getNetwork() {\r\n    return { \"currency\": \"USD\", \"mode\": this.mode, \"uri\": this.overhide_wallet.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.overhide_wallet.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    return dollarAmount * 100;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    var from = this.web3_wallet.walletAddress;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }  \r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.web3_wallet.walletAddress) throw new Error(`imparter ${ohledger_web3.tag} not active`);\r\n    this.fire('onWalletPopup', {imparterTag: ohledger_web3.tag});\r\n    return (await window.web3.eth.personal.sign(message, this.web3_wallet.walletAddress, ''));\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    await ohledger_fns.createTransaction(\r\n      amount, \r\n      from,\r\n      to,\r\n      (message) => this.sign(message),\r\n      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), \r\n      this.overhide_wallet.oh_ledger_transact_fn[this.mode], \r\n      options);\r\n\r\n    return true;\r\n  }    \r\n}\r\n\r\nexport default ohledger_web3;","class ohledger_fns {\r\n  static setNetwork_check_details(details) {\r\n    if (!('currency' in details)) throw new Error(\"'currency' must be passed in\");\r\n    if (!('mode' in details)) throw new Error(\"'mode' must be passed in\");\r\n    details.currency = details.currency.toUpperCase();\r\n    details.mode = details.mode.toLowerCase();\r\n    if (details.currency !== 'USD') throw new Error(\"'currency' must be 'USD'\");\r\n    if (details.mode !== 'prod' && details.mode !== 'test') throw new Error(\"'mode' must be 'prod' or 'test'\");    \r\n  }\r\n\r\n  static async createTransaction(amount, from, to, signFn, showGratisFn, ohLedgerTransactFn, options) {\r\n    if (amount == 0) {\r\n      if ('message' in options && options.message && 'signature' in options && options.signature) {\r\n        var message = options.message;\r\n        var signature = options.signature;\r\n      } else {\r\n        var message = `verify ownership of address by signing on ${new Date().toLocaleString()}`;\r\n        var signature = await signFn(message);\r\n      }\r\n      await showGratisFn(from, signature, message);\r\n    } else {\r\n      await ohLedgerTransactFn(amount, from, to);\r\n    }\r\n  }\r\n}\r\n\r\nexport default ohledger_fns;","import imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass btc_manual {\r\n  static tag = 'btc-manual';\r\n\r\n  remuneration_uri = {\r\n    'prod':'https://bitcoin.overhide.io',\r\n    'test':'https://test.bitcoin.overhide.io'\r\n  };\r\n\r\n  url = 'http://localhost:8080/src/frames';\r\n  address = null;\r\n  mode = 'test';\r\n\r\n  constructor(domFns, getToken, __fetch, fire) {\r\n    this.domFns = domFns;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n\r\n    window.document.addEventListener('oh$-popup-signature', (e) => {\r\n      if ('detail' in e && e.detail && 'signature' in e.detail) {\r\n        this.domFns.makePopupHidden(e.detail.signature, false);\r\n      }\r\n      this.domFns.makePopupHidden(`no signature`, true);      \r\n    });    \r\n  }\r\n\r\n  canSetCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }  \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n\r\n  setCredentials(credentials) {\r\n    if (!('address' in credentials)) throw new Error(\"'address' must be passed in\");\r\n    switch(this.mode) {\r\n      case 'bitcoin_testnet':\r\n        if (!/(tb(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[mn2][a-km-zA-HJ-NP-Z1-9]{25,39})/.test(credentials.address)) {\r\n          throw new Error(`invalid bitcoin_testnet address: ${credentials.address}`);\r\n        }\r\n        break;\r\n      case 'bitcoin':\r\n        if (!/(bc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[13][a-km-zA-HJ-NP-Z1-9]{25,35})/.test(credentials.address)) {\r\n          throw new Error(`invalid bitcoin address: ${credentials.address}`);\r\n        }\r\n        break;\r\n    }\r\n    this.address = credentials.address;\r\n    this.fire('onCredentialsUpdate', { imparterTag: btc_manual.tag, address: this.address});\r\n    return true;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\":this.address};\r\n  }\r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    if (!('mode' in details)) throw new Error(\"'mode' must be passed in\");\r\n    details.mode = details.mode.toLowerCase();\r\n    if (details.mode !== 'prod' && details.mode !== 'test') throw new Error(\"'mode' must be 'prod' or 'test'\");    \r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: btc_manual.tag, mode: details.mode, uri: this.remuneration_uri[details.mode]});\r\n    return true;\r\n  }  \r\n\r\n  getNetwork() {\r\n    return { \"mode\": this.mode, \"uri\": this.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    const hostPrefix = this.mode === 'main' ? '' : 'test.';\r\n    const now = (new Date()).toISOString();\r\n    const result = await this.__fetch(`https://${hostPrefix}rates.overhide.io/rates/sat/${now}`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${this.getToken()}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n    if (!result || result.length === 0 || ! 'minrate' in result[0] || result[0].minrate === 0) return 0;\r\n    return dollarAmount / result[0].minrate;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.address) throw new Error(`credentials for imparter ${btc_manual.tag} not set`);\r\n\r\n    this.domFns.hideAllPopupContents();\r\n    const base64Message = btoa(message);\r\n    this.domFns.setFrame(`${this.url}/btc_manual_sign.html?address=${this.address}&message=${base64Message}&token=${this.getToken()}&isTest=${this.mode == 'test'}`);\r\n    return atob(await this.domFns.makePopupVisible());\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    this.domFns.hideAllPopupContents();\r\n    this.domFns.setFrame(`${this.url}/btc_manual_createTransaction.html?from=${this.address}&to=${to}&value=${amount}&isTest=${this.mode == 'test'}`);\r\n    await this.domFns.makePopupVisible();\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default btc_manual;","import ohledger_fns from '../fns/ohledger_fns.js';\r\nimport imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass ohledger {\r\n  static tag = 'ohledger';\r\n\r\n  address = null;\r\n  secret = null;\r\n  mode = 'test';\r\n\r\n  constructor(overhide_wallet, web3_wallet, getToken, __fetch, fire) {\r\n    this.overhide_wallet = overhide_wallet;\r\n    this.eth_accounts = web3_wallet.eth_accounts;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n\r\n  setCredentials(credentials) {\r\n    if (!('secret' in credentials)) throw new Error(\"'secret' must be passed in\");\r\n    if ('address' in credentials && credentials.address) {\r\n      this.address = credentials.address.toLowerCase();\r\n    } else {\r\n      this.address = this.eth_accounts.privateKeyToAccount(credentials.secret).address.toLowerCase();\r\n    }\r\n    this.secret = credentials.secret;\r\n    try {\r\n      if (!(this.eth_accounts.recover(this.eth_accounts.sign('test message', this.secret)).toLowerCase() == this.address)) {\r\n        throw new Error(\"'secret' not valid for 'address\");\r\n      }\r\n    } catch (err) {\r\n      throw new Error(\"'secret' not valid for 'address\");\r\n    }        \r\n    this.fire('onCredentialsUpdate', { imparterTag: ohledger.tag, address: this.address, secret: this.secret});\r\n    return true;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\":this.address, \"secret\":this.secret};\r\n  }\r\n\r\n  generateCredentials(options) {\r\n    const res = this.eth_accounts.create();\r\n    this.address = res.address.toLowerCase();\r\n    this.secret = res.privateKey;\r\n    this.fire('onCredentialsUpdate', { imparterTag: ohledger.tag, address: this.address, secret: this.secret});\r\n    return true;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    ohledger_fns.setNetwork_check_details(details);\r\n\r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: ohledger.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode]});\r\n    return true;\r\n  }  \r\n\r\n  getNetwork() {\r\n    return { \"currency\": \"USD\", \"mode\": this.mode, \"uri\": this.overhide_wallet.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.overhide_wallet.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    return dollarAmount * 100;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.secret) throw new Error(`credentials for imparter ${ohledger.tag} not set`);\r\n    return this.eth_accounts.sign(message, this.secret).signature;\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    await ohledger_fns.createTransaction(\r\n      amount, \r\n      from,\r\n      to,\r\n      (message) => this.sign(message),\r\n      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), \r\n      this.overhide_wallet.oh_ledger_transact_fn[this.mode], \r\n      options);\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default ohledger;","module.exports = __WEBPACK_EXTERNAL_MODULE__6__;","// A modal to display iframes and forms on behalf of the library.\r\nclass dom_fns {\r\n  resolve = null;\r\n  reject = null;\r\n\r\n  constructor() {\r\n    window.document.addEventListener('oh$-popup-close', (e) => {\r\n      this.makePopupHidden('user close', true);\r\n    });    \r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.createPopup();\r\n  }\r\n\r\n  // raise oh$-event\r\n  // @param {string} imparterTag\r\n  // @param {string} triggerFor \r\n  // @param {Object} data - to stringify and sent as event.details.\r\n  raiseEventClick(imparterTag, triggerFor) {\r\n    window.parent.document.dispatchEvent(new CustomEvent('oh$-event', {detail: JSON.stringify({\r\n      imparterTag: imparterTag,\r\n      triggerFor: triggerFor,\r\n      click: true\r\n    })}));\r\n  }\r\n\r\n  // raise oh$-event\r\n  // @param {string} imparterTag\r\n  // @param {string} triggerFor \r\n  // @param {Object} data - to stringify and sent as event.details.\r\n  raiseEvent(imparterTag, triggerFor, data) {\r\n    window.parent.document.dispatchEvent(new CustomEvent('oh$-event', {detail: JSON.stringify({\r\n      ...data,\r\n      imparterTag: imparterTag,\r\n      triggerFor: triggerFor\r\n    })}));    \r\n  }\r\n\r\n  // promise used for popups and resolutions via oh-ledger-* messages.\r\n  setupNewPromise() {\r\n    console.assert(!this.resolve, 'oh-popup promise being set but already set when calling setupNewPromise(..)');\r\n    return new Promise((rs, rj) => {\r\n      this.resolve = rs;\r\n      this.reject = rj;\r\n    });    \r\n  }\r\n\r\n  // Setup the iframe source\r\n  setFrame(src, widthEm=80, heightEm=60) {\r\n    const frame = document.getElementById('oh-ledger-iframe');\r\n    frame.setAttribute('src', src);\r\n    frame.style.display='block';    \r\n    const container = document.getElementById('oh-popup-container-div');\r\n    container.style.width=`${widthEm}em`;\r\n    container.style.height=`${heightEm}em`;\r\n  }\r\n\r\n  // make popup visible to be hidden with makePopupHidden\r\n  makePopupVisible() {\r\n    var popup = document.getElementById('oh-popup-container');\r\n    popup.style.display='block';\r\n    return this.setupNewPromise();\r\n  }\r\n\r\n  makePopupHidden(params, isError) {\r\n    var popup = document.getElementById('oh-popup-container');\r\n    this.hideAllPopupContents();\r\n    popup.style.display='none';\r\n    console.assert(this.resolve, 'oh-popup promise not set yet calling makePopupHidden(..)');\r\n    if (isError) this.reject(params)\r\n    else this.resolve(params);\r\n    this.resolve = null;\r\n    this.reject = null;\r\n  }\r\n\r\n  hideAllPopupContents() {\r\n    document.getElementById('oh-ledger-iframe').style.display='none';\r\n  }\r\n\r\n  createPopup() {\r\n    var popup = document.createElement('div');\r\n    popup.setAttribute('id','oh-popup-container');\r\n    popup.style.display='none';\r\n    popup.innerHTML = `\r\n      <div id=\"oh-popup-container-div\">\r\n        <a href=\"#\" title=\"Close\" id=\"oh-popup-close\" onclick=\"window.parent.document.dispatchEvent(new CustomEvent('oh$-popup-close',{})); return false;\">X</a>\r\n        <iframe id=\"oh-ledger-iframe\"></iframe>\r\n      </div>\r\n    `;\r\n    var style = document.createElement('style');\r\n    style.innerHTML =`\r\n      #oh-popup-container {\r\n          position: fixed;\r\n          font-family: arial, \"lucida console\", sans-serif;\r\n          top: 0;\r\n          right: 0;\r\n          bottom: 0;\r\n          left: 0;\r\n          background: rgba(0, 0, 0, 0.8);\r\n          z-index: 999;\r\n          opacity:1;\r\n          pointer-events: auto;\r\n      }\r\n      #oh-popup-container-div {\r\n          max-width: 80vw;\r\n          max-height: 75vh;\r\n          position: relative;\r\n          top: 15vh;\r\n          margin: auto auto;\r\n          padding: 5px 5px 5px 5px;\r\n          background: white;\r\n      }\r\n      #oh-popup-close {\r\n          background: grey;\r\n          color: white;\r\n          line-height: 25px;\r\n          position: absolute;\r\n          right: 2px;\r\n          text-align: center;\r\n          top: 2px;\r\n          width: 24px;\r\n          text-decoration: none;\r\n          font-weight: bold;\r\n      }\r\n      #oh-popup-close:hover {\r\n          background: black;\r\n      }\r\n\r\n      #oh-ledger-iframe {\r\n        display: none;\r\n        border: 0;\r\n        overflow: hidden;\r\n        width: 100%;\r\n        height: 100%;\r\n      }\r\n    `;\r\n    var attach = () => {\r\n      if (document.body) {\r\n        document.body.appendChild(popup);\r\n        document.body.appendChild(style);\r\n      } else {\r\n        setTimeout(attach, 100);\r\n      };\r\n    };\r\n    attach();\r\n  }  \r\n}\r\n\r\nexport default dom_fns;","import Web3 from 'web3';\r\nimport eth_web3 from '../imparters/eth-web3.js';\r\nimport ohledger_web3 from '../imparters/ohledger-web3.js';\r\n\r\nconst WALLET_CHECK_INTERVAL_MS = 500;\r\n\r\nclass web3_wallet {\r\n  eth_accounts = (new Web3('http://localhost:8545')).eth.accounts;\r\n  walletAddress = null;\r\n  network = null;\r\n\r\n  networkChangeDelegates = [];\r\n\r\n  constructor(addTag, removeTag, fire) {\r\n    this.addTag = addTag;\r\n    this.removeTag = removeTag;\r\n    this.fire = fire;\r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.detectWeb3Wallet();\r\n  }\r\n\r\n  /**\r\n   * Setup window.web3 to be the wallet's if available or offline if not (just for signing).\r\n   * \r\n   * Sets up a timer to check for wallet being logged in and address changes.\r\n   * \r\n   * @ignore\r\n   */\r\n  detectWeb3Wallet() {    \r\n    if (!window.ethereum) return;\r\n \r\n    // Modern dapp browsers...\r\n    (async () => {\r\n      try {\r\n        await window.ethereum.enable();\r\n        window.web3 = new Web3(window.ethereum);\r\n      } catch (e) {/*noop*/ }\r\n\r\n      await detectWalletCb();\r\n\r\n      setInterval(async function () {\r\n        await detectWalletCb();\r\n      }, WALLET_CHECK_INTERVAL_MS);\r\n    })();\r\n\r\n    var detectWalletCb = async () => {\r\n      try {\r\n        var currentAccounts = await window.web3.eth.getAccounts();\r\n        var currentAddress = (currentAccounts && currentAccounts.length > 0) ? currentAccounts[0] : null;\r\n        var currentNetwork = (await window.web3.eth.net.getNetworkType());\r\n      } catch (e) {/*noop*/}\r\n      if (currentNetwork !== this.network) {\r\n        this.network = currentNetwork;\r\n        this.networkChangeDelegates.forEach(d => d(this.network));        \r\n      }\r\n      if (currentAddress !== this.walletAddress) {\r\n        if (currentAddress) { /* add imparters */\r\n          this.addTag(eth_web3.tag);\r\n          this.addTag(ohledger_web3.tag);\r\n        } else { /* remove imparters */\r\n          this.removeTag(eth_web3.tag);\r\n          this.removeTag(ohledger_web3.tag);\r\n        } \r\n        this.walletAddress = currentAddress;\r\n        this.fire('onWalletChange', { imparterTag: eth_web3.tag, isPresent: !!currentAddress });\r\n        this.fire('onWalletChange', { imparterTag: ohledger_web3.tag, isPresent: !!currentAddress });\r\n        if (currentAddress) {\r\n          this.fire('onCredentialsUpdate', { imparterTag: eth_web3.tag, address: currentAddress });\r\n          this.fire('onCredentialsUpdate', { imparterTag: ohledger_web3.tag, address: currentAddress });\r\n        }\r\n      }\r\n    }\r\n  } \r\n}\r\n\r\nexport default web3_wallet;","class overhide_wallet {\r\n  oh_ledger_transact_fn = {\r\n    'prod': null,\r\n    'test': null\r\n  };\r\n\r\n  remuneration_uri = {\r\n    'prod': 'https://ledger.overhide.io/v1',\r\n    'test': 'https://test.ledger.overhide.io/v1'\r\n  }\r\n\r\n  constructor(domFns) {\r\n    this.domFns = domFns;\r\n\r\n    window.addEventListener('message', (e) => {\r\n      if (e.data && e.data.event === 'oh-ledger-ok') {\r\n        this.domFns.makePopupHidden(e.data.detail);\r\n      } else if (e.data && e.data.event === 'oh-ledger-error') {\r\n        this.domFns.makePopupHidden(e.data.detail, true);\r\n      }\r\n    }, false);\r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.attach();\r\n  }\r\n  \r\n  attach = () => {\r\n    if (document.body) {\r\n      this.loadOhLedgerTransactFns();\r\n    } else {\r\n      setTimeout(this.attach, 100);\r\n    };\r\n  };\r\n\r\n  async showOhLedgerGratisIframeUri(uri, from, signature, message) {\r\n    this.domFns.hideAllPopupContents();\r\n    this.domFns.setFrame(`${uri}/gratis.html?address=${from}&signature=${signature}&message=${message}`);\r\n    await this.domFns.makePopupVisible();\r\n  }\r\n\r\n  // https://stackoverflow.com/a/31374433\r\n  loadJS(url, implementationCode, location) {\r\n    //url is URL of external file, implementationCode is the code\r\n    //to be called from the file, location is the location to \r\n    //insert the <script> element\r\n\r\n    var scriptTag = document.createElement('script');\r\n    scriptTag.src = url;\r\n\r\n    scriptTag.onload = implementationCode;\r\n    scriptTag.onreadystatechange = implementationCode;\r\n\r\n    location.appendChild(scriptTag);\r\n  };\r\n\r\n  loadOhLedgerTransactFns() {\r\n    // load prod ohledger transact fn\r\n    this.loadJS(`${this.remuneration_uri.prod}/transact.js`, () => {\r\n      const fn = oh_ledger_transact;\r\n      this.oh_ledger_transact_fn.prod = (...args) => { fn(...args); return this.domFns.setupNewPromise(); }\r\n    }, document.body);\r\n\r\n    // load test ohledger transact fn\r\n    this.loadJS(`${this.remuneration_uri.test}/transact.js`, () => {\r\n      const fn = oh_ledger_transact;\r\n      this.oh_ledger_transact_fn.test = (...args) => { fn(...args); return this.domFns.setupNewPromise(); }\r\n    }, document.body);\r\n  }\r\n}\r\n\r\nexport default overhide_wallet;","import dom_fns from './fns/dom_fns';\r\nimport eth_web3 from './imparters/eth-web3.js';\r\nimport btc_manual from './imparters/btc-manual.js';\r\nimport ohledger_web3 from './imparters/ohledger-web3.js';\r\nimport ohledger from './imparters/ohledger.js';\r\nimport web3_wallet from './wallets/web3_wallet.js';\r\nimport overhide_wallet from './wallets/overhide_wallet.js';\r\n\r\n//     ledgers.js \r\n//     https://ledger.overhide.io\r\n//     (c) 2021 Overhide LLC, Wyoming, USA\r\n//     ledgers.js may be freely distributed under the MIT license.\r\n\r\n/**\r\n * @namespace oh$\r\n * @description \r\n * \r\n * ### REFERENCES\r\n * \r\n * Library code: https://github.com/overhide/ledgers.js/blob/master/dist/ledgers.js.\r\n *\r\n * Repository for this library is https://github.com/overhide/ledgers.js.\r\n * \r\n * The above repository contains a demo app of this library working in conjunction with:\r\n * \r\n * - the *overhide* Ethereum remuneration provider (Rinkeby testnet -- https://rinkeby.ethereum.overhide.io) \r\n * - the *overhide-ledger* (test environment -- https://test.ledger.overhide.io)\r\n * - the *overhide* Bitcoin remuneration provider (testnet -- https://test.bitcoin.overhide.io) \r\n * \r\n * ### ABOUT\r\n * \r\n * JavaScript library to be used in-browser and interrogate *overhide* remuneration providers as to validity\r\n * of ledger credentials and transactions involving these credentials.\r\n * \r\n * The goal of the library and the *overhide* remuneration providers is to ease using of all types of ledgers for\r\n * authentication (I am who I say) and authorization (paid access tiers).\r\n * \r\n * The library leverages injected currency wallets where it can, and exposes functions to work with *loose* currencies \r\n * (without wallets) where it cannot.\r\n * \r\n * The library exports the `oh$` object for use as a module when bundling.\r\n * \r\n * > ---\r\n * > ```\r\n * > import oh$ from \"ledgers.js\";\r\n * > oh$.enable(token);\r\n * > oh$.addEventListener('onWalletChange', (e) => {...});\r\n * > ```\r\n * > ---\r\n * \r\n * > APIs abstracted by *ledgers.js* require a bearer-token.  The `token` (above) is passed in to `enable` the rest of the library's\r\n * > functionality.  `oh$.enable(..)` can be called every so often with a refreshed token.\r\n * >\r\n * >  A token can be retrieved with a `GET /token` call (see https://token.overhide.io/swagger.html).\r\n * >\r\n * > To retrieve tokens please first register for your own API key at https://token.overhide.io/register.\r\n * \r\n * The library can be loaded straight into your HTML (along with pre-requisite `web3.min.js`) and accessed by its `oh$` property from the browser's `window` object:\r\n * \r\n * > ---\r\n * > ```\r\n * > <script \r\n * >    src=\"https://cdnjs.cloudflare.com/ajax/libs/web3/1.3.4/web3.min.js\" \r\n * >    integrity=\"sha512-TTGImODeszogiro9DUvleC9NJVnxO6M0+69nbM3YE9SYcVe4wZp2XYpELtcikuFZO9vjXNPyeoHAhS5DHzX1ZQ==\" \r\n * >    crossorigin=\"anonymous\"></script>\r\n * > <script src=\"./dist/ledgers.js\"></script>\r\n * > <script>\r\n * >   oh$.enable(token);\r\n * >   oh$.addEventListener('onWalletChange', (e) => {...});\r\n * > </script>\r\n * > ```\r\n * > ---\r\n * \r\n * ### IMPARTERS\r\n * \r\n * The library works with a concept of *imprater* tags.  Wallets impart credentials, signatures, and transactions.  For\r\n * *loose change*--where no wallet exists--the library can be interrogated as to which entities should be set by the \r\n * user (can* functions); causing the entities to be imparted back to the user in a common code flow.  \r\n * \r\n * The imparter tags are a simple naming convention.  For example if multiple Ethereum wallet APIs were imparting data \r\n * they  would be individually tagged with a prefix \"eth\" and a dashed suffix.  No suffix indicates a *loose change*\r\n * imparter:\r\n * \r\n * - eth-web3\r\n * - eth-?\r\n * \r\n * Similarly for *overhide-ledger*, the prefix is \"ohledger\", the suffix won't be attached on the *loose change* version \r\n * and will be suffixed on the *web3* walleted version:\r\n * \r\n * - ohledger\r\n * - ohledger-web3\r\n * \r\n * Thus far Bitcoin is only supported in manual mode (no Bitcoin wallet injection into target site):\r\n * \r\n * - btc-manual\r\n * \r\n * The following sections cover special notes on each imparter.  The library adheres to these notes.\r\n * \r\n * #### eth-web3\r\n * \r\n * > Ethereum addresses are 20 bytes: 42 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Ethereum secret keys for signing addresses are 32 bytes: 66 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Ethereum networks names/modes are:\r\n * >\r\n * >> | name | mode | notes |\r\n * >> | --- | --- | --- |\r\n * >> | main | prod | |\r\n * >> | rinkeyby | test | |\r\n * >> | kovan | test | not supported |\r\n * >> | ropsten | test | not supported |\r\n * >> | goerli | test | not supported |\r\n * >\r\n * > The denomination for amounts is the Wei\r\n * \r\n * #### ohledger, ohledger-web3\r\n * \r\n * > Addresses and secret keys use Ethereum format.\r\n * >\r\n * > Addresses are 20 bytes: 42 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Secret keys for signing addresses are 32 bytes: 66 character 'hex' strings prefixed with '0x'.\r\n * >\r\n * > Network tuples consist of a 'currency' as a three letter ISO fiat currency code and a 'mode'.  The supported\r\n * > 'currency' names are:\r\n * > \r\n * > * 'USD'\r\n * > \r\n * > The denominations are:\r\n * > \r\n * >> | Currency | denomination |\r\n * >> | --- | --- |\r\n * >> | USD | cents |\r\n * > \r\n * > Note: at this point only USD are supported.  If there is a need, and *overhide-ledger* instances in currencies\r\n * > other than USD come online, we'll revisit this.\r\n * >\r\n * > An 'ohledger' mode is one of 'prod' or 'test'\r\n * \r\n * #### btc-manual\r\n * \r\n * > Addresses use Bitcoin format.\r\n * > \r\n * > Bitcoin network modes are:\r\n * > \r\n * > * prod -- for mainnet\r\n * > * test -- for testnet\r\n * > \r\n * > The denomination for amounts is the Satoshi.\r\n * \r\n */\r\nconst oh$ = (function() {\r\n\r\n  var root = typeof self == 'object' && self.self === self && self ||\r\n    typeof global == 'object' && global.global === global && global ||\r\n    this ||\r\n    {};\r\n\r\n  root.oh$ = new class extends EventTarget {\r\n    /**\r\n     * @event onWalletChange\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | * | `{imparterTag:..,isPresent:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *isPresent* - if wallet is present for imparter\r\n     *\r\n     * @description\r\n     *   Event called when wallets' state changes.\r\n     * \r\n     *   In user code:\r\n     * \r\n     *   ```\r\n     *   oh$.addEventListener('onWalletChange', (e) => console.log(`wallet for ${e.imparterTag} is available:${e.isPresent}`));\r\n     *   ```\r\n     */\r\n\r\n    /**\r\n     * @event onWalletPopup\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | * | `{imparterTag:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the pop-up\r\n     *\r\n     * @description\r\n     *   Event called when wallet is expected to popup.  Useful in case user wants to react to popup in UI.\r\n     * \r\n     *   In user code:\r\n     * \r\n     *   ```\r\n     *   oh$.addEventListener('onWalletPopup', (e) => console.log(`wallet for ${e.imparterTag} popped`));\r\n     *   ```\r\n     */\r\n\r\n    /**\r\n     * @event onCredentialsUpdate\r\n     * @description\r\n     *   Event called when an credentials change for one of the tracked imparters.\r\n     * \r\n     *   Only called when credentials are valid as per imparter: ready to be used for signing, transacting.\r\n     *\r\n     *   In user code:\r\n     *\r\n     *   ```\r\n     *   oh$.addEventListener('onCredentialsUpdate', (e) => {\r\n     *     console.log(`new address for ${e.imparterTag} is:${e.address}`);\r\n     *     return;\r\n     *   });\r\n     *   ```\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     * \r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{imparterTag:..,address:..}` |\r\n     *  > | ohledger | `{imparterTag:..,address:..,secret:..}` |\r\n     *  > | ohledger-web3 | `{imparterTag:..,address:..}` |\r\n     *  > | btc-manual | `{imparterTag:..,address:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *address* - ledger public address of credential set for imparter\r\n     *  >\r\n     *  > *secret* - ledger PKI private secret for credential set for imparter\r\n     *\r\n     */\r\n\r\n    /**\r\n     * @event onNetworkChange\r\n     * @description\r\n     *   Event called when the network changes for a particular imparter tag.\r\n     * \r\n     *   For example for \"eth\" the network could changed from \"main\" to \"rinkeby\".  \r\n     * \r\n     *   In user code:\r\n     *\r\n     *   ```\r\n     *   oh$.addEventListener('onNetworkChange', (e) => {\r\n     *     if (e.imparterTag === 'eth-web3') console.log(`new network selected for ${e.imparterTag} is:${e.name}`);\r\n     *     if (e.imparterTag === /ohledger/.test(e.imparterTag)) console.log(`working in currency: ${e.currency}`);\r\n     *     if (e.imparterTag === 'btc-manual') console.log(`new network mode selected for ${e.imparterTag} is:${e.name}`);\r\n     *     return;\r\n     *   });\r\n     *   ```\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new credentials object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{imparterTag:..,name:('main'|'rinkeby'|'kovan')..,mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger | `{imparterTag:..,currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger-web3 | `{imparterTag:..,currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | btc-manual | `{imparterTag:..,mode:('prod'|'test'), uri:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *name* - of network\r\n     *  >\r\n     *  > *currency* - represented by network\r\n     *  >\r\n     *  > *mode* - production or test network\r\n     *  >\r\n     *  > *uri* - remuneration API URI for network\r\n     *\r\n     */\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function enable\r\n     * @description\r\n     *   Enable `oh$` by instrumenting with token for ledger access.\r\n     * \r\n     *   `oh$` calls may stall while waiting for this call to complete successfully.\r\n     * \r\n     *   A token can be retrieved with a `GET /token` call (see https://token.overhide.io/swagger.html).\r\n     * \r\n     *   To retrieve tokens please first register for your own API key at https://token.overhide.io/register.\r\n     * @param {string} token\r\n     */\r\n    enable = enable;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getImparterTags\r\n     * @description\r\n     *   Retrieves all imparter tags injected by wallets and statically available from the library.\r\n     * @returns {Array} of strings: the imparter tags available\r\n     */\r\n    getImparterTags = getImparterTags;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canSetCredentials\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have credentials set by the user: or does the wallet control it\r\n     *   exclusively.\r\n     * \r\n     *   Only the following imparter(s) will return 'true':\r\n     * \r\n     *   - ohledger\r\n     *   - btc-manual\r\n     * \r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have credentials set.\r\n     */\r\n    canSetCredentials = canSetCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canGenerateCredentials\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have credentials generated by the user: or does the wallet control it\r\n     *   exclusively.\r\n     *\r\n     *   Only the following imparter(s) will return 'true':\r\n     *\r\n     *   - ohledger\r\n     *\r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have credentials generated.\r\n     */\r\n    canGenerateCredentials = canGenerateCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canChangeNetwork\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have network changed by the user via oh$: or does the wallet control it\r\n     *   exclusively.\r\n     *\r\n     *   Only the following imparter(s) will return 'true':\r\n     *\r\n     *   - ohledger\r\n     *   - ohledger-web3\r\n     *   - btc-manual\r\n     *\r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have networks changed via oh$.\r\n     */\r\n    canChangeNetwork = canChangeNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function generateCredentials\r\n     * @description\r\n     *   For imparters that can have credentials generated, generates them.  \r\n     * \r\n     *   Fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n     * @param {string} imparterTag\r\n     * @param {Object} options - imparter specific generation options, if any.\r\n     * \r\n     *  > The options objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | credentials object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not supported |\r\n     *  > | ohledger | null | |\r\n     *  > | ohledger-web3 | N/A | not supported |\r\n     *  > | btc-manual | N/A | not supported |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n\r\n     */\r\n    generateCredentials = generateCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function setCredentials\r\n     * @description\r\n     *   For imparters that can have credentials set, sets them.  \r\n     * \r\n     *   Fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {Object} credentials - credentials object of imparter specific parameters to set\r\n     * \r\n     *  > The credentials objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | credentials object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not suppoted |\r\n     *  > | ohledger | `{address:..,secret:..}` | `address` is optional, if not set will be extracted from `secret` |\r\n     *  > | ohledger-web3 | N/A | not supported |\r\n     *  > | btc-manual | `{address:..}` | |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n     */\r\n    setCredentials = setCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function setNetwork\r\n     * @description\r\n     *   For imparters that can have networks changed via oh$, changes it.  \r\n     * \r\n     *   Fires [onNetworkChange](#eventonnetworkchange) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {Object} details - network details object of imparter specific parameters to set.\r\n     * \r\n     *  > The network details objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | network details object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not supported, change in wallet |\r\n     *  > | ohledger | `{currency:'USD', mode:'prod'|'test'}` | |\r\n     *  > | ohledger-web3 | `{currency:'USD', mode:'prod'|'test'}` | |\r\n     *  > | btc-manual | `{mode:'prod'|'test'}` | |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onNetworkChange](#eventonnetworkchange) event against `oh$`\r\n     */\r\n    setNetwork = setNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getOverhideRemunerationAPIUri\r\n     * @description\r\n     *   Based on current network set returns the *overhide* remuneration API URI configured in the library.\r\n     * @param {string} imparterTag\r\n     * @returns {string} the URI.\r\n     */\r\n    getOverhideRemunerationAPIUri = getOverhideRemunerationAPIUri;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getCredentials\r\n     * @description\r\n     *   Retrieves current credentials for an imparterTag.\r\n     * @param {string} imparterTag\r\n     * @returns {Object} details - an object describing current credentials, imparterTag dependant:\r\n     * \r\n     *  > | imparter tag | credentials object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..,secret:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     */\r\n    getCredentials = getCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getNetwork\r\n     * @description\r\n     *   Retrieves current network for an imparterTag.\r\n     * @param {string} imparterTag\r\n     * @returns {Object} details - an object describing current network, imparterTag dependant:\r\n     * \r\n     *  > | imparter tag | network details object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{name:('main'|'rinkeby'|'kovan').., mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger | `{currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger-web3 | `{currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | btc-manual | `{mode:('prod'|'test'), uri:..}` |\r\n     */\r\n    getNetwork = getNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getFromDollars\r\n     * @description\r\n     *   Retrieve a (highest) converted amount in imparter specific denomination from a provided dollar amount at a very recent exchange rate.\r\n     * @param {string} imparterTag\r\n     * @param {number} dollarAmount - the dollar amount.\r\n     * @returns {Promise} with the value in imparter specific currency at the present time (based on recent exchange rate).\r\n     */\r\n     getFromDollars = getFromDollars;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTallyDollars\r\n     * @description\r\n     *   Retrieve a tally of all transactions on the imparter's ledger--perhaps within a date range--converted to a US dollar amount.\r\n     * @param {string} imparterTag\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @returns {Promise} with the `{'tally':.., 'as-of':..}` object, whereby the 'tally' value is in US dollars: all transactions \r\n     *   are exchanged to USD at an approximate (highest) exchange rate close to the transactions' time.  The 'as-of' timestamp \r\n     *   is that of the call (pass this to back-end to retrieve cached values at better API call rates).\r\n     */\r\n     getTallyDollars = getTallyDollars;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTally\r\n     * @description\r\n     *   Retrieve a tally of all transactions on the imparter's ledger--perhaps within a date range.\r\n     * @param {string} imparterTag\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @returns {Promise} with the `{'tally':.., 'as-of':..}` object, whereby the tally value is in imparter specific currency.\r\n     *   The 'as-of' timestamp is that of the call (pass this to back-end to retrieve cached values at better API call rates).\r\n     */\r\n    getTally = getTally;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTransactions\r\n     * @description\r\n     *   Retrieve transactions on the imparter's ledger, perhaps within a date range, from credentials set against \r\n     *   imparter to a recipient\r\n     * @param {string} imparterTag\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @returns {Promise} with the `{'transactions': [{\"transaction-value\":..,\"transaction-date\":..},..], 'as-of':..}` object, \r\n     *   whereby 'transactions' is the list of transactions and 'as-of' is the timestamp of the call.\r\n     */\r\n    getTransactions = getTransactions;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function isOnLedger\r\n     * @description\r\n     *   Determine if current credentials have some transaction on the imparter's ledger: transaction can be to anyone.\r\n     * \r\n     *   Intent is to validate beyond just a valid address.  To validate the address has been used.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @returns {Promise} with 'true' or 'false'; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    isOnLedger = isOnLedger;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function sign\r\n     * @description\r\n     *   Sign using the provided message using the credentials set against the specific imparter.\r\n     * \r\n     *   Note: wallet might pop up a dialog upon this call, consider that in your UX flow.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {string} message - to sign\r\n     * @returns {Promise} with the signature; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    sign = sign;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function createTransaction\r\n     * @description\r\n     *   Create a transaction on the imparter's ledger.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`; wallet might pop up a dialog upon this call, consider that in your UX flow.\r\n     * @param {string} imparterTag\r\n     * @param {number} amount\r\n     * @param {string} to - address of recipient\r\n     * \r\n     *  > $0 (*amount*) transactions against *ohledger* or *ohledger-web* *imparters* use the current credential \r\n     *  > as the *to* address, not the specified *to* address.\r\n     *  \r\n     * @param {Object} options - other options required for the specific imparter.\r\n     * \r\n     *  > The options objects are as follows:\r\n     *  > \r\n     *  > | imparter tag | credentials object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | null |\r\n     *  > | ohledger | {message:.., signature:..} |\r\n     *  > | ohledger-web3 | {message:.., signature:..} |\r\n     *  > | btc-manual | null |\r\n     *  > \r\n     *  > If *message* and *signature* are provided they are used instead of oh$ asking for wallet to resign message.\r\n     *\r\n     * @returns {Promise} of a 'true' for success or an Error; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    createTransaction = createTransaction;\r\n  }();\r\n\r\n  var doEnable = null;\r\n  const isEnabled = new Promise((resolve) => doEnable = resolve);\r\n  var token = null;\r\n  var __fetch = null;\r\n  var imparterTags = [ohledger.tag, btc_manual.tag];\r\n\r\n  /**\r\n   * Function to fire events.\r\n   * \r\n   * @param {string} which - event name to fire\r\n   * @param {Object} params - to copy to event\r\n   */\r\n  function fire(which, params) {\r\n    let event = document.createEvent(\"Event\");\r\n    event.initEvent(which, true, true);\r\n    for (var param in params) {\r\n      event[param] = params[param];\r\n    }\r\n    oh$.dispatchEvent(event);\r\n  }\r\n\r\n  /**\r\n   * @param {string} tag -- to add to `imparterTags` if not in `imparterTags`\r\n   */\r\n  function addTag(tag) {\r\n    let imparterTagIndex = imparterTags.findIndex(v => v === tag);\r\n    if (imparterTagIndex == -1) imparterTags.push(tag);\r\n  }\r\n\r\n  /**\r\n   * @param {string} tag -- to remove from `imparterTags` if in `imparterTags`\r\n   */\r\n   function removeTag(tag) {\r\n    let imparterTagIndex = imparterTags.findIndex(v => v === tag);\r\n    if (imparterTagIndex > -1) imparterTags.splice(imparterTagIndex, 1);\r\n  }\r\n\r\n  const domFns = new dom_fns();\r\n  const web3Wallet = new web3_wallet(\r\n      (tag) => addTag(tag), \r\n      (tag) => removeTag(tag),\r\n      (which, params) => fire(which, params));\r\n  const overhideWallet = new overhide_wallet(domFns);\r\n\r\n  const imparters = {};\r\n  imparters[eth_web3.tag] = new eth_web3(\r\n    web3Wallet, \r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params));\r\n  imparters[btc_manual.tag] = new btc_manual(\r\n    domFns,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params));\r\n  imparters[ohledger_web3.tag] = new ohledger_web3(\r\n    overhideWallet,\r\n    web3Wallet,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params)\r\n  );\r\n  imparters[ohledger.tag] = new ohledger(\r\n    overhideWallet,\r\n    web3Wallet,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params)\r\n  );\r\n\r\n  domFns.init();\r\n  web3Wallet.init();\r\n  overhideWallet.init();\r\n\r\n  function enable(_token, {fetcher} = {fetcher: fetch}) {\r\n    token = _token;\r\n    __fetch = fetcher;\r\n    doEnable(true);\r\n  }\r\n\r\n  function getImparterTags() {\r\n    return imparterTags;\r\n  }\r\n\r\n  function canSetCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canSetCredentials();\r\n  }\r\n\r\n  function canGenerateCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canGenerateCredentials();\r\n  }\r\n\r\n  function canChangeNetwork(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canChangeNetwork();\r\n  }\r\n\r\n  async function setCredentials(imparterTag, credentials) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].setCredentials(credentials);\r\n  }\r\n\r\n  function getCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getCredentials();\r\n  }\r\n\r\n  async function generateCredentials(imparterTag, options) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].generateCredentials(options);\r\n  }\r\n\r\n  async function setNetwork(imparterTag, details) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].setNetwork(details);\r\n  }\r\n\r\n  function getNetwork(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getNetwork();    \r\n  }\r\n\r\n  function getOverhideRemunerationAPIUri(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getOverhideRemunerationAPIUri();    \r\n  }\r\n\r\n  async function getFromDollars(imparterTag, dollarAmount) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].getFromDollars(dollarAmount);\r\n  }\r\n\r\n  async function getTallyDollars(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, true, true));\r\n  }\r\n\r\n  async function getTally(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, true, false));\r\n  }\r\n\r\n  async function getTransactions(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, false, false));\r\n  }\r\n\r\n  async function getTxs(imparterTag, recipient, date, tallyOnly, tallyDollars) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].getTxs(recipient, date, tallyOnly, tallyDollars);\r\n  }\r\n\r\n  async function isOnLedger(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].isOnLedger();\r\n  }\r\n\r\n  async function sign(imparterTag, message) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].sign(message);\r\n  }\r\n\r\n  async function createTransaction(imparterTag, amount, to, options) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].createTransaction(amount, to, options);\r\n  }\r\n\r\n  return root.oh$;\r\n})();\r\n\r\nexport default oh$;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://__oh$__/webpack/universalModuleDefinition","webpack://__oh$__/webpack/bootstrap","webpack://__oh$__/./src/fns/imparter_fns.js","webpack://__oh$__/./src/fns/ohledger_fns.js","webpack://__oh$__/./src/imparters/eth-web3.js","webpack://__oh$__/./src/imparters/ohledger-web3.js","webpack://__oh$__/./src/imparters/btc-manual.js","webpack://__oh$__/./src/imparters/ohledger.js","webpack://__oh$__/./src/imparters/ohledger-social.js","webpack://__oh$__/external {\"commonjs\":\"web3\",\"commonjs2\":\"web3\",\"amd\":\"web3\",\"root\":\"Web3\"}","webpack://__oh$__/./src/fns/dom_fns.js","webpack://__oh$__/./src/wallets/web3_wallet.js","webpack://__oh$__/./src/wallets/overhide_wallet.js","webpack://__oh$__/./src/ledgers.js","webpack://__oh$__/(webpack)/buildin/global.js"],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__7__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","imparter_fns","recipient","date","Date","Error","address","_callee","uri","from","to","tallyOnly","tallyDollars","token","__fetch","since","dollarsQuery","regeneratorRuntime","wrap","_context","prev","next","concat","toISOString","headers","Headers","Authorization","then","res","json","e","String","abrupt","sent","stop","_callee2","signature","message","_context2","method","Content-Type","body","JSON","stringify","btoa","result","status","ohledger_fns","details","currency","toUpperCase","toLowerCase","amount","signFn","showGratisFn","ohLedgerTransactFn","options","toLocaleString","eth_web3","web3_wallet","getToken","fire","_this","this","_classCallCheck","_defineProperty","main","rinkeby","eth_accounts","networkChangeDelegates","push","network","onNetworkChange","imparterTag","tag","remuneration_uri","credentials","walletAddress","dollarAmount","hostPrefix","now","length","minrate","getTxs_check_details","getOverhideRemunerationAPIUri","getTxs_retrieve","_callee3","_context3","sign","isSignatureValid_call","_callee4","_context4","web3","eth","personal","_callee5","_context5","Promise","resolve","reject","sendTransaction","on","confirmationNumber","receipt","error","ohledger_web3","overhide_wallet","setNetwork_check_details","createTransaction","showOhLedgerGratisIframeUri","oh_ledger_transact_fn","btc_manual","domFns","prod","test","addEventListener","data","event","detail","makePopupHidden","base64Message","hideAllPopupContents","setFrame","url","t0","atob","makePopupVisible","t1","ohledger","privateKeyToAccount","secret","recover","err","privateKey","ohledger_social","social","provider","_callee6","karnet","popupPromise","_this2","_context6","open","height","width","_ref","_asyncToGenerator","mark","resultValue","text","_x8","apply","arguments","_callee7","_this3","_context7","dom_fns","createPopup","triggerFor","parent","postMessage","click","_objectSpread","console","assert","rs","rj","src","widthEm","undefined","heightEm","frame","document","getElementById","setAttribute","style","display","container","setupNewPromise","params","isError","popup","createElement","innerHTML","attach","appendChild","setTimeout","addTag","removeTag","Web3","accounts","detectWeb3Wallet","ethereum","enable","detectWalletCb","setInterval","_ref3","currentAccounts","currentAddress","currentNetwork","getAccounts","net","getNetworkType","forEach","isPresent","loadOhLedgerTransactFns","implementationCode","location","scriptTag","onload","onreadystatechange","loadJS","fn","oh_ledger_transact","oh$","self","_typeof","global","_EventTarget","_inherits","_class2","_wrapNativeSuper","EventTarget","_super","_createSuper","_len","args","Array","_key","_assertThisInitialized","getImparterTags","canSetCredentials","canGenerateCredentials","canChangeNetwork","generateCredentials","setCredentials","setNetwork","getCredentials","getNetwork","getFromDollars","getTallyDollars","getTally","getTransactions","isOnLedger","doEnable","isEnabled","imparterTags","which","createEvent","param","initEvent","dispatchEvent","web3Wallet","findIndex","v","imparterTagIndex","splice","overhideWallet","imparters","_token","fetcher","fetch","_x","_x2","_setCredentials","_x3","_x4","_generateCredentials","_x5","_x6","_setNetwork","_x7","_getFromDollars","_x9","_x10","_x11","_getTallyDollars","getTxs","_x12","_x13","_x14","_getTally","_x15","_x16","_x17","_getTransactions","_x18","_x19","_x20","_x21","_x22","_getTxs","_callee8","_context8","_x23","_isOnLedger","_callee9","_context9","_x24","_x25","_sign","_callee10","_context10","_x26","_x27","_x28","_x29","_createTransaction","_callee11","_context11","init","g","Function"],"mappings":"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","file":"ledgers.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"web3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"__oh$__\", [\"web3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"__oh$__\"] = factory(require(\"web3\"));\n\telse\n\t\troot[\"__oh$__\"] = factory(root[\"Web3\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__7__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","class imparter_fns {\r\n  static getTxs_check_details(recipient, date) {\r\n    if (date && !(date instanceof Date)) throw new Error(\"'date' must be a Date is passed in\");\r\n    if (!('address' in recipient) || !recipient.address) throw new Error(\"'address' required in recipient\");  }\r\n\r\n  static async getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, token, __fetch) {\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    let since = '';\r\n    if (date) {\r\n      since = `&since=${date.toISOString()}`;\r\n    }\r\n    let dollarsQuery = '';\r\n    if (tallyDollars) {\r\n      dollarsQuery = `&tally-dollars=true`\r\n    }\r\n    return await __fetch(`${uri}/get-transactions/${from}/${to}?tally-only=${tallyOnly ? 'true' : 'false'}${dollarsQuery}${since}&include-refunds=true`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${token}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });    \r\n  }\r\n\r\n  static async isSignatureValid_call(uri, signature, message, from, token, __fetch) {\r\n    return await __fetch(`${uri}/is-signature-valid`, {\r\n      method: \"POST\",\r\n      headers: { \r\n        'Content-Type': 'application/json; charset=utf-8',\r\n        'Authorization': `Bearer ${token}`\r\n      },\r\n      body: JSON.stringify({\r\n        signature: btoa(signature),\r\n        message: btoa(message),\r\n        address: from\r\n      })\r\n    })\r\n      .then((result) => {\r\n        if (result.status == 200) {\r\n          return true;\r\n        } else {\r\n          return false;\r\n        }\r\n      })\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n  }\r\n}\r\n\r\nexport default imparter_fns;","class ohledger_fns {\r\n  static setNetwork_check_details(details) {\r\n    if (!('currency' in details)) throw new Error(\"'currency' must be passed in\");\r\n    if (!('mode' in details)) throw new Error(\"'mode' must be passed in\");\r\n    details.currency = details.currency.toUpperCase();\r\n    details.mode = details.mode.toLowerCase();\r\n    if (details.currency !== 'USD') throw new Error(\"'currency' must be 'USD'\");\r\n    if (details.mode !== 'prod' && details.mode !== 'test') throw new Error(\"'mode' must be 'prod' or 'test'\");    \r\n  }\r\n\r\n  static async createTransaction(amount, from, to, signFn, showGratisFn, ohLedgerTransactFn, options) {\r\n    if (amount == 0) {\r\n      if ('message' in options && options.message && 'signature' in options && options.signature) {\r\n        var message = options.message;\r\n        var signature = options.signature;\r\n      } else {\r\n        var message = `verify ownership of address by signing on ${new Date().toLocaleString()}`;\r\n        var signature = await signFn(message);\r\n      }\r\n      await showGratisFn(from, signature, message);\r\n    } else {\r\n      await ohLedgerTransactFn(amount, from, to);\r\n    }\r\n  }\r\n}\r\n\r\nexport default ohledger_fns;","import imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass eth_web3 {\r\n  static tag = 'eth-web3';\r\n\r\n  remuneration_uri = {\r\n    'main':'https://ethereum.overhide.io',\r\n    'rinkeby':'https://rinkeby.ethereum.overhide.io'\r\n  };\r\n\r\n  constructor(web3_wallet, getToken, __fetch, fire) {\r\n    this.web3_wallet = web3_wallet;\r\n    this.eth_accounts = web3_wallet.eth_accounts;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n\r\n    web3_wallet.networkChangeDelegates.push((network) => this.onNetworkChange(network));\r\n  }\r\n\r\n  onNetworkChange(network) {\r\n    this.fire('onNetworkChange',{imparterTag: eth_web3.tag, name: network, mode: network == 'main' ? 'prod' : 'test', uri: this.remuneration_uri[network]});\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return false;\r\n  }\r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }    \r\n\r\n  canChangeNetwork() {\r\n    return false;\r\n  }   \r\n\r\n  setCredentials(credentials) {\r\n    return false;\r\n  }\r\n\r\n  getCredentials() {\r\n    return {\"address\":this.web3_wallet.walletAddress};\r\n  }    \r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }  \r\n\r\n  setNetwork(details) {\r\n    return false;\r\n  }\r\n\r\n  getNetwork() {\r\n    return { \"name\": this.web3_wallet.network, \"mode\": this.web3_wallet.network == 'main' ? 'prod' : 'test', \"uri\": this.remuneration_uri[this.web3_wallet.network]};\r\n  }  \r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    return this.remuneration_uri[this.web3_wallet.network];      \r\n  }  \r\n\r\n  async getFromDollars(dollarAmount) {\r\n    const hostPrefix = this.web3_wallet.network === 'main' ? '' : 'test.';\r\n    const now = (new Date()).toISOString();\r\n    const result = await this.__fetch(`https://${hostPrefix}rates.overhide.io/rates/wei/${now}`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${this.getToken()}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n    if (!result || result.length === 0 || ! 'minrate' in result[0] || result[0].minrate === 0) return 0;\r\n    return dollarAmount / result[0].minrate;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.web3_wallet.network) throw new Error(\"network must be set in wallet\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    var from = this.web3_wallet.walletAddress;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }  \r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.web3_wallet.network) throw new Error(\"no network for imparter tag\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.web3_wallet.walletAddress) throw new Error(`imparter ${eth_web3.tag} not active`);\r\n    this.fire('onWalletPopup', {imparterTag: eth_web3.tag});\r\n    return (await window.web3.eth.personal.sign(message, this.web3_wallet.walletAddress, ''));\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.web3_wallet.network) throw new Error(\"no network for imparter tag\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    this.fire('onWalletPopup', {imparterTag: eth_web3.tag});\r\n    await (new Promise((resolve, reject) => {\r\n      window.web3.eth.sendTransaction({ from: from, to: to, value: amount })\r\n      .on('confirmation', function (confirmationNumber, receipt) {\r\n        resolve();\r\n      })\r\n      .on('error', (error) => {\r\n        reject(error);\r\n      }); \r\n    }));\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default eth_web3;","import ohledger_fns from '../fns/ohledger_fns.js';\r\nimport imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass ohledger_web3 {\r\n  static tag = 'ohledger-web3';\r\n\r\n  mode = 'test';\r\n\r\n  constructor(overhide_wallet, web3_wallet, getToken, __fetch, fire) {\r\n    this.web3_wallet = web3_wallet;\r\n    this.overhide_wallet = overhide_wallet;\r\n    this.__fetch = __fetch;\r\n    this.getToken = getToken;\r\n    this.fire = fire;\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return false;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }    \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n  \r\n  setCredentials(credentials) {\r\n    return false;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\": this.web3_wallet.walletAddress};\r\n  }  \r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    ohledger_fns.setNetwork_check_details(details);\r\n\r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: ohledger_web3.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode] });\r\n    return true;\r\n  }\r\n\r\n  getNetwork() {\r\n    return { \"currency\": \"USD\", \"mode\": this.mode, \"uri\": this.overhide_wallet.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.overhide_wallet.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    return dollarAmount * 100;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    var from = this.web3_wallet.walletAddress;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }  \r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.web3_wallet.walletAddress) throw new Error(`imparter ${ohledger_web3.tag} not active`);\r\n    this.fire('onWalletPopup', {imparterTag: ohledger_web3.tag});\r\n    return (await window.web3.eth.personal.sign(message, this.web3_wallet.walletAddress, ''));\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.web3_wallet.walletAddress) throw new Error(\"from 'walletAddress' not set: use wallet\");\r\n    const from = this.web3_wallet.walletAddress;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    await ohledger_fns.createTransaction(\r\n      amount, \r\n      from,\r\n      to,\r\n      (message) => this.sign(message),\r\n      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), \r\n      this.overhide_wallet.oh_ledger_transact_fn[this.mode], \r\n      options);\r\n\r\n    return true;\r\n  }    \r\n}\r\n\r\nexport default ohledger_web3;","import imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass btc_manual {\r\n  static tag = 'btc-manual';\r\n\r\n  remuneration_uri = {\r\n    'prod':'https://bitcoin.overhide.io',\r\n    'test':'https://test.bitcoin.overhide.io'\r\n  };\r\n\r\n  url = 'https://overhide.github.io/ledgers.js/src/frames';\r\n  address = null;\r\n  mode = 'test';\r\n\r\n  constructor(domFns, getToken, __fetch, fire) {\r\n    this.domFns = domFns;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n\r\n    window.addEventListener('message', (e) => {\r\n      if (!e.data || !e.data.event) return;\r\n      switch(e.data.event) {\r\n        case 'oh$-popup-signature':\r\n          if ('detail' in e.data && e.data.detail && 'signature' in e.data.detail) {\r\n            this.domFns.makePopupHidden(e.data.detail.signature, false);\r\n          } else {\r\n            this.domFns.makePopupHidden(`no signature`, true);      \r\n          }          \r\n          break;\r\n      }\r\n    });    \r\n  }\r\n\r\n  canSetCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }  \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n\r\n  setCredentials(credentials) {\r\n    if (!('address' in credentials)) throw new Error(\"'address' must be passed in\");\r\n    switch(this.mode) {\r\n      case 'bitcoin_testnet':\r\n        if (!/(tb(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[mn2][a-km-zA-HJ-NP-Z1-9]{25,39})/.test(credentials.address)) {\r\n          throw new Error(`invalid bitcoin_testnet address: ${credentials.address}`);\r\n        }\r\n        break;\r\n      case 'bitcoin':\r\n        if (!/(bc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})|[13][a-km-zA-HJ-NP-Z1-9]{25,35})/.test(credentials.address)) {\r\n          throw new Error(`invalid bitcoin address: ${credentials.address}`);\r\n        }\r\n        break;\r\n    }\r\n    this.address = credentials.address;\r\n    this.fire('onCredentialsUpdate', { imparterTag: btc_manual.tag, address: this.address});\r\n    return true;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\":this.address};\r\n  }\r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    if (!('mode' in details)) throw new Error(\"'mode' must be passed in\");\r\n    details.mode = details.mode.toLowerCase();\r\n    if (details.mode !== 'prod' && details.mode !== 'test') throw new Error(\"'mode' must be 'prod' or 'test'\");    \r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: btc_manual.tag, mode: details.mode, uri: this.remuneration_uri[details.mode]});\r\n    return true;\r\n  }  \r\n\r\n  getNetwork() {\r\n    return { \"mode\": this.mode, \"uri\": this.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    const hostPrefix = this.mode === 'main' ? '' : 'test.';\r\n    const now = (new Date()).toISOString();\r\n    const result = await this.__fetch(`https://${hostPrefix}rates.overhide.io/rates/sat/${now}`, {\r\n        headers: new Headers({\r\n          'Authorization': `Bearer ${this.getToken()}`\r\n        })\r\n      })\r\n      .then(res => res.json())\r\n      .catch(e => {\r\n        throw String(e)\r\n      });\r\n    if (!result || result.length === 0 || ! 'minrate' in result[0] || result[0].minrate === 0) return 0;\r\n    return dollarAmount / result[0].minrate;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.address) throw new Error(`credentials for imparter ${btc_manual.tag} not set`);\r\n\r\n    this.domFns.hideAllPopupContents();\r\n    const base64Message = btoa(message);\r\n    this.domFns.setFrame(`${this.url}/btc_manual_sign.html?address=${this.address}&message=${base64Message}&token=${this.getToken()}&isTest=${this.mode == 'test'}`);\r\n    return atob(await this.domFns.makePopupVisible());\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    this.domFns.hideAllPopupContents();\r\n    this.domFns.setFrame(`${this.url}/btc_manual_createTransaction.html?from=${this.address}&to=${to}&value=${amount}&isTest=${this.mode == 'test'}`);\r\n    await this.domFns.makePopupVisible();\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default btc_manual;","import ohledger_fns from '../fns/ohledger_fns.js';\r\nimport imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass ohledger {\r\n  static tag = 'ohledger';\r\n\r\n  address = null;\r\n  secret = null;\r\n  mode = 'test';\r\n\r\n  constructor(overhide_wallet, web3_wallet, getToken, __fetch, fire) {\r\n    this.overhide_wallet = overhide_wallet;\r\n    this.eth_accounts = web3_wallet.eth_accounts;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n  }\r\n\r\n  canSetCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n\r\n  setCredentials(credentials) {\r\n    if (!('secret' in credentials)) throw new Error(\"'secret' must be passed in\");\r\n    if ('address' in credentials && credentials.address) {\r\n      this.address = credentials.address.toLowerCase();\r\n    } else {\r\n      this.address = this.eth_accounts.privateKeyToAccount(credentials.secret).address.toLowerCase();\r\n    }\r\n    this.secret = credentials.secret;\r\n    try {\r\n      if (!(this.eth_accounts.recover(this.eth_accounts.sign('test message', this.secret)).toLowerCase() == this.address)) {\r\n        throw new Error(\"'secret' not valid for 'address\");\r\n      }\r\n    } catch (err) {\r\n      throw new Error(\"'secret' not valid for 'address\");\r\n    }        \r\n    this.fire('onCredentialsUpdate', { imparterTag: ohledger.tag, address: this.address, secret: this.secret});\r\n    return true;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\":this.address, \"secret\":this.secret};\r\n  }\r\n\r\n  generateCredentials(options) {\r\n    const res = this.eth_accounts.create();\r\n    this.address = res.address.toLowerCase();\r\n    this.secret = res.privateKey;\r\n    this.fire('onCredentialsUpdate', { imparterTag: ohledger.tag, address: this.address, secret: this.secret});\r\n    return true;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    ohledger_fns.setNetwork_check_details(details);\r\n\r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: ohledger.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode]});\r\n    return true;\r\n  }  \r\n\r\n  getNetwork() {\r\n    return { \"currency\": \"USD\", \"mode\": this.mode, \"uri\": this.overhide_wallet.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.overhide_wallet.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    return dollarAmount * 100;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    if (!this.secret) throw new Error(`credentials for imparter ${ohledger.tag} not set`);\r\n    return this.eth_accounts.sign(message, this.secret).signature;\r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    await ohledger_fns.createTransaction(\r\n      amount, \r\n      from,\r\n      to,\r\n      (message) => this.sign(message),\r\n      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), \r\n      this.overhide_wallet.oh_ledger_transact_fn[this.mode], \r\n      options);\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default ohledger;","import ohledger_fns from '../fns/ohledger_fns.js';\r\nimport imparter_fns from '../fns/imparter_fns.js';\r\n\r\nclass ohledger_social {\r\n  static tag = 'ohledger-social';\r\n\r\n  address = null;\r\n  mode = 'test';\r\n  social = null;\r\n\r\n  constructor(domFns, overhide_wallet, web3_wallet, getToken, __fetch, fire) {\r\n    this.domFns = domFns;\r\n    this.overhide_wallet = overhide_wallet;\r\n    this.eth_accounts = web3_wallet.eth_accounts;\r\n    this.getToken = getToken;\r\n    this.__fetch = __fetch;\r\n    this.fire = fire;\r\n\r\n    window.addEventListener('message', (e) => {\r\n      if (!e.data || !e.data.event) return;\r\n      switch(e.data.event) {\r\n        case 'oh$-login-success':\r\n          this.domFns.makePopupHidden('login success', false);          \r\n          break;\r\n        case 'oh$-login-failed':\r\n          this.domFns.makePopupHidden('login failure', true);\r\n          break;\r\n        case 'oh$-logout-success':\r\n          this.domFns.makePopupHidden('logout', false);\r\n          break;\r\n      }\r\n    });    \r\n  }\r\n\r\n  canSetCredentials() {\r\n    return true;\r\n  }  \r\n\r\n  canGenerateCredentials() {\r\n    return false;\r\n  }  \r\n\r\n  canChangeNetwork() {\r\n    return true;\r\n  }  \r\n\r\n  async setCredentials(credentials) {\r\n    if (!credentials) {\r\n      if (!this.social) throw new Error(\"Not logged in\");    \r\n      this.domFns.hideAllPopupContents();\r\n      this.domFns.setFrame(`https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/logout?redirect_uri=http%3A%2F%2Fsocial.overhide.io%2Flogout`);\r\n      await this.domFns.makePopupVisible();  \r\n      this.address = null;\r\n    } else if ('provider' in credentials) {\r\n      this.social = credentials.provider;\r\n      await this.sign(`setting credentials on ${new Date()}`);      \r\n    } else {\r\n      throw new Error(\"Incorrect credentials options.\");\r\n    }\r\n    this.fire('onCredentialsUpdate', { imparterTag: ohledger_social.tag, address: this.address });\r\n    return true;\r\n  }  \r\n\r\n  getCredentials() {\r\n    return {\"address\":this.address};\r\n  }\r\n\r\n  generateCredentials(options) {\r\n    return false;\r\n  }\r\n\r\n  setNetwork(details) {\r\n    ohledger_fns.setNetwork_check_details(details);\r\n\r\n    this.mode = details.mode;\r\n    this.fire('onNetworkChange', { imparterTag: ohledger_social.tag, currency: 'USD', mode: details.mode, uri: this.overhide_wallet.remuneration_uri[details.mode]});\r\n    return true;\r\n  }  \r\n\r\n  getNetwork() {\r\n    return { \"currency\": \"USD\", \"mode\": this.mode, \"uri\": this.overhide_wallet.remuneration_uri[this.mode]};\r\n  }\r\n\r\n  getOverhideRemunerationAPIUri() {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    return this.overhide_wallet.remuneration_uri[this.mode];\r\n  }\r\n\r\n  async getFromDollars(dollarAmount) {\r\n    return dollarAmount * 100;\r\n  }\r\n\r\n  async getTxs(recipient, date, tallyOnly, tallyDollars) {\r\n    imparter_fns.getTxs_check_details(recipient, date);\r\n\r\n    const to = recipient.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n\r\n    return await imparter_fns.getTxs_retrieve(uri, from, to, tallyOnly, tallyDollars, date, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async isOnLedger() {\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    if (!uri) throw new Error('no uri for request, unsupported network selected in wallet?');\r\n    const message = 'verify ownership of address by signing';\r\n    const signature = await this.sign(message);\r\n\r\n    return await imparter_fns.isSignatureValid_call(uri, signature, message, from, this.getToken(), this.__fetch);\r\n  }\r\n\r\n  async sign(message) {\r\n    try {\r\n      const res = this.eth_accounts.create();\r\n      const karnet = res.privateKey;\r\n      this.domFns.hideAllPopupContents();\r\n      this.domFns.setFrame(`https://social.overhide.io/pending`, 30, 10);\r\n      const popupPromise = this.domFns.makePopupVisible();     \r\n      window.open(\r\n        `https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`,\r\n        '_blank',\r\n        {height: 300, width: 300}\r\n      );\r\n      await popupPromise;\r\n      return await this.__fetch(`https://social.overhide.io/sign?karnet=${karnet}&message=${btoa(message)}`, {\r\n        method: \"GET\",\r\n        headers: { \r\n          'Content-Type': 'application/json; charset=utf-8',\r\n          'Authorization': `Bearer ${this.getToken()}`\r\n        }})\r\n      .then(async (result) => {\r\n        if (result.status == 200) {\r\n          const resultValue = await result.json();\r\n          this.address = resultValue.address;\r\n          return atob(resultValue.signature);\r\n        } else {\r\n          throw new Error(await result.text());\r\n        }\r\n      });\r\n    } catch(e) {\r\n      throw String(e)\r\n    }  \r\n  }\r\n\r\n  async createTransaction(amount, to, options) {\r\n    if (!this.mode) throw new Error(\"network 'mode' must be set, use setNetwork\");\r\n    if (!this.address) throw new Error(\"from 'address' not set: use setCredentials\");\r\n    const from = this.address;\r\n    const uri = this.getOverhideRemunerationAPIUri();\r\n\r\n    await ohledger_fns.createTransaction(\r\n      amount, \r\n      from,\r\n      to,\r\n      (message) => this.sign(message),\r\n      (from, signature, message) => this.overhide_wallet.showOhLedgerGratisIframeUri(uri, from, signature, message), \r\n      this.overhide_wallet.oh_ledger_transact_fn[this.mode], \r\n      options);\r\n\r\n    return true;\r\n  }  \r\n}\r\n\r\nexport default ohledger_social;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","// A modal to display iframes and forms on behalf of the library.\r\nclass dom_fns {\r\n  resolve = null;\r\n  reject = null;\r\n\r\n  constructor() {\r\n    window.addEventListener('message', (e) => {\r\n      if (!e.data || !e.data.event) return;\r\n      switch(e.data.event) {\r\n        case 'oh$-popup-close':\r\n          this.makePopupHidden('user close', true);\r\n          break;\r\n      }\r\n    });    \r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.createPopup();\r\n  }\r\n\r\n  // raise oh$-event\r\n  // @param {string} imparterTag\r\n  // @param {string} triggerFor \r\n  // @param {Object} data - to stringify and sent as event.details.\r\n  raiseEventClick(imparterTag, triggerFor) {\r\n    window.parent.postMessage({event: 'oh$-event', detail: JSON.stringify({\r\n      imparterTag: imparterTag,\r\n      triggerFor: triggerFor,\r\n      click: true\r\n    })});\r\n  }\r\n\r\n  // raise oh$-event\r\n  // @param {string} imparterTag\r\n  // @param {string} triggerFor \r\n  // @param {Object} data - to stringify and sent as event.details.\r\n  raiseEvent(imparterTag, triggerFor, data) {\r\n    window.parent.postMessage({event: 'oh$-event', detail: JSON.stringify({\r\n      ...data,\r\n      imparterTag: imparterTag,\r\n      triggerFor: triggerFor\r\n    })});    \r\n  }\r\n\r\n  // promise used for popups and resolutions via oh-ledger-* messages.\r\n  setupNewPromise() {\r\n    console.assert(!this.resolve, 'oh-popup promise being set but already set when calling setupNewPromise(..)');\r\n    return new Promise((rs, rj) => {\r\n      this.resolve = rs;\r\n      this.reject = rj;\r\n    });    \r\n  }\r\n\r\n  // Setup the iframe source\r\n  setFrame(src, widthEm=80, heightEm=60) {\r\n    const frame = document.getElementById('oh-ledger-iframe');\r\n    frame.setAttribute('src', src);\r\n    frame.style.display='block';    \r\n    const container = document.getElementById('oh-popup-container-div');\r\n    container.style.width=`${widthEm}em`;\r\n    container.style.height=`${heightEm}em`;\r\n  }\r\n\r\n  // make popup visible to be hidden with makePopupHidden\r\n  makePopupVisible() {\r\n    var popup = document.getElementById('oh-popup-container');\r\n    popup.style.display='block';\r\n    return this.setupNewPromise();\r\n  }\r\n\r\n  makePopupHidden(params, isError) {\r\n    var popup = document.getElementById('oh-popup-container');\r\n    this.hideAllPopupContents();\r\n    popup.style.display='none';\r\n    console.assert(this.resolve, 'oh-popup promise not set yet calling makePopupHidden(..)');\r\n    if (isError) this.reject(params)\r\n    else this.resolve(params);\r\n    this.resolve = null;\r\n    this.reject = null;\r\n  }\r\n\r\n  hideAllPopupContents() {\r\n    document.getElementById('oh-ledger-iframe').style.display='none';\r\n  }\r\n\r\n  createPopup() {\r\n    var popup = document.createElement('div');\r\n    popup.setAttribute('id','oh-popup-container');\r\n    popup.style.display='none';\r\n    popup.innerHTML = `\r\n      <div id=\"oh-popup-container-div\">\r\n        <a href=\"#\" title=\"Close\" id=\"oh-popup-close\" onclick=\"window.parent.postMessage({event: 'oh$-popup-close'}); return false;\">X</a>\r\n        <iframe id=\"oh-ledger-iframe\"></iframe>\r\n      </div>\r\n    `;\r\n    var style = document.createElement('style');\r\n    style.innerHTML =`\r\n      #oh-popup-container {\r\n          position: fixed;\r\n          font-family: arial, \"lucida console\", sans-serif;\r\n          top: 0;\r\n          right: 0;\r\n          bottom: 0;\r\n          left: 0;\r\n          background: rgba(0, 0, 0, 0.8);\r\n          z-index: 999;\r\n          opacity:1;\r\n          pointer-events: auto;\r\n      }\r\n      #oh-popup-container-div {\r\n          max-width: 80vw;\r\n          max-height: 75vh;\r\n          position: relative;\r\n          top: 15vh;\r\n          margin: auto auto;\r\n          padding: 5px 5px 5px 5px;\r\n          background: white;\r\n      }\r\n      #oh-popup-close {\r\n          background: grey;\r\n          color: white;\r\n          line-height: 25px;\r\n          position: absolute;\r\n          right: 2px;\r\n          text-align: center;\r\n          top: 2px;\r\n          width: 24px;\r\n          text-decoration: none;\r\n          font-weight: bold;\r\n      }\r\n      #oh-popup-close:hover {\r\n          background: black;\r\n      }\r\n\r\n      #oh-ledger-iframe {\r\n        display: none;\r\n        border: 0;\r\n        overflow: hidden;\r\n        width: 100%;\r\n        height: 100%;\r\n      }\r\n    `;\r\n    var attach = () => {\r\n      if (document.body) {\r\n        document.body.appendChild(popup);\r\n        document.body.appendChild(style);\r\n      } else {\r\n        setTimeout(attach, 100);\r\n      };\r\n    };\r\n    attach();\r\n  }  \r\n}\r\n\r\nexport default dom_fns;","import Web3 from 'web3';\r\nimport eth_web3 from '../imparters/eth-web3.js';\r\nimport ohledger_web3 from '../imparters/ohledger-web3.js';\r\n\r\nconst WALLET_CHECK_INTERVAL_MS = 500;\r\n\r\nclass web3_wallet {\r\n  eth_accounts = (new Web3('http://localhost:8545')).eth.accounts;\r\n  walletAddress = null;\r\n  network = null;\r\n\r\n  networkChangeDelegates = [];\r\n\r\n  constructor(addTag, removeTag, fire) {\r\n    this.addTag = addTag;\r\n    this.removeTag = removeTag;\r\n    this.fire = fire;\r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.detectWeb3Wallet();\r\n  }\r\n\r\n  /**\r\n   * Setup window.web3 to be the wallet's if available or offline if not (just for signing).\r\n   * \r\n   * Sets up a timer to check for wallet being logged in and address changes.\r\n   * \r\n   * @ignore\r\n   */\r\n  detectWeb3Wallet() {    \r\n    if (!window.ethereum) return;\r\n \r\n    // Modern dapp browsers...\r\n    (async () => {\r\n      try {\r\n        await window.ethereum.enable();\r\n        window.web3 = new Web3(window.ethereum);\r\n      } catch (e) {/*noop*/ }\r\n\r\n      await detectWalletCb();\r\n\r\n      setInterval(async function () {\r\n        await detectWalletCb();\r\n      }, WALLET_CHECK_INTERVAL_MS);\r\n    })();\r\n\r\n    var detectWalletCb = async () => {\r\n      try {\r\n        var currentAccounts = await window.web3.eth.getAccounts();\r\n        var currentAddress = (currentAccounts && currentAccounts.length > 0) ? currentAccounts[0] : null;\r\n        var currentNetwork = (await window.web3.eth.net.getNetworkType());\r\n      } catch (e) {/*noop*/}\r\n      if (currentNetwork !== this.network) {\r\n        this.network = currentNetwork;\r\n        this.networkChangeDelegates.forEach(d => d(this.network));        \r\n      }\r\n      if (currentAddress !== this.walletAddress) {\r\n        if (currentAddress) { /* add imparters */\r\n          this.addTag(eth_web3.tag);\r\n          this.addTag(ohledger_web3.tag);\r\n        } else { /* remove imparters */\r\n          this.removeTag(eth_web3.tag);\r\n          this.removeTag(ohledger_web3.tag);\r\n        } \r\n        this.walletAddress = currentAddress;\r\n        this.fire('onWalletChange', { imparterTag: eth_web3.tag, isPresent: !!currentAddress });\r\n        this.fire('onWalletChange', { imparterTag: ohledger_web3.tag, isPresent: !!currentAddress });\r\n        if (currentAddress) {\r\n          this.fire('onCredentialsUpdate', { imparterTag: eth_web3.tag, address: currentAddress });\r\n          this.fire('onCredentialsUpdate', { imparterTag: ohledger_web3.tag, address: currentAddress });\r\n        }\r\n      }\r\n    }\r\n  } \r\n}\r\n\r\nexport default web3_wallet;","class overhide_wallet {\r\n  oh_ledger_transact_fn = {\r\n    'prod': null,\r\n    'test': null\r\n  };\r\n\r\n  remuneration_uri = {\r\n    'prod': 'https://ledger.overhide.io/v1',\r\n    'test': 'https://test.ledger.overhide.io/v1'\r\n  }\r\n\r\n  constructor(domFns) {\r\n    this.domFns = domFns;\r\n\r\n    window.addEventListener('message', (e) => {\r\n      if (e.data && e.data.event === 'oh-ledger-ok') {\r\n        this.domFns.makePopupHidden(e.data.detail);\r\n      } else if (e.data && e.data.event === 'oh-ledger-error') {\r\n        this.domFns.makePopupHidden(e.data.detail, true);\r\n      }\r\n    }, false);\r\n  }\r\n\r\n  // initialize this after all dependencies wired up\r\n  init() {\r\n    this.attach();\r\n  }\r\n  \r\n  attach = () => {\r\n    if (document.body) {\r\n      this.loadOhLedgerTransactFns();\r\n    } else {\r\n      setTimeout(this.attach, 100);\r\n    };\r\n  };\r\n\r\n  async showOhLedgerGratisIframeUri(uri, from, signature, message) {\r\n    this.domFns.hideAllPopupContents();\r\n    this.domFns.setFrame(`${uri}/gratis.html?address=${from}&signature=${signature}&message=${message}`);\r\n    await this.domFns.makePopupVisible();\r\n  }\r\n\r\n  // https://stackoverflow.com/a/31374433\r\n  loadJS(url, implementationCode, location) {\r\n    //url is URL of external file, implementationCode is the code\r\n    //to be called from the file, location is the location to \r\n    //insert the <script> element\r\n\r\n    var scriptTag = document.createElement('script');\r\n    scriptTag.src = url;\r\n\r\n    scriptTag.onload = implementationCode;\r\n    scriptTag.onreadystatechange = implementationCode;\r\n\r\n    location.appendChild(scriptTag);\r\n  };\r\n\r\n  loadOhLedgerTransactFns() {\r\n    // load prod ohledger transact fn\r\n    this.loadJS(`${this.remuneration_uri.prod}/transact.js`, () => {\r\n      const fn = oh_ledger_transact;\r\n      this.oh_ledger_transact_fn.prod = (...args) => { fn(...args); return this.domFns.setupNewPromise(); }\r\n    }, document.body);\r\n\r\n    // load test ohledger transact fn\r\n    this.loadJS(`${this.remuneration_uri.test}/transact.js`, () => {\r\n      const fn = oh_ledger_transact;\r\n      this.oh_ledger_transact_fn.test = (...args) => { fn(...args); return this.domFns.setupNewPromise(); }\r\n    }, document.body);\r\n  }\r\n}\r\n\r\nexport default overhide_wallet;","import dom_fns from './fns/dom_fns';\r\nimport eth_web3 from './imparters/eth-web3.js';\r\nimport btc_manual from './imparters/btc-manual.js';\r\nimport ohledger_web3 from './imparters/ohledger-web3.js';\r\nimport ohledger from './imparters/ohledger.js';\r\nimport ohledger_social from './imparters/ohledger-social.js';\r\nimport web3_wallet from './wallets/web3_wallet.js';\r\nimport overhide_wallet from './wallets/overhide_wallet.js';\r\n\r\n//     ledgers.js \r\n//     https://ledger.overhide.io\r\n//     (c) 2021 Overhide LLC, Wyoming, USA\r\n//     ledgers.js may be freely distributed under the MIT license.\r\n\r\n/**\r\n * @namespace oh$\r\n * @description \r\n * \r\n * ### REFERENCES\r\n * \r\n * Library code: https://github.com/overhide/ledgers.js/blob/master/dist/ledgers.js.\r\n *\r\n * Repository for this library is https://github.com/overhide/ledgers.js.\r\n * \r\n * The above repository contains a demo app of this library working in conjunction with:\r\n * \r\n * - the *overhide* Ethereum remuneration provider (Rinkeby testnet -- https://rinkeby.ethereum.overhide.io) \r\n * - the *overhide-ledger* (test environment -- https://test.ledger.overhide.io)\r\n * - the *overhide* Bitcoin remuneration provider (testnet -- https://test.bitcoin.overhide.io) \r\n * \r\n * ### ABOUT\r\n * \r\n * JavaScript library to be used in-browser and interrogate *overhide* remuneration providers as to validity\r\n * of ledger credentials and transactions involving these credentials.\r\n * \r\n * The goal of the library and the *overhide* remuneration providers is to ease using of all types of ledgers for\r\n * authentication (I am who I say) and authorization (paid access tiers).\r\n * \r\n * The library leverages injected currency wallets where it can, and exposes functions to work with *loose* currencies \r\n * (without wallets) where it cannot.\r\n * \r\n * The library exports the `oh$` object for use as a module when bundling.\r\n * \r\n * > ---\r\n * > ```\r\n * > import oh$ from \"ledgers.js\";\r\n * > oh$.enable(token);\r\n * > oh$.addEventListener('onWalletChange', (e) => {...});\r\n * > ```\r\n * > ---\r\n * \r\n * > APIs abstracted by *ledgers.js* require a bearer-token.  The `token` (above) is passed in to `enable` the rest of the library's\r\n * > functionality.  `oh$.enable(..)` can be called every so often with a refreshed token.\r\n * >\r\n * >  A token can be retrieved with a `GET /token` call (see https://token.overhide.io/swagger.html).\r\n * >\r\n * > To retrieve tokens please first register for your own API key at https://token.overhide.io/register.\r\n * \r\n * The library can be loaded straight into your HTML (along with pre-requisite `web3.min.js`) and accessed by its `oh$` property from the browser's `window` object:\r\n * \r\n * > ---\r\n * > ```\r\n * > <script \r\n * >    src=\"https://cdnjs.cloudflare.com/ajax/libs/web3/1.3.4/web3.min.js\" \r\n * >    integrity=\"sha512-TTGImODeszogiro9DUvleC9NJVnxO6M0+69nbM3YE9SYcVe4wZp2XYpELtcikuFZO9vjXNPyeoHAhS5DHzX1ZQ==\" \r\n * >    crossorigin=\"anonymous\"></script>\r\n * > <script src=\"./dist/ledgers.js\"></script>\r\n * > <script>\r\n * >   oh$.enable(token);\r\n * >   oh$.addEventListener('onWalletChange', (e) => {...});\r\n * > </script>\r\n * > ```\r\n * > ---\r\n * \r\n * ### IMPARTERS\r\n * \r\n * The library works with a concept of *imprater* tags.  Wallets impart credentials, signatures, and transactions.  For\r\n * *loose change*--where no wallet exists--the library can be interrogated as to which entities should be set by the \r\n * user (can* functions); causing the entities to be imparted back to the user in a common code flow.  \r\n * \r\n * The imparter tags are a simple naming convention.  For example if multiple Ethereum wallet APIs were imparting data \r\n * they  would be individually tagged with a prefix \"eth\" and a dashed suffix.  No suffix indicates a *loose change*\r\n * imparter:\r\n * \r\n * - eth-web3\r\n * - eth-?\r\n * \r\n * Similarly for *overhide-ledger*, the prefix is \"ohledger\", the suffix won't be attached on the *loose change* version \r\n * and will be suffixed on the *web3* walleted version:\r\n * \r\n * - ohledger\r\n * - ohledger-web3\r\n * - ohledger-social\r\n * \r\n * The *ohledger-social* imparter is to use the *overhide-ledger* with credentials stored online behind a Microsoft or\r\n * Google social login.  The *overhide-ledger* credentials are not transferred to the client.  They sit in the cloud and\r\n * are used once a social provider allows it.\r\n * \r\n * Thus far Bitcoin is only supported in manual mode (no Bitcoin wallet injection into target site):\r\n * \r\n * - btc-manual\r\n * \r\n * The following sections cover special notes on each imparter.  The library adheres to these notes.\r\n * \r\n * #### eth-web3\r\n * \r\n * > Ethereum addresses are 20 bytes: 42 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Ethereum secret keys for signing addresses are 32 bytes: 66 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Ethereum networks names/modes are:\r\n * >\r\n * >> | name | mode | notes |\r\n * >> | --- | --- | --- |\r\n * >> | main | prod | |\r\n * >> | rinkeyby | test | |\r\n * >> | kovan | test | not supported |\r\n * >> | ropsten | test | not supported |\r\n * >> | goerli | test | not supported |\r\n * >\r\n * > The denomination for amounts is the Wei\r\n * \r\n * #### ohledger, ohledger-web3, ohledger-social\r\n * \r\n * > Addresses and secret keys use Ethereum format.\r\n * >\r\n * > Addresses are 20 bytes: 42 character 'hex' strings prefixed with '0x'.\r\n * > \r\n * > Secret keys for signing addresses are 32 bytes: 66 character 'hex' strings prefixed with '0x'.\r\n * >\r\n * > Network tuples consist of a 'currency' as a three letter ISO fiat currency code and a 'mode'.  The supported\r\n * > 'currency' names are:\r\n * > \r\n * > * 'USD'\r\n * > \r\n * > The denominations are:\r\n * > \r\n * >> | Currency | denomination |\r\n * >> | --- | --- |\r\n * >> | USD | cents |\r\n * > \r\n * > Note: at this point only USD are supported.  If there is a need, and *overhide-ledger* instances in currencies\r\n * > other than USD come online, we'll revisit this.\r\n * >\r\n * > An 'ohledger' mode is one of 'prod' or 'test'\r\n * \r\n * #### btc-manual\r\n * \r\n * > Addresses use Bitcoin format.\r\n * > \r\n * > Bitcoin network modes are:\r\n * > \r\n * > * prod -- for mainnet\r\n * > * test -- for testnet\r\n * > \r\n * > The denomination for amounts is the Satoshi.\r\n * \r\n */\r\nconst oh$ = (function() {\r\n\r\n  var root = typeof self == 'object' && self.self === self && self ||\r\n    typeof global == 'object' && global.global === global && global ||\r\n    this ||\r\n    {};\r\n\r\n  root.oh$ = new class extends EventTarget {\r\n    /**\r\n     * @event onWalletChange\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | * | `{imparterTag:..,isPresent:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *isPresent* - if wallet is present for imparter\r\n     *\r\n     * @description\r\n     *   Event called when wallets' state changes.\r\n     * \r\n     *   In user code:\r\n     * \r\n     *   ```\r\n     *   oh$.addEventListener('onWalletChange', (e) => console.log(`wallet for ${e.imparterTag} is available:${e.isPresent}`));\r\n     *   ```\r\n     */\r\n\r\n    /**\r\n     * @event onWalletPopup\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | * | `{imparterTag:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the pop-up\r\n     *\r\n     * @description\r\n     *   Event called when wallet is expected to popup.  Useful in case user wants to react to popup in UI.\r\n     * \r\n     *   In user code:\r\n     * \r\n     *   ```\r\n     *   oh$.addEventListener('onWalletPopup', (e) => console.log(`wallet for ${e.imparterTag} popped`));\r\n     *   ```\r\n     */\r\n\r\n    /**\r\n     * @event onCredentialsUpdate\r\n     * @description\r\n     *   Event called when an credentials change for one of the tracked imparters.\r\n     * \r\n     *   Only called when credentials are valid as per imparter: ready to be used for signing, transacting.\r\n     *\r\n     *   In user code:\r\n     *\r\n     *   ```\r\n     *   oh$.addEventListener('onCredentialsUpdate', (e) => {\r\n     *     console.log(`new address for ${e.imparterTag} is:${e.address}`);\r\n     *     return;\r\n     *   });\r\n     *   ```\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     * \r\n     *  > The new event object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{imparterTag:..,address:..}` |\r\n     *  > | ohledger | `{imparterTag:..,address:..,secret:..}` |\r\n     *  > | ohledger-web3 | `{imparterTag:..,address:..}` |\r\n     *  > | ohledger-social | `{imparterTag:..,address:..}` |\r\n     *  > | btc-manual | `{imparterTag:..,address:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *address* - ledger public address of credential set for imparter\r\n     *  >\r\n     *  > *secret* - ledger PKI private secret for credential set for imparter\r\n     *\r\n     */\r\n\r\n    /**\r\n     * @event onNetworkChange\r\n     * @description\r\n     *   Event called when the network changes for a particular imparter tag.\r\n     * \r\n     *   For example for \"eth\" the network could changed from \"main\" to \"rinkeby\".  \r\n     * \r\n     *   In user code:\r\n     *\r\n     *   ```\r\n     *   oh$.addEventListener('onNetworkChange', (e) => {\r\n     *     if (e.imparterTag === 'eth-web3') console.log(`new network selected for ${e.imparterTag} is:${e.name}`);\r\n     *     if (e.imparterTag === /ohledger/.test(e.imparterTag)) console.log(`working in currency: ${e.currency}`);\r\n     *     if (e.imparterTag === 'btc-manual') console.log(`new network mode selected for ${e.imparterTag} is:${e.name}`);\r\n     *     return;\r\n     *   });\r\n     *   ```\r\n     * @param {Object} event object - the event object passed in will have additional attributes\r\n     *\r\n     *  > The new credentials object will conform to the following:\r\n     *  >\r\n     *  > | imparter tag | event object attributes |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{imparterTag:..,name:('main'|'rinkeby'|'kovan')..,mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger | `{imparterTag:..,currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger-web3 | `{imparterTag:..,currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | btc-manual | `{imparterTag:..,mode:('prod'|'test'), uri:..}` |\r\n     *  >\r\n     *  > *imparterTag* - causing the event\r\n     *  >\r\n     *  > *name* - of network\r\n     *  >\r\n     *  > *currency* - represented by network\r\n     *  >\r\n     *  > *mode* - production or test network\r\n     *  >\r\n     *  > *uri* - remuneration API URI for network\r\n     *\r\n     */\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function enable\r\n     * @description\r\n     *   Enable `oh$` by instrumenting with token for ledger access.\r\n     * \r\n     *   `oh$` calls may stall while waiting for this call to complete successfully.\r\n     * \r\n     *   A token can be retrieved with a `GET /token` call (see https://token.overhide.io/swagger.html).\r\n     * \r\n     *   To retrieve tokens please first register for your own API key at https://token.overhide.io/register.\r\n     * @param {string} token\r\n     */\r\n    enable = enable;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getImparterTags\r\n     * @description\r\n     *   Retrieves all imparter tags injected by wallets and statically available from the library.\r\n     * @returns {Array} of strings: the imparter tags available\r\n     */\r\n    getImparterTags = getImparterTags;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canSetCredentials\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have credentials set by the user: or does the wallet control it\r\n     *   exclusively.\r\n     * \r\n     *   Only the following imparter(s) will return 'true':\r\n     * \r\n     *   - ohledger\r\n     *   - btc-manual\r\n     * \r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have credentials set.\r\n     */\r\n    canSetCredentials = canSetCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canGenerateCredentials\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have credentials generated by the user: or does the wallet control it\r\n     *   exclusively.\r\n     *\r\n     *   Only the following imparter(s) will return 'true':\r\n     *\r\n     *   - ohledger\r\n     *\r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have credentials generated.\r\n     */\r\n    canGenerateCredentials = canGenerateCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function canChangeNetwork\r\n     * @description\r\n     *   Interrogate whether the imparter tag can have network changed by the user via oh$: or does the wallet control it\r\n     *   exclusively.\r\n     *\r\n     *   Only the following imparter(s) will return 'true':\r\n     *\r\n     *   - ohledger\r\n     *   - ohledger-web3\r\n     *   - btc-manual\r\n     *\r\n     * @param {string} imparterTag\r\n     * @returns {boolean} 'true' if particular imparter tag can have networks changed via oh$.\r\n     */\r\n    canChangeNetwork = canChangeNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function generateCredentials\r\n     * @description\r\n     *   For imparters that can have credentials generated, generates them.  \r\n     * \r\n     *   Fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n     * @param {string} imparterTag\r\n     * @param {Object} options - imparter specific generation options, if any.\r\n     * \r\n     *  > The options objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | credentials object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not supported |\r\n     *  > | ohledger | null | |\r\n     *  > | ohledger-web3 | N/A | not supported |\r\n     *  > | btc-manual | N/A | not supported |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n\r\n     */\r\n    generateCredentials = generateCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function setCredentials\r\n     * @description\r\n     *   For imparters that can have credentials set, sets them.  \r\n     * \r\n     *   Fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {Object} credentials - credentials object of imparter specific parameters to set\r\n     * \r\n     *  > The credentials objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | credentials object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not suppoted |\r\n     *  > | ohledger | `{address:..,secret:..}` | `address` is optional, if not set will be extracted from `secret` |\r\n     *  > | ohledger-web3 | N/A | not supported |\r\n     *  > | ohledger-social | `{provider:..}` | `provider` is one of 'google' or 'microsoft'; if null, log-out |\r\n     *  > | btc-manual | `{address:..}` | |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onCredentialsUpdate](#eventoncredentialsupdate) event against `oh$`\r\n     */\r\n    setCredentials = setCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function setNetwork\r\n     * @description\r\n     *   For imparters that can have networks changed via oh$, changes it.  \r\n     * \r\n     *   Fires [onNetworkChange](#eventonnetworkchange) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {Object} details - network details object of imparter specific parameters to set.\r\n     * \r\n     *  > The network details objects are as follows:\r\n     *  >\r\n     *  > | imparter tag | network details object | comments |\r\n     *  > | --- | --- | --- |\r\n     *  > | eth-web3 | N/A | not supported, change in wallet |\r\n     *  > | ohledger | `{currency:'USD', mode:'prod'|'test'}` | |\r\n     *  > | ohledger-web3 | `{currency:'USD', mode:'prod'|'test'}` | |\r\n     *  > | btc-manual | `{mode:'prod'|'test'}` | |\r\n     *\r\n     * @returns {Promise} representing a 'true' if success else 'false'; also fires [onNetworkChange](#eventonnetworkchange) event against `oh$`\r\n     */\r\n    setNetwork = setNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getOverhideRemunerationAPIUri\r\n     * @description\r\n     *   Based on current network set returns the *overhide* remuneration API URI configured in the library.\r\n     * @param {string} imparterTag\r\n     * @returns {string} the URI.\r\n     */\r\n    getOverhideRemunerationAPIUri = getOverhideRemunerationAPIUri;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getCredentials\r\n     * @description\r\n     *   Retrieves current credentials for an imparterTag.\r\n     * @param {string} imparterTag\r\n     * @returns {Object} details - an object describing current credentials, imparterTag dependant:\r\n     * \r\n     *  > | imparter tag | credentials object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..,secret:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | ohledger-social | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     */\r\n    getCredentials = getCredentials;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getNetwork\r\n     * @description\r\n     *   Retrieves current network for an imparterTag.\r\n     * @param {string} imparterTag\r\n     * @returns {Object} details - an object describing current network, imparterTag dependant:\r\n     * \r\n     *  > | imparter tag | network details object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{name:('main'|'rinkeby'|'kovan').., mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger | `{currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | ohledger-web3 | `{currency:'USD',mode:('prod'|'test'), uri:..}` |\r\n     *  > | btc-manual | `{mode:('prod'|'test'), uri:..}` |\r\n     */\r\n    getNetwork = getNetwork;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getFromDollars\r\n     * @description\r\n     *   Retrieve a (highest) converted amount in imparter specific denomination from a provided dollar amount at a very recent exchange rate.\r\n     * @param {string} imparterTag\r\n     * @param {number} dollarAmount - the dollar amount.\r\n     * @returns {Promise} with the value in imparter specific currency at the present time (based on recent exchange rate).\r\n     */\r\n     getFromDollars = getFromDollars;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTallyDollars\r\n     * @description\r\n     *   Retrieve a tally of all transactions on the imparter's ledger--perhaps within a date range--converted to a US dollar amount.\r\n     * @param {string} imparterTag\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @returns {Promise} with the `{'tally':.., 'as-of':..}` object, whereby the 'tally' value is in US dollars: all transactions \r\n     *   are exchanged to USD at an approximate (highest) exchange rate close to the transactions' time.  The 'as-of' timestamp \r\n     *   is that of the call (pass this to back-end to retrieve cached values at better API call rates).\r\n     */\r\n     getTallyDollars = getTallyDollars;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTally\r\n     * @description\r\n     *   Retrieve a tally of all transactions on the imparter's ledger--perhaps within a date range.\r\n     * @param {string} imparterTag\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @returns {Promise} with the `{'tally':.., 'as-of':..}` object, whereby the tally value is in imparter specific currency.\r\n     *   The 'as-of' timestamp is that of the call (pass this to back-end to retrieve cached values at better API call rates).\r\n     */\r\n    getTally = getTally;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function getTransactions\r\n     * @description\r\n     *   Retrieve transactions on the imparter's ledger, perhaps within a date range, from credentials set against \r\n     *   imparter to a recipient\r\n     * @param {string} imparterTag\r\n     * @param {Date} since - date to start tally since: date of oldest transaction to include.  No restriction if 'null'.\r\n     * @param {Object} recepient - imparter specific object describing recipient of transactions to tally for.\r\n     *\r\n     *  > Recipient objects are as per:\r\n     *  >\r\n     *  > | imparter tag | recipient object |\r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | `{address:..}` |\r\n     *  > | ohledger | `{address:..}` |\r\n     *  > | ohledger-web3 | `{address:..}` |\r\n     *  > | btc-manual | `{address:..}` |\r\n     *\r\n     * @returns {Promise} with the `{'transactions': [{\"transaction-value\":..,\"transaction-date\":..},..], 'as-of':..}` object, \r\n     *   whereby 'transactions' is the list of transactions and 'as-of' is the timestamp of the call.\r\n     */\r\n    getTransactions = getTransactions;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function isOnLedger\r\n     * @description\r\n     *   Determine if current credentials have some transaction on the imparter's ledger: transaction can be to anyone.\r\n     * \r\n     *   Intent is to validate beyond just a valid address.  To validate the address has been used.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @returns {Promise} with 'true' or 'false'; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    isOnLedger = isOnLedger;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function sign\r\n     * @description\r\n     *   Sign using the provided message using the credentials set against the specific imparter.\r\n     * \r\n     *   Note: wallet might pop up a dialog upon this call, consider that in your UX flow.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`.\r\n     * @param {string} imparterTag\r\n     * @param {string} message - to sign\r\n     * @returns {Promise} with the signature; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    sign = sign;\r\n\r\n    /**\r\n     * @namespace oh$\r\n     * @function createTransaction\r\n     * @description\r\n     *   Create a transaction on the imparter's ledger.\r\n     * \r\n     *   May fire [onWalletPopup](#eventonwalletpopup) event against `oh$`; wallet might pop up a dialog upon this call, consider that in your UX flow.\r\n     * @param {string} imparterTag\r\n     * @param {number} amount\r\n     * @param {string} to - address of recipient\r\n     * \r\n     *  > $0 (*amount*) transactions against *ohledger* or *ohledger-web* *imparters* use the current credential \r\n     *  > as the *to* address, not the specified *to* address.\r\n     *  \r\n     * @param {Object} options - other options required for the specific imparter.\r\n     * \r\n     *  > The options objects are as follows:\r\n     *  > \r\n     *  > | imparter tag | credentials object | \r\n     *  > | --- | --- |\r\n     *  > | eth-web3 | null |\r\n     *  > | ohledger | {message:.., signature:..} |\r\n     *  > | ohledger-web3 | {message:.., signature:..} |\r\n     *  > | ohledger-social | {message:.., signature:..} |\r\n     *  > | btc-manual | null |\r\n     *  > \r\n     *  > If *message* and *signature* are provided they are used instead of oh$ asking for wallet to resign message.\r\n     *\r\n     * @returns {Promise} of a 'true' for success or an Error; may fire [onWalletPopup](#eventonwalletpopup) event against `oh$`\r\n     */\r\n    createTransaction = createTransaction;\r\n  }();\r\n\r\n  var doEnable = null;\r\n  const isEnabled = new Promise((resolve) => doEnable = resolve);\r\n  var token = null;\r\n  var __fetch = null;\r\n  var imparterTags = [ohledger.tag, ohledger_social.tag, btc_manual.tag];\r\n\r\n  /**\r\n   * Function to fire events.\r\n   * \r\n   * @param {string} which - event name to fire\r\n   * @param {Object} params - to copy to event\r\n   */\r\n  function fire(which, params) {\r\n    let event = document.createEvent(\"Event\");\r\n    event.initEvent(which, true, true);\r\n    for (var param in params) {\r\n      event[param] = params[param];\r\n    }\r\n    oh$.dispatchEvent(event);\r\n  }\r\n\r\n  /**\r\n   * @param {string} tag -- to add to `imparterTags` if not in `imparterTags`\r\n   */\r\n  function addTag(tag) {\r\n    let imparterTagIndex = imparterTags.findIndex(v => v === tag);\r\n    if (imparterTagIndex == -1) imparterTags.push(tag);\r\n  }\r\n\r\n  /**\r\n   * @param {string} tag -- to remove from `imparterTags` if in `imparterTags`\r\n   */\r\n   function removeTag(tag) {\r\n    let imparterTagIndex = imparterTags.findIndex(v => v === tag);\r\n    if (imparterTagIndex > -1) imparterTags.splice(imparterTagIndex, 1);\r\n  }\r\n\r\n  const domFns = new dom_fns();\r\n  const web3Wallet = new web3_wallet(\r\n      (tag) => addTag(tag), \r\n      (tag) => removeTag(tag),\r\n      (which, params) => fire(which, params));\r\n  const overhideWallet = new overhide_wallet(domFns);\r\n\r\n  const imparters = {};\r\n  imparters[eth_web3.tag] = new eth_web3(\r\n    web3Wallet, \r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params));\r\n  imparters[btc_manual.tag] = new btc_manual(\r\n    domFns,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params));\r\n  imparters[ohledger_web3.tag] = new ohledger_web3(\r\n    overhideWallet,\r\n    web3Wallet,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params)\r\n  );\r\n  imparters[ohledger.tag] = new ohledger(\r\n    overhideWallet,\r\n    web3Wallet,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params)\r\n  );\r\n  imparters[ohledger_social.tag] = new ohledger_social(\r\n    domFns,\r\n    overhideWallet,\r\n    web3Wallet,\r\n    () => token,\r\n    (...args) => __fetch(...args),\r\n    (which, params) => fire(which, params)\r\n  );\r\n\r\n  domFns.init();\r\n  web3Wallet.init();\r\n  overhideWallet.init();\r\n\r\n  function enable(_token, {fetcher} = {fetcher: fetch}) {\r\n    token = _token;\r\n    __fetch = fetcher;\r\n    doEnable(true);\r\n  }\r\n\r\n  function getImparterTags() {\r\n    return imparterTags;\r\n  }\r\n\r\n  function canSetCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canSetCredentials();\r\n  }\r\n\r\n  function canGenerateCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canGenerateCredentials();\r\n  }\r\n\r\n  function canChangeNetwork(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].canChangeNetwork();\r\n  }\r\n\r\n  async function setCredentials(imparterTag, credentials) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    \r\n    return imparters[imparterTag].setCredentials(credentials);\r\n  }\r\n\r\n  function getCredentials(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getCredentials();\r\n  }\r\n\r\n  async function generateCredentials(imparterTag, options) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].generateCredentials(options);\r\n  }\r\n\r\n  async function setNetwork(imparterTag, details) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].setNetwork(details);\r\n  }\r\n\r\n  function getNetwork(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getNetwork();    \r\n  }\r\n\r\n  function getOverhideRemunerationAPIUri(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n\r\n    return imparters[imparterTag].getOverhideRemunerationAPIUri();    \r\n  }\r\n\r\n  async function getFromDollars(imparterTag, dollarAmount) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].getFromDollars(dollarAmount);\r\n  }\r\n\r\n  async function getTallyDollars(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, true, true));\r\n  }\r\n\r\n  async function getTally(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, true, false));\r\n  }\r\n\r\n  async function getTransactions(imparterTag, recipient, date) {\r\n    return (await getTxs(imparterTag, recipient, date, false, false));\r\n  }\r\n\r\n  async function getTxs(imparterTag, recipient, date, tallyOnly, tallyDollars) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].getTxs(recipient, date, tallyOnly, tallyDollars);\r\n  }\r\n\r\n  async function isOnLedger(imparterTag) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].isOnLedger();\r\n  }\r\n\r\n  async function sign(imparterTag, message) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].sign(message);\r\n  }\r\n\r\n  async function createTransaction(imparterTag, amount, to, options) {\r\n    if (!imparterTag in imparters) throw new Error(\"invalid imparterTag\");\r\n    if (await isEnabled && !__fetch) throw new Error('did you forget to `oh$.enable(..)`?');\r\n\r\n    return await imparters[imparterTag].createTransaction(amount, to, options);\r\n  }\r\n\r\n  return root.oh$;\r\n})();\r\n\r\nexport default oh$;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/package.json b/package.json
index da95368..22987e0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ledgers.js",
-  "version": "4.3.0",
+  "version": "4.4.0",
   "description": "JavaScript library for ledger-based authorizations :: abstracting different ledgers to be used in an application's authentication and authorization workflows.",
   "engines": {
     "node": ">=10.13.0"
diff --git a/src/imparters/ohledger-social.js b/src/imparters/ohledger-social.js
index d3cf37a..9899c38 100644
--- a/src/imparters/ohledger-social.js
+++ b/src/imparters/ohledger-social.js
@@ -120,15 +120,15 @@ class ohledger_social {
       const res = this.eth_accounts.create();
       const karnet = res.privateKey;
       this.domFns.hideAllPopupContents();
-      this.domFns.setFrame(`http://localhost:8120/pending`, 30, 10);
+      this.domFns.setFrame(`https://social.overhide.io/pending`, 30, 10);
       const popupPromise = this.domFns.makePopupVisible();     
       window.open(
-        `https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=http%3A%2F%2Flocalhost:8120%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`,
+        `https://overhide.b2clogin.com/overhide.onmicrosoft.com/B2C_1_${this.social}/oauth2/v2.0/authorize?client_id=aa71ffc7-2884-4045-898f-7db3a177c1a1&response_type=code&redirect_uri=https%3A%2F%2Fsocial.overhide.io%2Fredirect/${this.social}&response_mode=query&scope=aa71ffc7-2884-4045-898f-7db3a177c1a1&state=${karnet}`,
         '_blank',
         {height: 300, width: 300}
       );
       await popupPromise;
-      return await this.__fetch(`http://localhost:8120/sign?karnet=${karnet}&message=${btoa(message)}`, {
+      return await this.__fetch(`https://social.overhide.io/sign?karnet=${karnet}&message=${btoa(message)}`, {
         method: "GET",
         headers: { 
           'Content-Type': 'application/json; charset=utf-8',