Repository: ecadlabs/taquito
Pull request #1438 (2022-03-04 03:27:09)

feat(estimate): fix estimate to work with wallet
Estimation is done with the configured signer. If there is no configured signer, estimation is done
using the public key hash of the configured wallet. Taquito does not have access to the public key
of the wallet (only the pkh), so won't estimate reveal operation. If the account is unrevealed, an
exception is throwned.

re #1387

Thank you for your contribution to Taquito.

Before submitting this PR, please make sure:

- [ ] Your code builds cleanly without any errors or warnings
- [ ] You have added unit tests
- [ ] You have added integration tests (if relevant/appropriate)
- [ ] All public methods or types have TypeDoc coverage with a complete description, and ideally an @example
- [ ] You have added or updated corresponding documentation
- [ ] If relevant, you have written a first draft summary describing the change for inclusion in Release Notes. 

## Release Note Draft Snippet

__If relevant, please write a summary of your change that will be suitable for
inclusion in the Release Notes for the next Taquito release.__



Patch:
diff --git a/docs/beaconwallet-singleton.md b/docs/beaconwallet-singleton.md
new file mode 100644
index 000000000..e21efe561
--- /dev/null
+++ b/docs/beaconwallet-singleton.md
@@ -0,0 +1,289 @@
+---
+title: BeaconWallet singleton
+author: Claude Barde
+---
+
+# How to use a single instance of the BeaconWallet?
+
+> TL;DR: in order to avoid unexpected problems with the Beacon wallet instance, there should be only one __new BeaconWallet(options)__ in your whole app.
+
+The `@taquito/beacon-wallet` package is a wrapper for the `Beacon SDK`. The Beacon SDK creates a peer-to-peer connection that must stay unique. If you try to create multiple instances of the Beacon wallet, you may encounter the following error: `[BEACON] It looks like you created multiple Beacon SDK Client instances. This can lead to problems. Only create one instance and re-use it everywhere`, encouraging you to keep a single instance of the Beacon wallet.  
+
+In modern JavaScript frameworks, this can be achieved by passing the instance to the components through their props or by keeping the instance in the context (or state) of the dapp so that every component has access to the same instance.  
+
+This is how this can be accomplished with 3 of the main JavaScript frameworks, [React](https://reactjs.org/), [Vue](https://vuejs.org/) and [Svelte](https://svelte.dev/).
+
+## With React
+### - Using "prop drilling"
+It is possible to create a single instance of the `BeaconWallet` in one of the parent components and pass it down to its child components. This method can be preferred when there aren't many components down the tree. It becomes difficult to track when the instance is passed to many components and their props become redundant.  
+   
+Example:
+```ts
+const ParentComponent = () => {
+    const [wallet, setWallet] = useState(new BeaconWallet(options));
+    
+    return <>
+            <ChildComponent wallet={wallet} />
+            <div wallet={wallet} />
+        </>
+}
+    
+const ChildComponent = ({wallet}) => {
+    // component code
+    
+    return <>
+            <OtherComponent wallet={wallet} />
+            <OtherComponent wallet={wallet} />
+            <OtherComponent wallet={wallet} />
+        </>
+}
+    
+const OtherComponent = ({wallet}) => {
+    useEffect(() => {
+        if(wallet.getActiveAccount()){
+            ...
+        }
+    }, [])
+}
+```
+
+### - Using the Context API and useContext
+The Context API is the recommended way to set up the instance of the `BeaconWallet` as it ensures that a single instance is created and used by the different components of the application.  
+
+Example:
+```ts
+const Context = React.createContext(undefined);
+
+const ParentComponent = () => {
+    const [wallet, setWallet] = useState(new BeaconWallet(options));   
+    
+    return (
+        <Context.Provider value={wallet}>
+            <ChildComponent />
+            <div />
+        </Context.Provider>
+    )
+}
+
+const ChildComponent = () => {
+    // component code
+    
+    return <>
+            <OtherComponent />
+            <OtherComponent />
+            <OtherComponent />
+        </>
+}
+    
+const OtherComponent = () => {
+    const context = useContext(Context);
+    
+    useEffect(() => {
+        if(context.wallet.getActiveAccount()){
+            ...
+        }
+    }, [])
+}
+```
+
+## With Vue
+### - Passing the instance through props
+It is possible to do "prop drilling" in Vue and pass an instance of the `BeaconWallet` down to the children of a component. This method requires updating the value returned by the `data` method and catching the prop in the `props` array of the child component:
+```ts
+// In ParentComponent.vue
+<script>
+import ChildComponent from "./ChildComponent.vue";
+
+export default {
+    data() {
+        const wallet = new BeaconWallet(options);
+        
+        return {
+          wallet
+        }
+    },
+    components: { ChildComponent },
+}
+</script>
+
+<template>
+  <ChildComponent :wallet="wallet" />
+</template>
+```
+```ts
+// In ChildComponent.vue
+<script>
+import OtherComponent from "./OtherComponent.vue";
+
+export default {
+    data() {
+        return {
+          wallet
+        }
+    },
+    components: { OtherComponent },
+    props: ["wallet"]
+}
+</script>
+
+<template>
+  <OtherComponent :wallet="wallet" />
+  <OtherComponent :wallet="wallet" />
+  <OtherComponent :wallet="wallet" />
+</template>
+```
+```ts
+// In OtherComponent.vue
+<script>
+export default {
+    data() {
+        ...
+    },
+    props: ["wallet"],
+    mounted() {
+        if(wallet.getActiveAccount()){
+            ...
+        }
+    }
+}
+</script>
+
+<template>
+  ...
+</template>
+```
+
+### - Using Vuex
+If you want to be sure that all your components access a single instance of the `BeaconWallet`, the best solution is to use a store provided by `Vuex`. After creating the store, all your components can connect to the new store and access the instance of the `BeaconWallet`:
+```ts
+// In store.vue
+import { createApp } from 'vue'
+import { createStore } from 'vuex'
+
+// Create a new store instance.
+const store = createStore({
+  state () {
+    return {
+      wallet: new BeaconWallet(options)
+    }
+  },
+  mutations: {
+    ...
+  }
+})
+
+const app = createApp({ /* your root component */ })
+
+app.use(store)
+```
+```ts
+// In your component
+<script>
+export default {
+    data() {
+        ...
+    },
+    mounted() {
+        if(this.$store.state.wallet.getActiveAccount()){
+            ...
+        }
+    }
+}
+</script>
+
+<template>
+  ...
+</template>
+```
+
+## With Svelte
+### - Passing the instance through props
+Just like React and Vue, it is possible with Svelte to pass the instance through component props.  
+
+Example:
+```ts
+// In ParentComponent.svelte
+<script>
+    import ChildComponent from "./ChildComponent.svelte";
+
+    let wallet;
+
+    onMount(() => {
+        wallet = new BeaconWallet(options);
+    })
+</script>
+
+<ChildComponent {wallet} />
+```
+```ts
+// In ChildComponent.svelte
+<script>
+    import OtherComponent from "./OtherComponent.svelte";
+
+    export let wallet;
+</script>
+
+<OtherComponent {wallet} />
+<OtherComponent {wallet} />
+<OtherComponent {wallet} />
+```
+```ts
+// In OtherComponent.svelte
+<script>
+    import {onMount} from "svelte";
+
+    export let wallet;
+
+    onMount(() => {
+        if(wallet.getActiveAccount()){
+            ...
+        }
+    })
+</script>
+
+<div>Something</div>
+```
+
+### - Using a store
+A Svelte store is the recommended way to store and use an instance of the `BeaconWallet`. You just need to import the store in the components that need access to the instance and you can be sure you have a single instance:  
+
+Example:
+```ts
+// In store.ts
+import { writable } from "svelte/store";
+
+const wallet = new BeaconWallet(options);
+
+const store = writable(wallet);
+
+const state = {
+  subscribe: store.subscribe,
+  updateWallet: (wallet: BeaconWallet) =>
+    store.update(store => wallet)
+}
+
+export default state;
+```
+```ts
+// In ChildComponent.svelte
+<script lang="ts">
+    import OtherComponent from "./OtherComponent.svelte";
+</script>
+
+<OtherComponent />
+```
+```ts
+// In OtherComponent.svelte
+<script lang="ts">
+    import {onMount} from "svelte";
+    import wallet from "./store.ts"
+
+    onMount(() => {
+        if(wallet.getActiveAccount()){
+            ...
+        }
+    })
+</script>
+
+<div>Something</div>
+```
\ No newline at end of file
diff --git a/docs/estimate.md b/docs/estimate.md
index 62e01190b..a1d0f4b7b 100644
--- a/docs/estimate.md
+++ b/docs/estimate.md
@@ -27,6 +27,14 @@ Taquito's estimate method can be used to estimate fees, gas, and storage associa
 
 The following example shows an estimate of the fees associated with transferring 2ꜩ to `tz1h3rQ8wBxFd8L9B3d7Jhaawu6Z568XU3xY` address. The configuration of the signer is to use a throw-away private key for demonstration purposes.
 
+<Tabs
+defaultValue="signer"
+values={[
+{label: 'Signer', value: 'signer'},
+{label: 'Wallet', value: 'wallet'}
+]}>
+<TabItem value="signer">
+
 ```js live noInline
 // import { TezosToolkit } from '@taquito/taquito';
 // const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
@@ -49,10 +57,47 @@ Tezos.estimate
   .catch((error) => console.table(`Error: ${JSON.stringify(error, null, 2)}`));
 ```
 
+</TabItem>
+  <TabItem value="wallet"> 
+
+```js live noInline wallet
+// import { TezosToolkit } from '@taquito/taquito';
+// const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
+
+const amount = 2;
+const address = 'tz1h3rQ8wBxFd8L9B3d7Jhaawu6Z568XU3xY';
+
+println(`Estimating the transfer of ${amount} ꜩ to ${address} : `);
+Tezos.estimate
+  .transfer({ to: address, amount: amount })
+  .then((est) => {
+    println(`burnFeeMutez : ${est.burnFeeMutez}, 
+    gasLimit : ${est.gasLimit}, 
+    minimalFeeMutez : ${est.minimalFeeMutez}, 
+    storageLimit : ${est.storageLimit}, 
+    suggestedFeeMutez : ${est.suggestedFeeMutez}, 
+    totalCost : ${est.totalCost}, 
+    usingBaseFeeMutez : ${est.usingBaseFeeMutez}`);
+  })
+  .catch((error) => console.table(`Error: ${JSON.stringify(error, null, 2)}`));
+``` 
+
+  </TabItem>
+</Tabs>
+
+
 ### Estimate a smart contract call
 
 This example will demonstrate how to estimate the fees related to calling a smart contract. The Ligo source code for the smart contract used in this example is at [Ligo Web IDE](https://ide.ligolang.org/p/N2QTykOAXBkXmiKcRCyg3Q).
 
+<Tabs
+defaultValue="signer"
+values={[
+{label: 'Signer', value: 'signer'},
+{label: 'Wallet', value: 'wallet'}
+]}>
+<TabItem value="signer">
+
 ```js live noInline
 // import { TezosToolkit } from '@taquito/taquito';
 // const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
@@ -78,10 +123,53 @@ Tezos.contract
   })
   .catch((error) => console.table(`Error: ${JSON.stringify(error, null, 2)}`));
 ```
+
+
+</TabItem>
+  <TabItem value="wallet"> 
+
+```js live noInline wallet
+// import { TezosToolkit } from '@taquito/taquito';
+// const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
+
+Tezos.wallet
+  .at('KT1NcdpzokZQY4sLmCBUwLnMHQCCQ6rRXYwS')
+  .then((contract) => {
+    const i = 7;
+    return contract.methods.increment(i).toTransferParams({});
+  })
+  .then((op) => {
+    println(`Estimating the smart contract call : `);
+    return Tezos.estimate.transfer(op);
+  })
+  .then((est) => {
+    println(`burnFeeMutez : ${est.burnFeeMutez}, 
+    gasLimit : ${est.gasLimit}, 
+    minimalFeeMutez : ${est.minimalFeeMutez}, 
+    storageLimit : ${est.storageLimit}, 
+    suggestedFeeMutez : ${est.suggestedFeeMutez}, 
+    totalCost : ${est.totalCost}, 
+    usingBaseFeeMutez : ${est.usingBaseFeeMutez}`);
+  })
+  .catch((error) => console.table(`Error: ${JSON.stringify(error, null, 2)}`));
+```
+
+  </TabItem>
+</Tabs>
+
+
 ### Estimate a contract origination
 
 In this example, we will use the estimate method of Taquito on a contract origination. The `genericMultisigJSONfile` variable contains a Michelson Smart Contract.
 
+<Tabs
+defaultValue="signer"
+values={[
+{label: 'Signer', value: 'signer'},
+{label: 'Wallet', value: 'wallet'}
+]}>
+<TabItem value="signer">
+
 ```js live noInline
 // import { TezosToolkit } from '@taquito/taquito';
 // const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
@@ -107,3 +195,36 @@ Tezos.estimate
   })
   .catch((error) => println(`Error: ${JSON.stringify(error, null, 2)}`));
 ```
+
+</TabItem>
+  <TabItem value="wallet"> 
+
+
+```js live noInline wallet
+// import { TezosToolkit } from '@taquito/taquito';
+// const Tezos = new TezosToolkit('https://hangzhounet.api.tez.ie');
+
+println(`Estimating the contract origination : `);
+Tezos.estimate
+  .originate({
+    code: genericMultisigJSONfile,
+    storage: {
+      stored_counter: 0,
+      threshold: 1,
+      keys: ['edpkuLxx9PQD8fZ45eUzrK3BhfDZJHhBuK4Zi49DcEGANwd2rpX82t'],
+    },
+  })
+  .then((originationOp) => {
+    println(`burnFeeMutez : ${originationOp.burnFeeMutez},
+    gasLimit : ${originationOp.gasLimit},
+    minimalFeeMutez : ${originationOp.minimalFeeMutez},
+    storageLimit : ${originationOp.storageLimit},
+    suggestedFeeMutez : ${originationOp.suggestedFeeMutez},
+    totalCost : ${originationOp.totalCost},
+    usingBaseFeeMutez : ${originationOp.usingBaseFeeMutez}`);
+  })
+  .catch((error) => println(`Error: ${JSON.stringify(error, null, 2)}`));
+```  
+
+  </TabItem>
+</Tabs>
\ No newline at end of file
diff --git a/docs/tezos_domains.md b/docs/tezos_domains.md
index b0afac674..e783465b5 100644
--- a/docs/tezos_domains.md
+++ b/docs/tezos_domains.md
@@ -18,11 +18,11 @@ If you have an address and you want to find the domain tied to it, the storage o
 import { TezosToolkit } from "@taquito/taquito";
 import { bytes2Char } from "@taquito/utils";
 
-const domainContractAddress = "KT1PfBfkfUuvQRN8zuCAyp5MHjNrQqgevS9p";
+const domainContractAddress = "KT1GBZmSxmnKJXGMdMLbugPfLyUPmuLSMwKS";
 
 // the function returns the domain name if found or the provided address
 const fetchTezosDomainFromAddress = async (address: string): Promise<string> => {
-    const Tezos = new TezosToolkit("https://testnet-tezos.giganode.io");
+    const Tezos = new TezosToolkit("https://mainnet.api.tez.ie");
     const contract = await Tezos.wallet.at(domainContractAddress);
     const storage: any = await contract.storage();
     const domain = await storage.store.reverse_records.get(address);
@@ -39,7 +39,7 @@ const fetchTezosDomainFromAddress = async (address: string): Promise<string> =>
 - the `reverse_records` bigmap is nested inside the `store` property
 - the domain name is stored as bytes, so you can use the `bytes2Char` function from `@taquito/utils` to decode it as a string.
 
-If we call the `fetchTezosDomainFromAddress` function with `tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb`, it will return `alice-tezos.flo`.
+If we call the `fetchTezosDomainFromAddress` function with `tz1aauXT4uM8ZB3ouu5JrAenEMQdqfvDUSNH`, it will return `taquito.tez`.
 
 ## Looking up a Tezos domain
 
@@ -49,11 +49,11 @@ It is also possible to look up a domain name to find the address it references.
 import { TezosToolkit } from "@taquito/taquito";
 import { char2Bytes } from "@taquito/utils";
 
-const contractAddress = "KT1PfBfkfUuvQRN8zuCAyp5MHjNrQqgevS9p";
+const contractAddress = "KT1GBZmSxmnKJXGMdMLbugPfLyUPmuLSMwKS";
 
 // the function returns the address if found or the provided domain name
 const fetchAddressFromTezosDomain = async (domainName: string): Promise<string> => {
-    const Tezos = new TezosToolkit("https://testnet-tezos.giganode.io");
+    const Tezos = new TezosToolkit("https://mainnet.api.tez.ie");
     const contract = await Tezos.wallet.at(contractAddress);
     const storage: any = await contract.storage();
     const domain = await storage.store.records.get(char2Bytes(domainName));
@@ -77,11 +77,11 @@ To find the expiry date, you can check the `expiry_map` bigmap under the `store`
 import { TezosToolkit } from "@taquito/taquito";
 import { char2Bytes } from "@taquito/utils";
 
-const contractAddress = "KT1PfBfkfUuvQRN8zuCAyp5MHjNrQqgevS9p";
+const contractAddress = "KT1GBZmSxmnKJXGMdMLbugPfLyUPmuLSMwKS";
 
 // this function return the expiry date of a domain name
 const fetchExpiryDate = async (domainName: string): Promise<string> => {
-    const Tezos = new TezosToolkit("https://testnet-tezos.giganode.io");
+    const Tezos = new TezosToolkit("https://mainnet.api.tez.ie");
     const contract = await Tezos.wallet.at(contractAddress);
     const storage: any = await contract.storage();
     const expiryDate = await storage.store.expiry_map.get(char2Bytes(domainName));
@@ -93,4 +93,4 @@ const fetchExpiryDate = async (domainName: string): Promise<string> => {
 }
 ```
 
-If you provide `alice-tezos.flo` as a parameter, the function will return `2022-06-09T09:06:20Z`, meaning that the domain name expires in June 9th, 2022.
\ No newline at end of file
+If you provide `taquito.tez` as a parameter, the function will return `2022-04-30T00:00:00Z`, meaning that the domain name expires in June 9th, 2022.
\ No newline at end of file
diff --git a/packages/taquito/src/context.ts b/packages/taquito/src/context.ts
index 5ebb14514..f828c2690 100644
--- a/packages/taquito/src/context.ts
+++ b/packages/taquito/src/context.ts
@@ -208,6 +208,10 @@ export class Context {
     }
   }
 
+  isAnySignerConfigured() {
+    return !(this.signer instanceof NoopSigner);
+  }
+
   /**
    * @description Create a copy of the current context. Useful when you have long running operation and you do not want a context change to affect the operation
    */
diff --git a/packages/taquito/src/estimate/error.ts b/packages/taquito/src/estimate/error.ts
new file mode 100644
index 000000000..cc7975fa6
--- /dev/null
+++ b/packages/taquito/src/estimate/error.ts
@@ -0,0 +1,6 @@
+export class RevealEstimateError extends Error {
+  name = 'Reveal Estimate Error';
+  constructor() {
+    super('Unable to estimate the reveal operation, the public key is unknown');
+  }
+}
diff --git a/packages/taquito/src/estimate/index.ts b/packages/taquito/src/estimate/index.ts
index 03cebd867..59eedcbfb 100644
--- a/packages/taquito/src/estimate/index.ts
+++ b/packages/taquito/src/estimate/index.ts
@@ -2,3 +2,4 @@ export * from './estimate';
 export * from './estimate-provider-interface';
 export * from './naive-estimate-provider';
 export * from './rpc-estimate-provider';
+export * from './error';
diff --git a/packages/taquito/src/estimate/rpc-estimate-provider.ts b/packages/taquito/src/estimate/rpc-estimate-provider.ts
index 5a11c90d9..ef410ef67 100644
--- a/packages/taquito/src/estimate/rpc-estimate-provider.ts
+++ b/packages/taquito/src/estimate/rpc-estimate-provider.ts
@@ -30,6 +30,7 @@ import {
   createRegisterGlobalConstantOperation,
 } from '../contract/prepare';
 import { validateAddress, InvalidAddressError, ValidationResult } from '@taquito/utils';
+import { RevealEstimateError } from './error';
 
 interface Limits {
   fee?: number;
@@ -63,6 +64,19 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
   private readonly ORIGINATION_STORAGE = 257;
   private readonly OP_SIZE_REVEAL = 128;
 
+  private async getKeys(): Promise<{
+    publicKeyHash: string;
+    publicKey?: string;
+  }> {
+    const isSignerConfigured = this.context.isAnySignerConfigured();
+    return {
+      publicKeyHash: isSignerConfigured
+        ? await this.signer.publicKeyHash()
+        : await this.context.walletProvider.getPKH(),
+      publicKey: isSignerConfigured ? await this.signer.publicKey() : undefined,
+    };
+  }
+
   // Maximum values defined by the protocol
   private async getAccountLimits(
     pkh: string,
@@ -161,9 +175,10 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
 
   private async prepareEstimate(
     params: PrepareOperationParams,
-    constants: Pick<ConstantsResponse, 'cost_per_byte'>
+    constants: Pick<ConstantsResponse, 'cost_per_byte'>,
+    pkh: string
   ) {
-    const prepared = await this.prepareOperation(params);
+    const prepared = await this.prepareOperation(params, pkh);
     const {
       opbytes,
       opOb: { branch, contents },
@@ -209,20 +224,21 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
    * @param OriginationOperation Originate operation parameter
    */
   async originate({ fee, storageLimit, gasLimit, ...rest }: OriginateParams) {
-    const pkh = await this.signer.publicKeyHash();
+    const { publicKeyHash } = await this.getKeys();
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
-    const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants);
+    const DEFAULT_PARAMS = await this.getAccountLimits(publicKeyHash, protocolConstants);
     const op = await createOriginationOperation(
       await this.context.parser.prepareCodeOrigination({
         ...rest,
         ...mergeLimits({ fee, storageLimit, gasLimit }, DEFAULT_PARAMS),
       })
     );
-    const isRevealNeeded = await this.isRevealOpNeeded([op], pkh);
-    const ops = isRevealNeeded ? await this.addRevealOp([op], pkh) : op;
+    const isRevealNeeded = await this.isRevealOpNeeded([op], publicKeyHash);
+    const ops = isRevealNeeded ? await this.addRevealOp([op], publicKeyHash) : op;
     const estimateProperties = await this.prepareEstimate(
-      { operation: ops, source: pkh },
-      protocolConstants
+      { operation: ops, source: publicKeyHash },
+      protocolConstants,
+      publicKeyHash
     );
     if (isRevealNeeded) {
       estimateProperties.shift();
@@ -244,7 +260,7 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     if (rest.source && validateAddress(rest.source) !== ValidationResult.VALID) {
       throw new InvalidAddressError(`Invalid 'source' address: ${rest.source}`);
     }
-    const pkh = await this.signer.publicKeyHash();
+    const pkh = (await this.getKeys()).publicKeyHash;
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
     const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants);
     const op = await createTransferOperation({
@@ -255,7 +271,8 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     const ops = isRevealNeeded ? await this.addRevealOp([op], pkh) : op;
     const estimateProperties = await this.prepareEstimate(
       { operation: ops, source: pkh },
-      protocolConstants
+      protocolConstants,
+      pkh
     );
     if (isRevealNeeded) {
       estimateProperties.shift();
@@ -279,7 +296,7 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
       throw new InvalidAddressError(`Invalid delegate address: ${rest.delegate}`);
     }
 
-    const pkh = await this.signer.publicKeyHash();
+    const pkh = (await this.getKeys()).publicKeyHash;
     const sourceOrDefault = rest.source || pkh;
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
     const DEFAULT_PARAMS = await this.getAccountLimits(sourceOrDefault, protocolConstants);
@@ -291,7 +308,8 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     const ops = isRevealNeeded ? await this.addRevealOp([op], pkh) : op;
     const estimateProperties = await this.prepareEstimate(
       { operation: ops, source: pkh },
-      protocolConstants
+      protocolConstants,
+      pkh
     );
     if (isRevealNeeded) {
       estimateProperties.shift();
@@ -306,10 +324,14 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
    * @returns An array of Estimate objects. If a reveal operation is needed, the first element of the array is the Estimate for the reveal operation.
    */
   async batch(params: ParamsWithKind[]) {
-    const pkh = await this.signer.publicKeyHash();
+    const { publicKeyHash } = await this.getKeys();
     let operations: RPCOperation[] = [];
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
-    const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants, params.length);
+    const DEFAULT_PARAMS = await this.getAccountLimits(
+      publicKeyHash,
+      protocolConstants,
+      params.length
+    );
     for (const param of params) {
       switch (param.kind) {
         case OpKind.TRANSACTION:
@@ -356,11 +378,12 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
           throw new Error(`Unsupported operation kind: ${(param as any).kind}`);
       }
     }
-    const isRevealNeeded = await this.isRevealOpNeeded(operations, pkh);
-    operations = isRevealNeeded ? await this.addRevealOp(operations, pkh) : operations;
+    const isRevealNeeded = await this.isRevealOpNeeded(operations, publicKeyHash);
+    operations = isRevealNeeded ? await this.addRevealOp(operations, publicKeyHash) : operations;
     const estimateProperties = await this.prepareEstimate(
-      { operation: operations, source: pkh },
-      protocolConstants
+      { operation: operations, source: publicKeyHash },
+      protocolConstants,
+      publicKeyHash
     );
 
     return Estimate.createArrayEstimateInstancesFromProperties(estimateProperties);
@@ -375,7 +398,7 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
    * @param Estimate
    */
   async registerDelegate(params: RegisterDelegateParams) {
-    const pkh = await this.signer.publicKeyHash();
+    const pkh = (await this.getKeys()).publicKeyHash;
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
     const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants);
     const op = await createRegisterDelegateOperation({ ...params, ...DEFAULT_PARAMS }, pkh);
@@ -383,7 +406,8 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     const ops = isRevealNeeded ? await this.addRevealOp([op], pkh) : op;
     const estimateProperties = await this.prepareEstimate(
       { operation: ops, source: pkh },
-      protocolConstants
+      protocolConstants,
+      pkh
     );
     if (isRevealNeeded) {
       estimateProperties.shift();
@@ -400,21 +424,25 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
    * @param Estimate
    */
   async reveal(params?: RevealParams) {
-    const pkh = await this.signer.publicKeyHash();
-    if (await this.isAccountRevealRequired(pkh)) {
+    const { publicKeyHash, publicKey } = await this.getKeys();
+    if (!publicKey) {
+      throw new RevealEstimateError();
+    }
+    if (await this.isAccountRevealRequired(publicKeyHash)) {
       const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
-      const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants);
+      const DEFAULT_PARAMS = await this.getAccountLimits(publicKeyHash, protocolConstants);
       const op = await createRevealOperation(
         {
           ...params,
           ...DEFAULT_PARAMS,
         },
-        pkh,
-        await this.signer.publicKey()
+        publicKeyHash,
+        publicKey
       );
       const estimateProperties = await this.prepareEstimate(
-        { operation: op, source: pkh },
-        protocolConstants
+        { operation: op, source: publicKeyHash },
+        protocolConstants,
+        publicKeyHash
       );
       return Estimate.createEstimateInstanceFromProperties(estimateProperties);
     }
@@ -434,7 +462,7 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     gasLimit,
     ...rest
   }: RegisterGlobalConstantParams) {
-    const pkh = await this.signer.publicKeyHash();
+    const pkh = (await this.getKeys()).publicKeyHash;
     const protocolConstants = await this.context.readProvider.getProtocolConstants('head');
     const DEFAULT_PARAMS = await this.getAccountLimits(pkh, protocolConstants);
     const op = await createRegisterGlobalConstantOperation({
@@ -445,7 +473,8 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
     const ops = isRevealNeeded ? await this.addRevealOp([op], pkh) : op;
     const estimateProperties = await this.prepareEstimate(
       { operation: ops, source: pkh },
-      protocolConstants
+      protocolConstants,
+      pkh
     );
     if (isRevealNeeded) {
       estimateProperties.shift();
@@ -454,6 +483,10 @@ export class RPCEstimateProvider extends OperationEmitter implements EstimationP
   }
 
   private async addRevealOp(op: RPCOperation[], pkh: string) {
+    const { publicKey } = await this.getKeys();
+    if (!publicKey) {
+      throw new RevealEstimateError();
+    }
     op.unshift(
       await createRevealOperation(
         {
diff --git a/packages/taquito/src/operations/operation-emitter.ts b/packages/taquito/src/operations/operation-emitter.ts
index 140c1015b..9187a53fe 100644
--- a/packages/taquito/src/operations/operation-emitter.ts
+++ b/packages/taquito/src/operations/operation-emitter.ts
@@ -60,10 +60,10 @@ export abstract class OperationEmitter {
   }
 
   // Originally from sotez (Copyright (c) 2018 Andrew Kishino)
-  protected async prepareOperation({
-    operation,
-    source,
-  }: PrepareOperationParams): Promise<PreparedOperation> {
+  protected async prepareOperation(
+    { operation, source }: PrepareOperationParams,
+    pkh?: string
+  ): Promise<PreparedOperation> {
     const counters: { [key: string]: number } = {};
     let ops: RPCOperation[] = [];
 
@@ -77,7 +77,7 @@ export abstract class OperationEmitter {
     }
 
     // Implicit account who emit the operation
-    const publicKeyHash = await this.signer.publicKeyHash();
+    const publicKeyHash = pkh ? pkh : await this.signer.publicKeyHash();
     let counterPromise: Promise<string | undefined> = Promise.resolve(undefined);
 
     for (let i = 0; i < ops.length; i++) {
diff --git a/website/package-lock.json b/website/package-lock.json
index 8eab179a1..b3bfcd10a 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -30,7 +30,7 @@
         "@taquito/utils": "11.2.0",
         "@thanos-wallet/dapp": "^2.2.2",
         "abort-controller": "^3.0.0",
-        "algoliasearch": "^4.12.0",
+        "algoliasearch": "^4.12.1",
         "axios": "^0.25.0",
         "buffer": "^6.0.3",
         "classnames": "^2.3.1",
@@ -98,118 +98,118 @@
       "integrity": "sha512-bRSkqHHHSwZYbFY3w9hgMyQRm86Wz27bRaGCbNldLfbk0zUjApmE4ajx+ZCVSLqxvcUEjMqZFJzDsder12eKsg=="
     },
     "node_modules/@algolia/cache-browser-local-storage": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.0.tgz",
-      "integrity": "sha512-l+G560B6N1k0rIcOjTO1yCzFUbg2Zy2HCii9s03e13jGgqduVQmk79UUCYszjsJ5GPJpUEKcVEtAIpP7tjsXVA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.1.tgz",
+      "integrity": "sha512-ERFFOnC9740xAkuO0iZTQqm2AzU7Dpz/s+g7o48GlZgx5p9GgNcsuK5eS0GoW/tAK+fnKlizCtlFHNuIWuvfsg==",
       "dependencies": {
-        "@algolia/cache-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1"
       }
     },
     "node_modules/@algolia/cache-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.0.tgz",
-      "integrity": "sha512-2Z8BV+NX7oN7RmmQbLqmW8lfN9aAjOexX1FJjzB0YfKC9ifpi9Jl4nSxlnbU+iLR6QhHo0IfuyQ7wcnucCGCGQ=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.1.tgz",
+      "integrity": "sha512-UugTER3V40jT+e19Dmph5PKMeliYKxycNPwrPNADin0RcWNfT2QksK9Ff2N2W7UKraqMOzoeDb4LAJtxcK1a8Q=="
     },
     "node_modules/@algolia/cache-in-memory": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.0.tgz",
-      "integrity": "sha512-b6ANkZF6vGAo+sYv6g25W5a0u3o6F549gEAgtTDTVA1aHcdWwe/HG/dTJ7NsnHbuR+A831tIwnNYQjRp3/V/Jw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.1.tgz",
+      "integrity": "sha512-U6iaunaxK1lHsAf02UWF58foKFEcrVLsHwN56UkCtwn32nlP9rz52WOcHsgk6TJrL8NDcO5swMjtOQ5XHESFLw==",
       "dependencies": {
-        "@algolia/cache-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1"
       }
     },
     "node_modules/@algolia/client-account": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.0.tgz",
-      "integrity": "sha512-gzXN75ZydNheNXUN3epS+aLsKnB/PHFVlGUUjXL8WHs4lJP3B5FtHvaA/NCN5DsM3aamhuY5p0ff1XIA+Lbcrw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.1.tgz",
+      "integrity": "sha512-jGo4ConJNoMdTCR2zouO0jO/JcJmzOK6crFxMMLvdnB1JhmMbuIKluOTJVlBWeivnmcsqb7r0v7qTCPW5PAyxQ==",
       "dependencies": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/@algolia/client-analytics": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.0.tgz",
-      "integrity": "sha512-rO2cZCt00Opk66QBZb7IBGfCq4ZE3EiuGkXssf2Monb5urujy0r8CknK2i7bzaKtPbd2vlvhmLP4CEHQqF6SLQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.1.tgz",
+      "integrity": "sha512-h1It7KXzIthlhuhfBk7LteYq72tym9maQDUsyRW0Gft8b6ZQahnRak9gcCvKwhcJ1vJoP7T7JrNYGiYSicTD9g==",
       "dependencies": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/@algolia/client-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.0.tgz",
-      "integrity": "sha512-fcrFN7FBmxiSyjeu3sF4OnPkC1l7/8oyQ8RMM8CHpVY8cad6/ay35MrfRfgfqdzdFA8LzcBYO7fykuJv0eOqxw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.1.tgz",
+      "integrity": "sha512-obnJ8eSbv+h94Grk83DTGQ3bqhViSWureV6oK1s21/KMGWbb3DkduHm+lcwFrMFkjSUSzosLBHV9EQUIBvueTw==",
       "dependencies": {
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/@algolia/client-personalization": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.0.tgz",
-      "integrity": "sha512-wCJfSQEmX6ZOuJBJGjy+sbXiW0iy7tMNAhsVMV9RRaJE4727e5WAqwFWZssD877WQ74+/nF/VyTaB1+wejo33Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.1.tgz",
+      "integrity": "sha512-sMSnjjPjRgByGHYygV+5L/E8a6RgU7l2GbpJukSzJ9GRY37tHmBHuvahv8JjdCGJ2p7QDYLnQy5bN5Z02qjc7Q==",
       "dependencies": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/@algolia/client-search": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.0.tgz",
-      "integrity": "sha512-ik6dswcTQtOdZN+8aKntI9X2E6Qpqjtyda/+VANiHThY9GD2PBXuNuuC2HvlF26AbBYp5xaSE/EKxn1DIiIJ4Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.1.tgz",
+      "integrity": "sha512-MwwKKprfY6X2nJ5Ki/ccXM2GDEePvVjZnnoOB2io3dLKW4fTqeSRlC5DRXeFD7UM0vOPPHr4ItV2aj19APKNVQ==",
       "dependencies": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/@algolia/logger-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.0.tgz",
-      "integrity": "sha512-V//9rzLdJujA3iZ/tPhmKR/m2kjSZrymxOfUiF3024u2/7UyOpH92OOCrHUf023uMGYHRzyhBz5ESfL1oCdh7g=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.1.tgz",
+      "integrity": "sha512-fCgrzlXGATNqdFTxwx0GsyPXK+Uqrx1SZ3iuY2VGPPqdt1a20clAG2n2OcLHJpvaa6vMFPlJyWvbqAgzxdxBlQ=="
     },
     "node_modules/@algolia/logger-console": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.0.tgz",
-      "integrity": "sha512-pHvoGv53KXRIJHLk9uxBwKirwEo12G9+uo0sJLWESThAN3v5M+ycliU1AkUXQN8+9rds2KxfULAb+vfyfBKf8A==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.1.tgz",
+      "integrity": "sha512-0owaEnq/davngQMYqxLA4KrhWHiXujQ1CU3FFnyUcMyBR7rGHI48zSOUpqnsAXrMBdSH6rH5BDkSUUFwsh8RkQ==",
       "dependencies": {
-        "@algolia/logger-common": "4.12.0"
+        "@algolia/logger-common": "4.12.1"
       }
     },
     "node_modules/@algolia/requester-browser-xhr": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.0.tgz",
-      "integrity": "sha512-rGlHNMM3jIZBwSpz33CVkeXHilzuzHuFXEEW1icP/k3KW7kwBrKFJwBy42RzAJa5BYlLsTCFTS3xkPhYwTQKLg==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.1.tgz",
+      "integrity": "sha512-OaMxDyG0TZG0oqz1lQh9e3woantAG1bLnuwq3fmypsrQxra4IQZiyn1x+kEb69D2TcXApI5gOgrD4oWhtEVMtw==",
       "dependencies": {
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "node_modules/@algolia/requester-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.0.tgz",
-      "integrity": "sha512-qgfdc73nXqpVyOMr6CMTx3nXvud9dP6GcMGDqPct+fnxogGcJsp24cY2nMqUrAfgmTJe9Nmy7Lddv0FyHjONMg=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.1.tgz",
+      "integrity": "sha512-XWIrWQNJ1vIrSuL/bUk3ZwNMNxl+aWz6dNboRW6+lGTcMIwc3NBFE90ogbZKhNrFRff8zI4qCF15tjW+Fyhpow=="
     },
     "node_modules/@algolia/requester-node-http": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.0.tgz",
-      "integrity": "sha512-mOTRGf/v/dXshBoZKNhMG00ZGxoUH9QdSpuMKYnuWwIgstN24uj3DQx+Ho3c+uq0TYfq7n2v71uoJWuiW32NMQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.1.tgz",
+      "integrity": "sha512-awBtwaD+s0hxkA1aehYn8F0t9wqGoBVWgY4JPHBmp1ChO3pK7RKnnvnv7QQa9vTlllX29oPt/BBVgMo1Z3n1Qg==",
       "dependencies": {
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "node_modules/@algolia/transporter": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.0.tgz",
-      "integrity": "sha512-MOQVHZ4BcBpf3LtOY/3fqXHAcvI8MahrXDHk9QrBE/iGensQhDiZby5Dn3o2JN/zd9FMnVbdPQ8gnkiMwZiakQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.1.tgz",
+      "integrity": "sha512-BGeNgdEHc6dXIk2g8kdlOoQ6fQ6OIaKQcplEj7HPoi+XZUeAvRi3Pff3QWd7YmybWkjzd9AnTzieTASDWhL+sQ==",
       "dependencies": {
-        "@algolia/cache-common": "4.12.0",
-        "@algolia/logger-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1",
+        "@algolia/logger-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "node_modules/@babel/code-frame": {
@@ -4407,24 +4407,24 @@
       }
     },
     "node_modules/algoliasearch": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.0.tgz",
-      "integrity": "sha512-fZOMMm+F3Bi5M/MoFIz7hiuyCitJza0Hu+r8Wzz4LIQClC6YGMRq7kT6NNU1fSSoFDSeJIwMfedbbi5G9dJoVQ==",
-      "dependencies": {
-        "@algolia/cache-browser-local-storage": "4.12.0",
-        "@algolia/cache-common": "4.12.0",
-        "@algolia/cache-in-memory": "4.12.0",
-        "@algolia/client-account": "4.12.0",
-        "@algolia/client-analytics": "4.12.0",
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-personalization": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/logger-common": "4.12.0",
-        "@algolia/logger-console": "4.12.0",
-        "@algolia/requester-browser-xhr": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/requester-node-http": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.1.tgz",
+      "integrity": "sha512-c0dM1g3zZBJrkzE5GA/Nu1y3fFxx3LCzxKzcmp2dgGS8P4CjszB/l3lsSh2MSrrK1Hn/KV4BlbBMXtYgG1Bfrw==",
+      "dependencies": {
+        "@algolia/cache-browser-local-storage": "4.12.1",
+        "@algolia/cache-common": "4.12.1",
+        "@algolia/cache-in-memory": "4.12.1",
+        "@algolia/client-account": "4.12.1",
+        "@algolia/client-analytics": "4.12.1",
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-personalization": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/logger-common": "4.12.1",
+        "@algolia/logger-console": "4.12.1",
+        "@algolia/requester-browser-xhr": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/requester-node-http": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "node_modules/algoliasearch-helper": {
@@ -13925,118 +13925,118 @@
       "integrity": "sha512-bRSkqHHHSwZYbFY3w9hgMyQRm86Wz27bRaGCbNldLfbk0zUjApmE4ajx+ZCVSLqxvcUEjMqZFJzDsder12eKsg=="
     },
     "@algolia/cache-browser-local-storage": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.0.tgz",
-      "integrity": "sha512-l+G560B6N1k0rIcOjTO1yCzFUbg2Zy2HCii9s03e13jGgqduVQmk79UUCYszjsJ5GPJpUEKcVEtAIpP7tjsXVA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.1.tgz",
+      "integrity": "sha512-ERFFOnC9740xAkuO0iZTQqm2AzU7Dpz/s+g7o48GlZgx5p9GgNcsuK5eS0GoW/tAK+fnKlizCtlFHNuIWuvfsg==",
       "requires": {
-        "@algolia/cache-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1"
       }
     },
     "@algolia/cache-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.0.tgz",
-      "integrity": "sha512-2Z8BV+NX7oN7RmmQbLqmW8lfN9aAjOexX1FJjzB0YfKC9ifpi9Jl4nSxlnbU+iLR6QhHo0IfuyQ7wcnucCGCGQ=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.1.tgz",
+      "integrity": "sha512-UugTER3V40jT+e19Dmph5PKMeliYKxycNPwrPNADin0RcWNfT2QksK9Ff2N2W7UKraqMOzoeDb4LAJtxcK1a8Q=="
     },
     "@algolia/cache-in-memory": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.0.tgz",
-      "integrity": "sha512-b6ANkZF6vGAo+sYv6g25W5a0u3o6F549gEAgtTDTVA1aHcdWwe/HG/dTJ7NsnHbuR+A831tIwnNYQjRp3/V/Jw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.1.tgz",
+      "integrity": "sha512-U6iaunaxK1lHsAf02UWF58foKFEcrVLsHwN56UkCtwn32nlP9rz52WOcHsgk6TJrL8NDcO5swMjtOQ5XHESFLw==",
       "requires": {
-        "@algolia/cache-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1"
       }
     },
     "@algolia/client-account": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.0.tgz",
-      "integrity": "sha512-gzXN75ZydNheNXUN3epS+aLsKnB/PHFVlGUUjXL8WHs4lJP3B5FtHvaA/NCN5DsM3aamhuY5p0ff1XIA+Lbcrw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.1.tgz",
+      "integrity": "sha512-jGo4ConJNoMdTCR2zouO0jO/JcJmzOK6crFxMMLvdnB1JhmMbuIKluOTJVlBWeivnmcsqb7r0v7qTCPW5PAyxQ==",
       "requires": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "@algolia/client-analytics": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.0.tgz",
-      "integrity": "sha512-rO2cZCt00Opk66QBZb7IBGfCq4ZE3EiuGkXssf2Monb5urujy0r8CknK2i7bzaKtPbd2vlvhmLP4CEHQqF6SLQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.1.tgz",
+      "integrity": "sha512-h1It7KXzIthlhuhfBk7LteYq72tym9maQDUsyRW0Gft8b6ZQahnRak9gcCvKwhcJ1vJoP7T7JrNYGiYSicTD9g==",
       "requires": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "@algolia/client-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.0.tgz",
-      "integrity": "sha512-fcrFN7FBmxiSyjeu3sF4OnPkC1l7/8oyQ8RMM8CHpVY8cad6/ay35MrfRfgfqdzdFA8LzcBYO7fykuJv0eOqxw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.1.tgz",
+      "integrity": "sha512-obnJ8eSbv+h94Grk83DTGQ3bqhViSWureV6oK1s21/KMGWbb3DkduHm+lcwFrMFkjSUSzosLBHV9EQUIBvueTw==",
       "requires": {
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "@algolia/client-personalization": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.0.tgz",
-      "integrity": "sha512-wCJfSQEmX6ZOuJBJGjy+sbXiW0iy7tMNAhsVMV9RRaJE4727e5WAqwFWZssD877WQ74+/nF/VyTaB1+wejo33Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.1.tgz",
+      "integrity": "sha512-sMSnjjPjRgByGHYygV+5L/E8a6RgU7l2GbpJukSzJ9GRY37tHmBHuvahv8JjdCGJ2p7QDYLnQy5bN5Z02qjc7Q==",
       "requires": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "@algolia/client-search": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.0.tgz",
-      "integrity": "sha512-ik6dswcTQtOdZN+8aKntI9X2E6Qpqjtyda/+VANiHThY9GD2PBXuNuuC2HvlF26AbBYp5xaSE/EKxn1DIiIJ4Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.1.tgz",
+      "integrity": "sha512-MwwKKprfY6X2nJ5Ki/ccXM2GDEePvVjZnnoOB2io3dLKW4fTqeSRlC5DRXeFD7UM0vOPPHr4ItV2aj19APKNVQ==",
       "requires": {
-        "@algolia/client-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+        "@algolia/client-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "@algolia/logger-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.0.tgz",
-      "integrity": "sha512-V//9rzLdJujA3iZ/tPhmKR/m2kjSZrymxOfUiF3024u2/7UyOpH92OOCrHUf023uMGYHRzyhBz5ESfL1oCdh7g=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.1.tgz",
+      "integrity": "sha512-fCgrzlXGATNqdFTxwx0GsyPXK+Uqrx1SZ3iuY2VGPPqdt1a20clAG2n2OcLHJpvaa6vMFPlJyWvbqAgzxdxBlQ=="
     },
     "@algolia/logger-console": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.0.tgz",
-      "integrity": "sha512-pHvoGv53KXRIJHLk9uxBwKirwEo12G9+uo0sJLWESThAN3v5M+ycliU1AkUXQN8+9rds2KxfULAb+vfyfBKf8A==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.1.tgz",
+      "integrity": "sha512-0owaEnq/davngQMYqxLA4KrhWHiXujQ1CU3FFnyUcMyBR7rGHI48zSOUpqnsAXrMBdSH6rH5BDkSUUFwsh8RkQ==",
       "requires": {
-        "@algolia/logger-common": "4.12.0"
+        "@algolia/logger-common": "4.12.1"
       }
     },
     "@algolia/requester-browser-xhr": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.0.tgz",
-      "integrity": "sha512-rGlHNMM3jIZBwSpz33CVkeXHilzuzHuFXEEW1icP/k3KW7kwBrKFJwBy42RzAJa5BYlLsTCFTS3xkPhYwTQKLg==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.1.tgz",
+      "integrity": "sha512-OaMxDyG0TZG0oqz1lQh9e3woantAG1bLnuwq3fmypsrQxra4IQZiyn1x+kEb69D2TcXApI5gOgrD4oWhtEVMtw==",
       "requires": {
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "@algolia/requester-common": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.0.tgz",
-      "integrity": "sha512-qgfdc73nXqpVyOMr6CMTx3nXvud9dP6GcMGDqPct+fnxogGcJsp24cY2nMqUrAfgmTJe9Nmy7Lddv0FyHjONMg=="
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.1.tgz",
+      "integrity": "sha512-XWIrWQNJ1vIrSuL/bUk3ZwNMNxl+aWz6dNboRW6+lGTcMIwc3NBFE90ogbZKhNrFRff8zI4qCF15tjW+Fyhpow=="
     },
     "@algolia/requester-node-http": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.0.tgz",
-      "integrity": "sha512-mOTRGf/v/dXshBoZKNhMG00ZGxoUH9QdSpuMKYnuWwIgstN24uj3DQx+Ho3c+uq0TYfq7n2v71uoJWuiW32NMQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.1.tgz",
+      "integrity": "sha512-awBtwaD+s0hxkA1aehYn8F0t9wqGoBVWgY4JPHBmp1ChO3pK7RKnnvnv7QQa9vTlllX29oPt/BBVgMo1Z3n1Qg==",
       "requires": {
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "@algolia/transporter": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.0.tgz",
-      "integrity": "sha512-MOQVHZ4BcBpf3LtOY/3fqXHAcvI8MahrXDHk9QrBE/iGensQhDiZby5Dn3o2JN/zd9FMnVbdPQ8gnkiMwZiakQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.1.tgz",
+      "integrity": "sha512-BGeNgdEHc6dXIk2g8kdlOoQ6fQ6OIaKQcplEj7HPoi+XZUeAvRi3Pff3QWd7YmybWkjzd9AnTzieTASDWhL+sQ==",
       "requires": {
-        "@algolia/cache-common": "4.12.0",
-        "@algolia/logger-common": "4.12.0",
-        "@algolia/requester-common": "4.12.0"
+        "@algolia/cache-common": "4.12.1",
+        "@algolia/logger-common": "4.12.1",
+        "@algolia/requester-common": "4.12.1"
       }
     },
     "@babel/code-frame": {
@@ -17082,24 +17082,24 @@
       "requires": {}
     },
     "algoliasearch": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.0.tgz",
-      "integrity": "sha512-fZOMMm+F3Bi5M/MoFIz7hiuyCitJza0Hu+r8Wzz4LIQClC6YGMRq7kT6NNU1fSSoFDSeJIwMfedbbi5G9dJoVQ==",
-      "requires": {
-        "@algolia/cache-browser-local-storage": "4.12.0",
-        "@algolia/cache-common": "4.12.0",
-        "@algolia/cache-in-memory": "4.12.0",
-        "@algolia/client-account": "4.12.0",
-        "@algolia/client-analytics": "4.12.0",
-        "@algolia/client-common": "4.12.0",
-        "@algolia/client-personalization": "4.12.0",
-        "@algolia/client-search": "4.12.0",
-        "@algolia/logger-common": "4.12.0",
-        "@algolia/logger-console": "4.12.0",
-        "@algolia/requester-browser-xhr": "4.12.0",
-        "@algolia/requester-common": "4.12.0",
-        "@algolia/requester-node-http": "4.12.0",
-        "@algolia/transporter": "4.12.0"
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.1.tgz",
+      "integrity": "sha512-c0dM1g3zZBJrkzE5GA/Nu1y3fFxx3LCzxKzcmp2dgGS8P4CjszB/l3lsSh2MSrrK1Hn/KV4BlbBMXtYgG1Bfrw==",
+      "requires": {
+        "@algolia/cache-browser-local-storage": "4.12.1",
+        "@algolia/cache-common": "4.12.1",
+        "@algolia/cache-in-memory": "4.12.1",
+        "@algolia/client-account": "4.12.1",
+        "@algolia/client-analytics": "4.12.1",
+        "@algolia/client-common": "4.12.1",
+        "@algolia/client-personalization": "4.12.1",
+        "@algolia/client-search": "4.12.1",
+        "@algolia/logger-common": "4.12.1",
+        "@algolia/logger-console": "4.12.1",
+        "@algolia/requester-browser-xhr": "4.12.1",
+        "@algolia/requester-common": "4.12.1",
+        "@algolia/requester-node-http": "4.12.1",
+        "@algolia/transporter": "4.12.1"
       }
     },
     "algoliasearch-helper": {
diff --git a/website/package.json b/website/package.json
index 3e473fcd5..0b80ba1d2 100644
--- a/website/package.json
+++ b/website/package.json
@@ -41,7 +41,7 @@
     "@taquito/utils": "11.2.0",
     "@thanos-wallet/dapp": "^2.2.2",
     "abort-controller": "^3.0.0",
-    "algoliasearch": "^4.12.0",
+    "algoliasearch": "^4.12.1",
     "axios": "^0.25.0",
     "buffer": "^6.0.3",
     "classnames": "^2.3.1",
diff --git a/website/sidebars.json b/website/sidebars.json
index a4cebc091..d808728dc 100644
--- a/website/sidebars.json
+++ b/website/sidebars.json
@@ -7,6 +7,7 @@
         "quick_start",
         "boilerplate",        
         "batch_API",
+        "beaconwallet-singleton",
         "confirmation_event_stream",
         "set_delegate",
         "dapp_prelaunch",
diff --git a/website/yarn.lock b/website/yarn.lock
index 44a3c003e..39c2b1d11 100644
--- a/website/yarn.lock
+++ b/website/yarn.lock
@@ -2,6 +2,19 @@
 # yarn lockfile v1
 
 
+"@airgap/beacon-sdk@^2.3.9":
+  "integrity" "sha512-vj7NxrwhGBkRQN+yxozisE2m/h1WduFJsMACBzm3g1ctvn9lik4unNjojPjbmkFLv9R2JD/OYyFkz2rYi81lVA=="
+  "resolved" "https://registry.npmjs.org/@airgap/beacon-sdk/-/beacon-sdk-2.3.9.tgz"
+  "version" "2.3.9"
+  dependencies:
+    "@types/chrome" "0.0.115"
+    "@types/libsodium-wrappers" "0.7.7"
+    "axios" "0.21.1"
+    "bignumber.js" "9.0.0"
+    "bs58check" "2.1.2"
+    "libsodium-wrappers" "0.7.8"
+    "qrcode-generator" "1.4.4"
+
 "@algolia/autocomplete-core@1.5.0":
   "integrity" "sha512-E7+VJwcvwMM8vPeaVn7fNUgix8WHV8A1WUeHDi2KHemCaaGc8lvUnP3QnvhMxiDhTe7OpMEv4o2TBUMyDgThaw=="
   "resolved" "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.0.tgz"
@@ -21,109 +34,109 @@
   "resolved" "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.0.tgz"
   "version" "1.5.0"
 
-"@algolia/cache-browser-local-storage@4.12.0":
-  "integrity" "sha512-l+G560B6N1k0rIcOjTO1yCzFUbg2Zy2HCii9s03e13jGgqduVQmk79UUCYszjsJ5GPJpUEKcVEtAIpP7tjsXVA=="
-  "resolved" "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/cache-browser-local-storage@4.12.1":
+  "integrity" "sha512-ERFFOnC9740xAkuO0iZTQqm2AzU7Dpz/s+g7o48GlZgx5p9GgNcsuK5eS0GoW/tAK+fnKlizCtlFHNuIWuvfsg=="
+  "resolved" "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/cache-common" "4.12.0"
+    "@algolia/cache-common" "4.12.1"
 
-"@algolia/cache-common@4.12.0":
-  "integrity" "sha512-2Z8BV+NX7oN7RmmQbLqmW8lfN9aAjOexX1FJjzB0YfKC9ifpi9Jl4nSxlnbU+iLR6QhHo0IfuyQ7wcnucCGCGQ=="
-  "resolved" "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/cache-common@4.12.1":
+  "integrity" "sha512-UugTER3V40jT+e19Dmph5PKMeliYKxycNPwrPNADin0RcWNfT2QksK9Ff2N2W7UKraqMOzoeDb4LAJtxcK1a8Q=="
+  "resolved" "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.12.1.tgz"
+  "version" "4.12.1"
 
-"@algolia/cache-in-memory@4.12.0":
-  "integrity" "sha512-b6ANkZF6vGAo+sYv6g25W5a0u3o6F549gEAgtTDTVA1aHcdWwe/HG/dTJ7NsnHbuR+A831tIwnNYQjRp3/V/Jw=="
-  "resolved" "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/cache-in-memory@4.12.1":
+  "integrity" "sha512-U6iaunaxK1lHsAf02UWF58foKFEcrVLsHwN56UkCtwn32nlP9rz52WOcHsgk6TJrL8NDcO5swMjtOQ5XHESFLw=="
+  "resolved" "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/cache-common" "4.12.0"
+    "@algolia/cache-common" "4.12.1"
 
-"@algolia/client-account@4.12.0":
-  "integrity" "sha512-gzXN75ZydNheNXUN3epS+aLsKnB/PHFVlGUUjXL8WHs4lJP3B5FtHvaA/NCN5DsM3aamhuY5p0ff1XIA+Lbcrw=="
-  "resolved" "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/client-account@4.12.1":
+  "integrity" "sha512-jGo4ConJNoMdTCR2zouO0jO/JcJmzOK6crFxMMLvdnB1JhmMbuIKluOTJVlBWeivnmcsqb7r0v7qTCPW5PAyxQ=="
+  "resolved" "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/client-common" "4.12.0"
-    "@algolia/client-search" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+    "@algolia/client-common" "4.12.1"
+    "@algolia/client-search" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
-"@algolia/client-analytics@4.12.0":
-  "integrity" "sha512-rO2cZCt00Opk66QBZb7IBGfCq4ZE3EiuGkXssf2Monb5urujy0r8CknK2i7bzaKtPbd2vlvhmLP4CEHQqF6SLQ=="
-  "resolved" "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/client-analytics@4.12.1":
+  "integrity" "sha512-h1It7KXzIthlhuhfBk7LteYq72tym9maQDUsyRW0Gft8b6ZQahnRak9gcCvKwhcJ1vJoP7T7JrNYGiYSicTD9g=="
+  "resolved" "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/client-common" "4.12.0"
-    "@algolia/client-search" "4.12.0"
-    "@algolia/requester-common" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+    "@algolia/client-common" "4.12.1"
+    "@algolia/client-search" "4.12.1"
+    "@algolia/requester-common" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
-"@algolia/client-common@4.12.0":
-  "integrity" "sha512-fcrFN7FBmxiSyjeu3sF4OnPkC1l7/8oyQ8RMM8CHpVY8cad6/ay35MrfRfgfqdzdFA8LzcBYO7fykuJv0eOqxw=="
-  "resolved" "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/client-common@4.12.1":
+  "integrity" "sha512-obnJ8eSbv+h94Grk83DTGQ3bqhViSWureV6oK1s21/KMGWbb3DkduHm+lcwFrMFkjSUSzosLBHV9EQUIBvueTw=="
+  "resolved" "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/requester-common" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+    "@algolia/requester-common" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
-"@algolia/client-personalization@4.12.0":
-  "integrity" "sha512-wCJfSQEmX6ZOuJBJGjy+sbXiW0iy7tMNAhsVMV9RRaJE4727e5WAqwFWZssD877WQ74+/nF/VyTaB1+wejo33Q=="
-  "resolved" "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/client-personalization@4.12.1":
+  "integrity" "sha512-sMSnjjPjRgByGHYygV+5L/E8a6RgU7l2GbpJukSzJ9GRY37tHmBHuvahv8JjdCGJ2p7QDYLnQy5bN5Z02qjc7Q=="
+  "resolved" "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/client-common" "4.12.0"
-    "@algolia/requester-common" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+    "@algolia/client-common" "4.12.1"
+    "@algolia/requester-common" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
-"@algolia/client-search@^4.9.1", "@algolia/client-search@4.12.0":
-  "integrity" "sha512-ik6dswcTQtOdZN+8aKntI9X2E6Qpqjtyda/+VANiHThY9GD2PBXuNuuC2HvlF26AbBYp5xaSE/EKxn1DIiIJ4Q=="
-  "resolved" "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/client-search@^4.9.1", "@algolia/client-search@4.12.1":
+  "integrity" "sha512-MwwKKprfY6X2nJ5Ki/ccXM2GDEePvVjZnnoOB2io3dLKW4fTqeSRlC5DRXeFD7UM0vOPPHr4ItV2aj19APKNVQ=="
+  "resolved" "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/client-common" "4.12.0"
-    "@algolia/requester-common" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+    "@algolia/client-common" "4.12.1"
+    "@algolia/requester-common" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
-"@algolia/logger-common@4.12.0":
-  "integrity" "sha512-V//9rzLdJujA3iZ/tPhmKR/m2kjSZrymxOfUiF3024u2/7UyOpH92OOCrHUf023uMGYHRzyhBz5ESfL1oCdh7g=="
-  "resolved" "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/logger-common@4.12.1":
+  "integrity" "sha512-fCgrzlXGATNqdFTxwx0GsyPXK+Uqrx1SZ3iuY2VGPPqdt1a20clAG2n2OcLHJpvaa6vMFPlJyWvbqAgzxdxBlQ=="
+  "resolved" "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.12.1.tgz"
+  "version" "4.12.1"
 
-"@algolia/logger-console@4.12.0":
-  "integrity" "sha512-pHvoGv53KXRIJHLk9uxBwKirwEo12G9+uo0sJLWESThAN3v5M+ycliU1AkUXQN8+9rds2KxfULAb+vfyfBKf8A=="
-  "resolved" "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/logger-console@4.12.1":
+  "integrity" "sha512-0owaEnq/davngQMYqxLA4KrhWHiXujQ1CU3FFnyUcMyBR7rGHI48zSOUpqnsAXrMBdSH6rH5BDkSUUFwsh8RkQ=="
+  "resolved" "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/logger-common" "4.12.0"
+    "@algolia/logger-common" "4.12.1"
 
-"@algolia/requester-browser-xhr@4.12.0":
-  "integrity" "sha512-rGlHNMM3jIZBwSpz33CVkeXHilzuzHuFXEEW1icP/k3KW7kwBrKFJwBy42RzAJa5BYlLsTCFTS3xkPhYwTQKLg=="
-  "resolved" "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/requester-browser-xhr@4.12.1":
+  "integrity" "sha512-OaMxDyG0TZG0oqz1lQh9e3woantAG1bLnuwq3fmypsrQxra4IQZiyn1x+kEb69D2TcXApI5gOgrD4oWhtEVMtw=="
+  "resolved" "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/requester-common" "4.12.0"
+    "@algolia/requester-common" "4.12.1"
 
-"@algolia/requester-common@4.12.0":
-  "integrity" "sha512-qgfdc73nXqpVyOMr6CMTx3nXvud9dP6GcMGDqPct+fnxogGcJsp24cY2nMqUrAfgmTJe9Nmy7Lddv0FyHjONMg=="
-  "resolved" "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/requester-common@4.12.1":
+  "integrity" "sha512-XWIrWQNJ1vIrSuL/bUk3ZwNMNxl+aWz6dNboRW6+lGTcMIwc3NBFE90ogbZKhNrFRff8zI4qCF15tjW+Fyhpow=="
+  "resolved" "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.12.1.tgz"
+  "version" "4.12.1"
 
-"@algolia/requester-node-http@4.12.0":
-  "integrity" "sha512-mOTRGf/v/dXshBoZKNhMG00ZGxoUH9QdSpuMKYnuWwIgstN24uj3DQx+Ho3c+uq0TYfq7n2v71uoJWuiW32NMQ=="
-  "resolved" "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/requester-node-http@4.12.1":
+  "integrity" "sha512-awBtwaD+s0hxkA1aehYn8F0t9wqGoBVWgY4JPHBmp1ChO3pK7RKnnvnv7QQa9vTlllX29oPt/BBVgMo1Z3n1Qg=="
+  "resolved" "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/requester-common" "4.12.0"
+    "@algolia/requester-common" "4.12.1"
 
-"@algolia/transporter@4.12.0":
-  "integrity" "sha512-MOQVHZ4BcBpf3LtOY/3fqXHAcvI8MahrXDHk9QrBE/iGensQhDiZby5Dn3o2JN/zd9FMnVbdPQ8gnkiMwZiakQ=="
-  "resolved" "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.0.tgz"
-  "version" "4.12.0"
+"@algolia/transporter@4.12.1":
+  "integrity" "sha512-BGeNgdEHc6dXIk2g8kdlOoQ6fQ6OIaKQcplEj7HPoi+XZUeAvRi3Pff3QWd7YmybWkjzd9AnTzieTASDWhL+sQ=="
+  "resolved" "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.12.1.tgz"
+  "version" "4.12.1"
   dependencies:
-    "@algolia/cache-common" "4.12.0"
-    "@algolia/logger-common" "4.12.0"
-    "@algolia/requester-common" "4.12.0"
+    "@algolia/cache-common" "4.12.1"
+    "@algolia/logger-common" "4.12.1"
+    "@algolia/requester-common" "4.12.1"
 
 "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3":
   "integrity" "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA=="
@@ -1581,10 +1594,10 @@
   dependencies:
     "@hapi/hoek" "^9.0.0"
 
-"@ledgerhq/devices@^6.20.0":
-  "integrity" "sha512-WehM7HGdb+nSUzyUlz1t2qJ8Tg4I+rQkOJJsx0/Dpjkx6/+1hHcX6My/apPuwh39qahqwYhjszq0H1YzGDS0Yg=="
-  "resolved" "https://registry.npmjs.org/@ledgerhq/devices/-/devices-6.20.0.tgz"
-  "version" "6.20.0"
+"@ledgerhq/devices@^6.24.1":
+  "integrity" "sha512-6SNXWXxojUF6WKXMVIbRs15Mveg+9k0RKJK/PKlwZh929Lnr/NcbONWdwPjWKZAp1g82eEPT4jIkG6qc4QXlcA=="
+  "resolved" "https://registry.npmjs.org/@ledgerhq/devices/-/devices-6.24.1.tgz"
+  "version" "6.24.1"
   dependencies:
     "@ledgerhq/errors" "^6.10.0"
     "@ledgerhq/logs" "^6.10.0"
@@ -1596,22 +1609,22 @@
   "resolved" "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.10.0.tgz"
   "version" "6.10.0"
 
-"@ledgerhq/hw-transport-webhid@^6.20.0":
-  "integrity" "sha512-vpbeKmvlQQHQIT7MOAt8TJV7706YkvfEsW2it/vQKAKGjmAYWgrLDXLLgmA1rEDschq0w63crOSp0El4doy+JQ=="
-  "resolved" "https://registry.npmjs.org/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.20.0.tgz"
-  "version" "6.20.0"
+"@ledgerhq/hw-transport-webhid@^6.24.1":
+  "integrity" "sha512-jeOB4oSQyytJD99FU+xNUkEflgSB6hWUbzhEqnz7fExnGJhMrRT39035dEmSdwshsOFBhzR/IwTUzlwNZzhNxQ=="
+  "resolved" "https://registry.npmjs.org/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.24.1.tgz"
+  "version" "6.24.1"
   dependencies:
-    "@ledgerhq/devices" "^6.20.0"
+    "@ledgerhq/devices" "^6.24.1"
     "@ledgerhq/errors" "^6.10.0"
-    "@ledgerhq/hw-transport" "^6.20.0"
+    "@ledgerhq/hw-transport" "^6.24.1"
     "@ledgerhq/logs" "^6.10.0"
 
-"@ledgerhq/hw-transport@^6.20.0":
-  "integrity" "sha512-5KS0Y6CbWRDOv3FgNIfk53ViQOIZqMxAw0RuOexreW5GMwuYfK7ddGi4142qcu7YrxkGo7cNe42wBbx1hdXl0Q=="
-  "resolved" "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.20.0.tgz"
-  "version" "6.20.0"
+"@ledgerhq/hw-transport@^6.20.0", "@ledgerhq/hw-transport@^6.24.1":
+  "integrity" "sha512-cOhxkQJrN7DvPFLLXAS2nqAZ7NIDaFqnbgu9ugTccgbJm2/z7ClRZX/uQoI4FscswZ47MuJQdXqz4nK48phteQ=="
+  "resolved" "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.24.1.tgz"
+  "version" "6.24.1"
   dependencies:
-    "@ledgerhq/devices" "^6.20.0"
+    "@ledgerhq/devices" "^6.24.1"
     "@ledgerhq/errors" "^6.10.0"
     "events" "^3.3.0"
 
@@ -1912,12 +1925,12 @@
     "camelcase" "^6.2.0"
     "cosmiconfig" "^7.0.0"
 
-"@svgr/core@^6.0.0", "@svgr/core@^6.2.0":
-  "integrity" "sha512-n5PrYAPoTpWGykqa8U05/TVTHOrVR/TxrUJ5EWHP9Db6vR3qnqzwAVLiFT1+slA7zQoJTXafQb+akwThf9SxGw=="
-  "resolved" "https://registry.npmjs.org/@svgr/core/-/core-6.2.0.tgz"
-  "version" "6.2.0"
+"@svgr/core@^6.0.0", "@svgr/core@^6.2.1":
+  "integrity" "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA=="
+  "resolved" "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz"
+  "version" "6.2.1"
   dependencies:
-    "@svgr/plugin-jsx" "^6.2.0"
+    "@svgr/plugin-jsx" "^6.2.1"
     "camelcase" "^6.2.0"
     "cosmiconfig" "^7.0.1"
 
@@ -1928,10 +1941,10 @@
   dependencies:
     "@babel/types" "^7.12.6"
 
-"@svgr/hast-util-to-babel-ast@^6.0.0":
-  "integrity" "sha512-S+TxtCdDyRGafH1VG1t/uPZ87aOYOHzWL8kqz4FoSZcIbzWA6rnOmjNViNiDzqmEpzp2PW5o5mZfvC9DiVZhTQ=="
-  "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.0.0.tgz"
-  "version" "6.0.0"
+"@svgr/hast-util-to-babel-ast@^6.2.1":
+  "integrity" "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ=="
+  "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz"
+  "version" "6.2.1"
   dependencies:
     "@babel/types" "^7.15.6"
     "entities" "^3.0.1"
@@ -1946,14 +1959,14 @@
     "@svgr/hast-util-to-babel-ast" "^5.5.0"
     "svg-parser" "^2.0.2"
 
-"@svgr/plugin-jsx@^6.2.0":
-  "integrity" "sha512-QJDEe7K5Hkd4Eewu4pcjiOKTCtjB47Ol6lDLXVhf+jEewi+EKJAaAmM+bNixfW6LSNEg8RwOYQN3GZcprqKfHw=="
-  "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.0.tgz"
-  "version" "6.2.0"
+"@svgr/plugin-jsx@^6.2.1":
+  "integrity" "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g=="
+  "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz"
+  "version" "6.2.1"
   dependencies:
     "@babel/core" "^7.15.5"
     "@svgr/babel-preset" "^6.2.0"
-    "@svgr/hast-util-to-babel-ast" "^6.0.0"
+    "@svgr/hast-util-to-babel-ast" "^6.2.1"
     "svg-parser" "^2.0.2"
 
 "@svgr/plugin-svgo@^5.5.0":
@@ -1988,18 +2001,18 @@
     "@svgr/plugin-svgo" "^5.5.0"
     "loader-utils" "^2.0.0"
 
-"@svgr/webpack@^6.1.2":
-  "integrity" "sha512-KlLdGe93A8GDs19g8kjEmHwArgMAP6cUfegr2Nx+yDAYY32IPtjzm3SoqNP+I+cnOF1CToJu1clWTPEmdd8dXg=="
-  "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.0.tgz"
-  "version" "6.2.0"
+"@svgr/webpack@^6.2.1":
+  "integrity" "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw=="
+  "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz"
+  "version" "6.2.1"
   dependencies:
     "@babel/core" "^7.15.5"
     "@babel/plugin-transform-react-constant-elements" "^7.14.5"
     "@babel/preset-env" "^7.15.6"
     "@babel/preset-react" "^7.14.5"
     "@babel/preset-typescript" "^7.15.0"
-    "@svgr/core" "^6.2.0"
-    "@svgr/plugin-jsx" "^6.2.0"
+    "@svgr/core" "^6.2.1"
+    "@svgr/plugin-jsx" "^6.2.1"
     "@svgr/plugin-svgo" "^6.2.0"
 
 "@szmarczak/http-timer@^1.1.2":
@@ -2009,19 +2022,38 @@
   dependencies:
     "defer-to-connect" "^1.0.1"
 
-"@taquito/http-utils@^11.2.0":
+"@taquito/beacon-wallet@11.2.0":
+  "integrity" "sha512-/3TlNLacyzvseZxpagFDLfkM3BkOrEivFYKTAFspPIpRZhg4t+rQblkW9tNn9cEiAWPm1uhzA+J2qUDvShdE7w=="
+  "resolved" "https://registry.npmjs.org/@taquito/beacon-wallet/-/beacon-wallet-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@airgap/beacon-sdk" "^2.3.9"
+    "@taquito/taquito" "^11.2.0"
+
+"@taquito/http-utils@^11.2.0", "@taquito/http-utils@11.2.0":
   "integrity" "sha512-9s9l4z70ah8/pjmc5ARxdwy6GCnsqwYxMITqCqKBT4DKVgI8m8kXkdxaVg+Ob5ZGvRQoVDSgTeSeNg8TUMtc+w=="
   "resolved" "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-11.2.0.tgz"
   "version" "11.2.0"
   dependencies:
     "xhr2-cookies" "^1.1.0"
 
-"@taquito/michel-codec@^11.2.0":
+"@taquito/ledger-signer@11.2.0":
+  "integrity" "sha512-NMtfXgEHxxoGOC1xVbj195jYd2WGUMjxBR2wy41hJJM14tWHQZo1ICf1BmDEKLlV4nxEMKRUF9q+J3N7I04xyA=="
+  "resolved" "https://registry.npmjs.org/@taquito/ledger-signer/-/ledger-signer-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@ledgerhq/hw-transport" "^6.20.0"
+    "@taquito/taquito" "^11.2.0"
+    "@taquito/utils" "^11.2.0"
+    "buffer" "^6.0.3"
+    "libsodium-wrappers" "0.7.8"
+
+"@taquito/michel-codec@^11.2.0", "@taquito/michel-codec@11.2.0":
   "integrity" "sha512-ZWu1eyRl9RqOpyHP5h3JKfSPylUMN/91GTWjlJ26GhaMP9YA6mVjJ7pWDrZHFn1QXiS8JgQ7xwsmU+dBqZznSw=="
   "resolved" "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-11.2.0.tgz"
   "version" "11.2.0"
 
-"@taquito/michelson-encoder@^11.2.0":
+"@taquito/michelson-encoder@^11.2.0", "@taquito/michelson-encoder@11.2.0":
   "integrity" "sha512-ifU3PSrJiQDovY7MT3RjrBTVToW82vGBwXeTIKIMnnoAjCnZdL/XjxFfzTrxT90jaz++ou3xcrgIabSvJrfJjg=="
   "resolved" "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-11.2.0.tgz"
   "version" "11.2.0"
@@ -2031,7 +2063,18 @@
     "bignumber.js" "^9.0.2"
     "fast-json-stable-stringify" "^2.1.0"
 
-"@taquito/rpc@^11.2.0":
+"@taquito/remote-signer@11.2.0":
+  "integrity" "sha512-rkoiK/PShwzpGZaRYcXY8pyeU2BUumDjZBaB0wFxVa2467mVjGrhs2sMzx4cdrbXQZAsl9Jacj2vtxrmCIh5lQ=="
+  "resolved" "https://registry.npmjs.org/@taquito/remote-signer/-/remote-signer-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@taquito/http-utils" "^11.2.0"
+    "@taquito/taquito" "^11.2.0"
+    "@taquito/utils" "^11.2.0"
+    "libsodium-wrappers" "0.7.8"
+    "typedarray-to-buffer" "^4.0.0"
+
+"@taquito/rpc@^11.2.0", "@taquito/rpc@11.2.0":
   "integrity" "sha512-Hb5KIi1swUIGHg6h6cPJ+6G+6Nfi6Npat4RogOFvULpbn+WQIo+CTUecEW7aWEBuXahs7W0JBcL4a6GbqE3YGg=="
   "resolved" "https://registry.npmjs.org/@taquito/rpc/-/rpc-11.2.0.tgz"
   "version" "11.2.0"
@@ -2040,7 +2083,19 @@
     "@taquito/utils" "^11.2.0"
     "bignumber.js" "^9.0.2"
 
-"@taquito/taquito@^7.0.0 || ^7.0.0-beta || ^8.0.0-beta":
+"@taquito/signer@11.2.0":
+  "integrity" "sha512-OthNW7gN2hJNph8VMy9LRbZcn7bIBaKdrfC+hAy5N6yzG8EW/t6IEMAgESmNcthMhPUhuOWS37khuwMsuL1GUg=="
+  "resolved" "https://registry.npmjs.org/@taquito/signer/-/signer-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@taquito/taquito" "^11.2.0"
+    "@taquito/utils" "^11.2.0"
+    "elliptic" "^6.5.4"
+    "libsodium-wrappers" "0.7.8"
+    "pbkdf2" "^3.1.2"
+    "typedarray-to-buffer" "^4.0.0"
+
+"@taquito/taquito@^11.2.0", "@taquito/taquito@^7.0.0 || ^7.0.0-beta || ^8.0.0-beta", "@taquito/taquito@11.2.0":
   "integrity" "sha512-OJJYPqQiF7IoxWsBavdKDuxi2oeWHHvRph2nqeCyqVx6H+7uQLpZCf0OP5iQ4F6AxoYPyD7DzEsSFH5tOdgqNQ=="
   "resolved" "https://registry.npmjs.org/@taquito/taquito/-/taquito-11.2.0.tgz"
   "version" "11.2.0"
@@ -2053,7 +2108,36 @@
     "bignumber.js" "^9.0.2"
     "rxjs" "^6.6.3"
 
-"@taquito/utils@^11.2.0":
+"@taquito/tezbridge-wallet@11.2.0":
+  "integrity" "sha512-qdDy91hM3avQhzgTI6kwGJMJH5eWRgnBw/vW/W7BH9jroKrGOkwYvyHymFceznzKSa2aLLBRjk4YZ4XweYFFDA=="
+  "resolved" "https://registry.npmjs.org/@taquito/tezbridge-wallet/-/tezbridge-wallet-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@taquito/taquito" "^11.2.0"
+
+"@taquito/tzip12@11.2.0":
+  "integrity" "sha512-nTBPlyZFFk1xgWaMYv1b3qf8Z+vSpmZROmYtrWznCgPHjG+9zvzjyPON7Sm3HNKnn5jOOEJ5ErvbPSEyU3IzRg=="
+  "resolved" "https://registry.npmjs.org/@taquito/tzip12/-/tzip12-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@taquito/michelson-encoder" "^11.2.0"
+    "@taquito/taquito" "^11.2.0"
+    "@taquito/tzip16" "^11.2.0"
+
+"@taquito/tzip16@^11.2.0", "@taquito/tzip16@11.2.0":
+  "integrity" "sha512-j2KoY+XTOyzTclTmC1hxi61XbzfsankpuTGiMRFC+QjL5vEyoc2CJG41I/0a2hoq30wuEH4TQ1+E6U5wfL/jUw=="
+  "resolved" "https://registry.npmjs.org/@taquito/tzip16/-/tzip16-11.2.0.tgz"
+  "version" "11.2.0"
+  dependencies:
+    "@taquito/http-utils" "^11.2.0"
+    "@taquito/michelson-encoder" "^11.2.0"
+    "@taquito/rpc" "^11.2.0"
+    "@taquito/taquito" "^11.2.0"
+    "@taquito/utils" "^11.2.0"
+    "bignumber.js" "^9.0.2"
+    "crypto-js" "^4.1.1"
+
+"@taquito/utils@^11.2.0", "@taquito/utils@11.2.0":
   "integrity" "sha512-I5LoD5fG9S2Yo4CNpW4u3vF9lUJG1PxkGLi6ntvvH49SBXwo9HJ/n/v04aoE9V7ncA0a7LUm6ucnROagIc2QQQ=="
   "resolved" "https://registry.npmjs.org/@taquito/utils/-/utils-11.2.0.tgz"
   "version" "11.2.0"
@@ -2091,6 +2175,14 @@
   dependencies:
     "@types/node" "*"
 
+"@types/chrome@0.0.115":
+  "integrity" "sha512-pNoYoYgGuI1/kiz53kjrXrKIjn2H8YWOI+vxVTOubX6arCHk/m/jInoyflKiP2qZHZf8+P+hh6d2y9tjaG4BPQ=="
+  "resolved" "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.115.tgz"
+  "version" "0.0.115"
+  dependencies:
+    "@types/filesystem" "*"
+    "@types/har-format" "*"
+
 "@types/cssnano@^4.0.1":
   "integrity" "sha512-hGOroxRTBkYl5gSBRJOffhV4+io+Y2bFX1VP7LgKEVHJt/LPPJaWUIuDAz74Vlp7l7hCDZfaDi7iPxwNwuVA4Q=="
   "resolved" "https://registry.npmjs.org/@types/cssnano/-/cssnano-4.0.1.tgz"
@@ -2119,11 +2211,28 @@
   "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz"
   "version" "0.0.50"
 
+"@types/filesystem@*":
+  "integrity" "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ=="
+  "resolved" "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz"
+  "version" "0.0.32"
+  dependencies:
+    "@types/filewriter" "*"
+
+"@types/filewriter@*":
+  "integrity" "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ=="
+  "resolved" "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz"
+  "version" "0.0.29"
+
 "@types/github-slugger@^1.3.0":
   "integrity" "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g=="
   "resolved" "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz"
   "version" "1.3.0"
 
+"@types/har-format@*":
+  "integrity" "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ=="
+  "resolved" "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz"
+  "version" "1.2.8"
+
 "@types/hast@^2.0.0":
   "integrity" "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g=="
   "resolved" "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz"
@@ -2153,6 +2262,11 @@
   "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
   "version" "7.0.9"
 
+"@types/libsodium-wrappers@0.7.7":
+  "integrity" "sha512-Li91pVKcLvQJK3ZolwCPo85oxf2gKBCApgnesRxYg4OVYchLXcJB2eivX8S87vfQVv6ZRnyCO1lLDosZGJfpRg=="
+  "resolved" "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.7.tgz"
+  "version" "0.7.7"
+
 "@types/mdast@^3.0.0":
   "integrity" "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA=="
   "resolved" "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz"
@@ -2504,25 +2618,25 @@
   dependencies:
     "events" "^1.1.1"
 
-"algoliasearch@^4.0.0", "algoliasearch@^4.10.5", "algoliasearch@^4.12.0", "algoliasearch@^4.9.1", "algoliasearch@>= 3.1 < 5":
-  "integrity" "sha512-fZOMMm+F3Bi5M/MoFIz7hiuyCitJza0Hu+r8Wzz4LIQClC6YGMRq7kT6NNU1fSSoFDSeJIwMfedbbi5G9dJoVQ=="
-  "resolved" "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.0.tgz"
-  "version" "4.12.0"
-  dependencies:
-    "@algolia/cache-browser-local-storage" "4.12.0"
-    "@algolia/cache-common" "4.12.0"
-    "@algolia/cache-in-memory" "4.12.0"
-    "@algolia/client-account" "4.12.0"
-    "@algolia/client-analytics" "4.12.0"
-    "@algolia/client-common" "4.12.0"
-    "@algolia/client-personalization" "4.12.0"
-    "@algolia/client-search" "4.12.0"
-    "@algolia/logger-common" "4.12.0"
-    "@algolia/logger-console" "4.12.0"
-    "@algolia/requester-browser-xhr" "4.12.0"
-    "@algolia/requester-common" "4.12.0"
-    "@algolia/requester-node-http" "4.12.0"
-    "@algolia/transporter" "4.12.0"
+"algoliasearch@^4.0.0", "algoliasearch@^4.10.5", "algoliasearch@^4.12.1", "algoliasearch@^4.9.1", "algoliasearch@>= 3.1 < 5":
+  "integrity" "sha512-c0dM1g3zZBJrkzE5GA/Nu1y3fFxx3LCzxKzcmp2dgGS8P4CjszB/l3lsSh2MSrrK1Hn/KV4BlbBMXtYgG1Bfrw=="
+  "resolved" "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.12.1.tgz"
+  "version" "4.12.1"
+  dependencies:
+    "@algolia/cache-browser-local-storage" "4.12.1"
+    "@algolia/cache-common" "4.12.1"
+    "@algolia/cache-in-memory" "4.12.1"
+    "@algolia/client-account" "4.12.1"
+    "@algolia/client-analytics" "4.12.1"
+    "@algolia/client-common" "4.12.1"
+    "@algolia/client-personalization" "4.12.1"
+    "@algolia/client-search" "4.12.1"
+    "@algolia/logger-common" "4.12.1"
+    "@algolia/logger-console" "4.12.1"
+    "@algolia/requester-browser-xhr" "4.12.1"
+    "@algolia/requester-common" "4.12.1"
+    "@algolia/requester-node-http" "4.12.1"
+    "@algolia/transporter" "4.12.1"
 
 "alphanum-sort@^1.0.2":
   "integrity" "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
@@ -2655,6 +2769,13 @@
   dependencies:
     "follow-redirects" "^1.14.7"
 
+"axios@0.21.1":
+  "integrity" "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA=="
+  "resolved" "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz"
+  "version" "0.21.1"
+  dependencies:
+    "follow-redirects" "^1.10.0"
+
 "babel-loader@^8.2.2":
   "integrity" "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw=="
   "resolved" "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz"
@@ -2760,6 +2881,11 @@
   "resolved" "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz"
   "version" "9.0.2"
 
+"bignumber.js@9.0.0":
+  "integrity" "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
+  "resolved" "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz"
+  "version" "9.0.0"
+
 "binary-extensions@^2.0.0":
   "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
   "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
@@ -2865,7 +2991,7 @@
   dependencies:
     "base-x" "^3.0.2"
 
-"bs58check@^2.1.2":
+"bs58check@^2.1.2", "bs58check@2.1.2":
   "integrity" "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA=="
   "resolved" "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz"
   "version" "2.1.2"
@@ -3093,7 +3219,7 @@
   "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz"
   "version" "3.3.0"
 
-"cipher-base@^1.0.1":
+"cipher-base@^1.0.1", "cipher-base@^1.0.3":
   "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="
   "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"
   "version" "1.0.4"
@@ -3123,10 +3249,10 @@
   "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz"
   "version" "2.2.1"
 
-"clipboard@^2.0.8":
-  "integrity" "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ=="
-  "resolved" "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz"
-  "version" "2.0.8"
+"clipboard@^2.0.10":
+  "integrity" "sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g=="
+  "resolved" "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz"
+  "version" "2.0.10"
   dependencies:
     "good-listener" "^1.2.2"
     "select" "^1.1.2"
@@ -3399,7 +3525,7 @@
     "path-type" "^4.0.0"
     "yaml" "^1.10.0"
 
-"create-hash@^1.1.0":
+"create-hash@^1.1.0", "create-hash@^1.1.2":
   "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="
   "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
   "version" "1.2.0"
@@ -3410,6 +3536,18 @@
     "ripemd160" "^2.0.1"
     "sha.js" "^2.4.0"
 
+"create-hmac@^1.1.4":
+  "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="
+  "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
+  "version" "1.1.7"
+  dependencies:
+    "cipher-base" "^1.0.3"
+    "create-hash" "^1.1.0"
+    "inherits" "^2.0.1"
+    "ripemd160" "^2.0.0"
+    "safe-buffer" "^5.0.1"
+    "sha.js" "^2.4.8"
+
 "cross-fetch@^3.0.4":
   "integrity" "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ=="
   "resolved" "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz"
@@ -3426,6 +3564,11 @@
     "shebang-command" "^2.0.0"
     "which" "^2.0.1"
 
+"crypto-js@^4.1.1":
+  "integrity" "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+  "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz"
+  "version" "4.1.1"
+
 "crypto-random-string@^2.0.0":
   "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
   "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz"
@@ -4337,7 +4480,7 @@
     "fbemitter" "^3.0.0"
     "fbjs" "^3.0.0"
 
-"follow-redirects@^1.0.0", "follow-redirects@^1.14.0", "follow-redirects@^1.14.7":
+"follow-redirects@^1.0.0", "follow-redirects@^1.10.0", "follow-redirects@^1.14.0", "follow-redirects@^1.14.7":
   "integrity" "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA=="
   "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz"
   "version" "1.14.8"
@@ -4405,11 +4548,6 @@
   "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
   "version" "1.0.0"
 
-"fsevents@~2.3.2":
-  "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="
-  "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
-  "version" "2.3.2"
-
 "function-bind@^1.1.1":
   "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
   "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
@@ -5444,6 +5582,18 @@
   "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
   "version" "3.1.0"
 
+"libsodium-wrappers@0.7.8":
+  "integrity" "sha512-PDhPWXBqd/SaqAFUBgH2Ux7b3VEEJgyD6BQB+VdNFJb9PbExGr/T/myc/MBoSvl8qLzfm0W0IVByOQS5L1MrCg=="
+  "resolved" "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.8.tgz"
+  "version" "0.7.8"
+  dependencies:
+    "libsodium" "0.7.8"
+
+"libsodium@0.7.8":
+  "integrity" "sha512-/Qc+APf0jbeWSaeEruH0L1/tbbT+sbf884ZL0/zV/0JXaDPBzYkKbyb/wmxMHgAHzm3t6gqe7bOOXAVwfqVikQ=="
+  "resolved" "https://registry.npmjs.org/libsodium/-/libsodium-0.7.8.tgz"
+  "version" "0.7.8"
+
 "lilconfig@^2.0.3":
   "integrity" "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA=="
   "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz"
@@ -6248,6 +6398,17 @@
   "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
   "version" "4.0.0"
 
+"pbkdf2@^3.1.2":
+  "integrity" "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA=="
+  "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz"
+  "version" "3.1.2"
+  dependencies:
+    "create-hash" "^1.1.2"
+    "create-hmac" "^1.1.4"
+    "ripemd160" "^2.0.1"
+    "safe-buffer" "^5.0.1"
+    "sha.js" "^2.4.8"
+
 "picocolors@^0.2.1":
   "integrity" "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
   "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz"
@@ -6614,10 +6775,10 @@
   "resolved" "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz"
   "version" "1.1.0"
 
-"prism-react-renderer@^1.0.1", "prism-react-renderer@^1.2.1":
-  "integrity" "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg=="
-  "resolved" "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz"
-  "version" "1.2.1"
+"prism-react-renderer@^1.0.1", "prism-react-renderer@^1.2.1", "prism-react-renderer@^1.3.1":
+  "integrity" "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ=="
+  "resolved" "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz"
+  "version" "1.3.1"
 
 "prismjs@^1.23.0":
   "integrity" "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
@@ -6708,6 +6869,11 @@
   "resolved" "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
   "version" "1.5.1"
 
+"qrcode-generator@1.4.4":
+  "integrity" "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
+  "resolved" "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz"
+  "version" "1.4.4"
+
 "qs@6.7.0":
   "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
   "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz"
@@ -7235,7 +7401,7 @@
   dependencies:
     "glob" "^7.1.3"
 
-"ripemd160@^2.0.1":
+"ripemd160@^2.0.0", "ripemd160@^2.0.1":
   "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="
   "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
   "version" "2.0.2"
@@ -7508,7 +7674,7 @@
   "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz"
   "version" "1.1.1"
 
-"sha.js@^2.4.0":
+"sha.js@^2.4.0", "sha.js@^2.4.8":
   "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="
   "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"
   "version" "2.4.11"


Test patch:
diff --git a/packages/taquito/test/estimate/rpc-estimate-provider.spec.ts b/packages/taquito/test/estimate/rpc-estimate-provider.spec.ts
index 649ccba15..66249bf71 100644
--- a/packages/taquito/test/estimate/rpc-estimate-provider.spec.ts
+++ b/packages/taquito/test/estimate/rpc-estimate-provider.spec.ts
@@ -21,7 +21,7 @@ import { OpKind } from '@taquito/rpc';
 /**
  * RPCEstimateProvider test
  */
-describe('RPCEstimateProvider test', () => {
+describe('RPCEstimateProvider test signer', () => {
   let estimateProvider: RPCEstimateProvider;
   let mockRpcClient: {
     getScript: jest.Mock<any, any>;
@@ -889,3 +889,372 @@ describe('RPCEstimateProvider test', () => {
     });
   });
 });
+
+describe('RPCEstimateProvider test wallet', () => {
+  let estimateProvider: RPCEstimateProvider;
+  let mockRpcClient: {
+    getScript: jest.Mock<any, any>;
+    getBalance: jest.Mock<any, any>;
+    getStorage: jest.Mock<any, any>;
+    getBlockHeader: jest.Mock<any, any>;
+    getManagerKey: jest.Mock<any, any>;
+    getBlock: jest.Mock<any, any>;
+    getContract: jest.Mock<any, any>;
+    getBlockMetadata: jest.Mock<any, any>;
+    runOperation: jest.Mock<any, any>;
+    injectOperation: jest.Mock<any, any>;
+    preapplyOperations: jest.Mock<any, any>;
+    getChainId: jest.Mock<any, any>;
+    getConstants: jest.Mock<any, any>;
+    getProtocols: jest.Mock<any, any>;
+  };
+
+  let mockForger: {
+    forge: jest.Mock<any, any>;
+  };
+
+  let mockWalletProvider: {
+    getPKH: jest.Mock<any, any>;
+  };
+
+  beforeEach(() => {
+    mockRpcClient = {
+      runOperation: jest.fn(),
+      getBalance: jest.fn(),
+      getBlock: jest.fn(),
+      getScript: jest.fn(),
+      getManagerKey: jest.fn(),
+      getStorage: jest.fn(),
+      getBlockHeader: jest.fn(),
+      getBlockMetadata: jest.fn(),
+      getContract: jest.fn(),
+      injectOperation: jest.fn(),
+      preapplyOperations: jest.fn(),
+      getChainId: jest.fn(),
+      getConstants: jest.fn(),
+      getProtocols: jest.fn(),
+    };
+
+    mockForger = {
+      forge: jest.fn(),
+    };
+
+    mockWalletProvider = {
+      getPKH: jest.fn(),
+    };
+
+    // Required for operations confirmation polling
+    mockRpcClient.getBlock.mockResolvedValue({
+      operations: [[], [], [], []],
+      header: {
+        level: 0,
+      },
+    });
+
+    mockRpcClient.getBalance.mockResolvedValue(new BigNumber(20000000));
+    mockRpcClient.getManagerKey.mockResolvedValue('test');
+    mockRpcClient.getContract.mockResolvedValue({ counter: 0 });
+    mockRpcClient.getBlockHeader.mockResolvedValue({ hash: 'test' });
+    mockRpcClient.getBlockMetadata.mockResolvedValue({ next_protocol: 'test_proto' });
+    mockRpcClient.getProtocols.mockResolvedValue({ next_protocol: 'test_proto' });
+    mockForger.forge.mockResolvedValue('1234');
+    mockRpcClient.preapplyOperations.mockResolvedValue([]);
+    mockRpcClient.getChainId.mockResolvedValue('chain-id');
+    mockRpcClient.getConstants.mockResolvedValue({
+      hard_gas_limit_per_operation: new BigNumber(1040000),
+      hard_storage_limit_per_operation: new BigNumber(60000),
+      hard_gas_limit_per_block: new BigNumber(5200000),
+      cost_per_byte: new BigNumber(1000),
+    });
+
+    mockWalletProvider.getPKH.mockResolvedValue('test_wallet_pub_key_hash');
+    const context = new Context(mockRpcClient as any);
+    context.forger = mockForger;
+    context.walletProvider = mockWalletProvider as any;
+    estimateProvider = new RPCEstimateProvider(context);
+  });
+
+  describe('originate', () => {
+    it('should produce an estimate for origination operation', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue({
+        contents: [
+          {
+            kind: 'origination',
+            metadata: {
+              operation_result: {
+                consumed_gas: 1000,
+              },
+            },
+          },
+        ],
+      });
+      const estimate = await estimateProvider.originate({
+        delegate: 'test_delegate',
+        balance: '200',
+        code: miStr,
+        init: '{}',
+        fee: 10000,
+        gasLimit: 10600,
+        storageLimit: 257,
+      });
+      expect(estimate.gasLimit).toEqual(1100);
+      done();
+    });
+
+    it('should throw an error if the account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      try {
+        await estimateProvider.originate({
+          code: ligoSample,
+          storage: 0,
+        });
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+
+  describe('transfer', () => {
+    it('return the correct estimate for multiple internal origination, no reveal', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue(multipleInternalOriginationNoReveal());
+      // Simulate real op size
+      mockForger.forge.mockResolvedValue(new Array(297).fill('aa').join(''));
+      const estimate = await estimateProvider.transfer({
+        to: 'tz1QZ6KY7d3BuZDT1d19dUxoQrtFPN2QJ3hn',
+        amount: 2,
+      });
+      expect(estimate).toMatchObject({
+        gasLimit: 40928,
+        storageLimit: 634,
+        suggestedFeeMutez: 4590,
+      });
+      done();
+    });
+
+    it('should throw an error if the account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      try {
+        await estimateProvider.transfer({
+          to: 'tz1QZ6KY7d3BuZDT1d19dUxoQrtFPN2QJ3hn',
+          amount: 2,
+        });
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+
+  describe('setDelegate', () => {
+    it('return the correct estimate for delegation', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue({
+        contents: [
+          {
+            kind: 'delegation',
+            metadata: {
+              operation_result: { status: 'applied', consumed_gas: '10000' },
+            },
+          },
+        ],
+      });
+      // Simulate real op size
+      mockForger.forge.mockResolvedValue(new Array(149).fill('aa').join(''));
+      const estimate = await estimateProvider.setDelegate({
+        source: 'tz1QZ6KY7d3BuZDT1d19dUxoQrtFPN2QJ3hn',
+        delegate: 'KT1Fe71jyjrxFg9ZrYqtvaX7uQjcLo7svE4D',
+      });
+      expect(estimate).toMatchObject({
+        gasLimit: 10100,
+        storageLimit: 0,
+        suggestedFeeMutez: 1359,
+      });
+      done();
+    });
+
+    it('should throw an error if the account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      try {
+        await estimateProvider.setDelegate({
+          source: 'tz1QZ6KY7d3BuZDT1d19dUxoQrtFPN2QJ3hn',
+          delegate: 'KT1Fe71jyjrxFg9ZrYqtvaX7uQjcLo7svE4D',
+        });
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+
+  describe('registerDelegate', () => {
+    it('return the correct estimate for delegation', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue({
+        contents: [
+          {
+            kind: 'delegation',
+            metadata: {
+              operation_result: { status: 'applied', consumed_gas: '10000' },
+            },
+          },
+        ],
+      });
+      // Simulate real op size
+      mockForger.forge.mockResolvedValue(new Array(149).fill('aa').join(''));
+      const estimate = await estimateProvider.registerDelegate({});
+      expect(estimate).toMatchObject({
+        gasLimit: 10100,
+        storageLimit: 0,
+        suggestedFeeMutez: 1359,
+      });
+      done();
+    });
+
+    it('should throw an error if the account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      try {
+        await estimateProvider.registerDelegate({});
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+
+  describe('batch', () => {
+    it('should produce a batch operation', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue({
+        contents: [
+          {
+            kind: 'transaction',
+            source: 'tz2Ch1abG7FNiibmV26Uzgdsnfni9XGrk5wD',
+            fee: '0',
+            counter: '294313',
+            gas_limit: '800000',
+            storage_limit: '2000',
+            amount: '1700000',
+            destination: 'tz1ZfrERcALBwmAqwonRXYVQBDT9BjNjBHJu',
+            metadata: {
+              operation_result: {
+                consumed_gas: 1000,
+              },
+            },
+          },
+          {
+            kind: 'transaction',
+            source: 'tz2Ch1abG7FNiibmV26Uzgdsnfni9XGrk5wD',
+            fee: '0',
+            counter: '294313',
+            gas_limit: '800000',
+            storage_limit: '2000',
+            amount: '1700000',
+            destination: 'tz3hRZUScFCcEVhdDjXWoyekbgd1Gatga6mp',
+            metadata: {
+              operation_result: {
+                consumed_gas: 1000,
+              },
+            },
+          },
+          registerGlobalConstantNoReveal.contents[0],
+        ],
+      });
+      const estimate = await estimateProvider.batch([
+        { kind: OpKind.TRANSACTION, to: 'tz1ZfrERcALBwmAqwonRXYVQBDT9BjNjBHJu', amount: 2 },
+        { kind: OpKind.TRANSACTION, to: 'tz3hRZUScFCcEVhdDjXWoyekbgd1Gatga6mp', amount: 2 },
+        {
+          kind: OpKind.REGISTER_GLOBAL_CONSTANT,
+          value: {
+            prim: 'Pair',
+            args: [{ int: '998' }, { int: '999' }],
+          },
+        },
+      ]);
+      expect(estimate.length).toEqual(3);
+      expect(estimate[0].gasLimit).toEqual(1100);
+      expect(estimate[1].gasLimit).toEqual(1100);
+      expect(estimate[2].gasLimit).toEqual(1330);
+      done();
+    });
+
+    it('should throw an error if the account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+
+      try {
+        await estimateProvider.batch([
+          {
+            kind: OpKind.REGISTER_GLOBAL_CONSTANT,
+            value: {
+              prim: 'Pair',
+              args: [{ int: '998' }, { int: '999' }],
+            },
+          },
+          { kind: OpKind.TRANSACTION, to: 'tz1ZfrERcALBwmAqwonRXYVQBDT9BjNjBHJu', amount: 2 },
+          { kind: OpKind.TRANSACTION, to: 'tz3hRZUScFCcEVhdDjXWoyekbgd1Gatga6mp', amount: 2 },
+        ]);
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+
+      done();
+    });
+  });
+
+  describe('registerGlobalConstant', () => {
+    it('should return the correct estimate for registerGlobalConstant operation', async (done) => {
+      mockRpcClient.runOperation.mockResolvedValue(registerGlobalConstantNoReveal);
+      const estimate = await estimateProvider.registerGlobalConstant({
+        value: {
+          prim: 'Pair',
+          args: [{ int: '998' }, { int: '999' }],
+        },
+      });
+      expect(estimate).toMatchObject({
+        gasLimit: 1330,
+        storageLimit: 73,
+        suggestedFeeMutez: 335,
+      });
+      done();
+    });
+
+    it('should throw an error if account is unrevealed', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      mockRpcClient.runOperation.mockResolvedValue(registerGlobalConstantWithReveal);
+      try {
+        await estimateProvider.registerGlobalConstant({
+          value: {
+            prim: 'Pair',
+            args: [{ int: '998' }, { int: '999' }],
+          },
+        });
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+
+  describe('reveal', () => {
+    it('should throw an error', async (done) => {
+      mockRpcClient.getManagerKey.mockResolvedValue(null);
+      try {
+        await estimateProvider.reveal({});
+      } catch (e) {
+        expect(e.message).toEqual(
+          'Unable to estimate the reveal operation, the public key is unknown'
+        );
+      }
+      done();
+    });
+  });
+});