Add Tezos Support (#127)

* feat(): add tezos

* feat(dapp): add tezos support

* feat(): remove unused project

* feat(): update logo

* feat(): add tezos sign modal

* feat(): remove unimplemented method

* feat(tezos): add send and sign support

* feat(tezos): add rpc

* Update wallets/react-wallet-v2/src/views/SessionProposalModal.tsx

Co-authored-by: Ben Kremer <contact@bkrem.dev>

* feat(): share all accounts

---------

Co-authored-by: Ben Kremer <ben@walletconnect.com>
Co-authored-by: Ben Kremer <contact@bkrem.dev>
This commit is contained in:
AndreasGassmann 2023-03-31 10:35:53 +02:00 committed by GitHub
parent 757ed43909
commit 9bf2b02602
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 857 additions and 14 deletions

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="katman_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0{fill:#2C7DF7;}
.st1{fill:#FFFFFF;}
</style>
<path class="st0" d="M399.8,559.9c143.8,0,260.3-116.6,260.3-260.3S543.6,39.2,399.8,39.2c-143.8,0-260.3,116.6-260.3,260.3
S256,559.9,399.8,559.9z"/>
<path class="st1" d="M424.8,449.1c-21.1,0-36.4-5.1-46.1-15.2c-9-8.6-14.2-20.4-14.5-32.8c-0.1-3.8,0.8-7.5,2.5-10.8
c1.7-2.9,4-5.3,6.9-6.9c3.3-1.7,7-2.5,10.8-2.5c3.7,0,7.4,0.9,10.8,2.5c2.9,1.6,5.2,4,6.9,6.9c1.8,3.3,2.7,7.1,2.6,10.8
c0.2,4.5-1.1,9-3.7,12.7c-2.2,3-5.2,5.3-8.8,6.4c3.5,4.4,8.4,7.5,13.8,8.6c6.1,1.8,12.5,2.7,18.9,2.7c8.4,0.1,16.7-2.4,23.7-7.1
c7.3-5.1,12.7-12.5,15.5-21c3.5-10.1,5.2-20.7,5.1-31.4c0.3-11.1-1.6-22.2-5.5-32.6c-3-8.3-8.6-15.5-16-20.3
c-6.9-4.4-14.9-6.6-23-6.6c-7.1,0.6-14,2.9-20,6.8l-14.8,7.4v-7.4l66.5-89.2h-92.2v92.6c-0.3,6.7,1.5,13.3,5.1,18.9
c1.7,2.5,4.1,4.4,6.8,5.7c2.7,1.3,5.7,1.9,8.7,1.7c5.5-0.1,10.9-2,15.3-5.4c5-3.6,9.3-8.1,12.8-13.2c0.3-0.9,0.9-1.7,1.7-2.2
c0.6-0.5,1.4-0.8,2.2-0.8c1.6,0.1,3.1,0.8,4.3,1.8c1.5,1.7,2.4,4,2.3,6.3c-0.2,1.6-0.5,3.1-0.8,4.6c-3.3,7.9-8.8,14.7-15.8,19.6
c-6.5,4.4-14.3,6.8-22.2,6.7c-20,0-33.8-3.9-41.5-11.8c-4-4.3-7-9.4-9-15c-2-5.5-2.8-11.4-2.5-17.3v-92.4h-46.9v-17.2H332v-39.2
l-10.8-10.8v-8.8h31.3l11.8,6.1v52.7l121.8-0.4l12.1,12.2l-74.7,75c4.5-1.8,9.3-3,14.1-3.4c9.6,0.4,18.9,3.1,27.3,7.8
c9.7,4.6,17.8,11.9,23.5,21c5.1,7.7,8.7,16.3,10.6,25.3c1.6,7.1,2.4,14.4,2.5,21.7c0,13.9-3.1,27.6-9.2,40.1
c-5.8,12.1-15.6,21.9-27.7,27.7C452.3,446,438.6,449.1,424.8,449.1L424.8,449.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -7,6 +7,7 @@ import * as solana from "./solana";
import * as near from "./near";
import * as elrond from "./elrond";
import * as tron from "./tron";
import * as tezos from "./tezos";
import { ChainMetadata, ChainRequestRender } from "../helpers";
@ -27,6 +28,8 @@ export function getChainMetadata(chainId: string): ChainMetadata {
return elrond.getChainMetadata(chainId);
case "tron":
return tron.getChainMetadata(chainId);
case "tezos":
return tezos.getChainMetadata(chainId);
default:
throw new Error(`No metadata handler for namespace ${namespace}`);
}
@ -46,6 +49,8 @@ export function getChainRequestRender(
return polkadot.getChainRequestRender(request);
case "near":
return near.getChainRequestRender(request);
case "tezos":
return tezos.getChainRequestRender(request);
default:
throw new Error(`No render handler for namespace ${namespace}`);
}

View File

@ -0,0 +1,64 @@
import { JsonRpcRequest } from "@walletconnect/jsonrpc-utils";
import {
NamespaceMetadata,
ChainMetadata,
ChainRequestRender,
ChainsMap,
} from "../helpers";
export const TezosMetadata: NamespaceMetadata = {
mainnet: {
logo: "/assets/tezos.svg",
rgb: "44, 125, 247",
},
testnet: {
logo: "/assets/tezos.svg",
rgb: "44, 125, 247",
},
};
export const TezosChainData: ChainsMap = {
mainnet: {
name: "Tezos",
id: "tezos:mainnet",
rpc: ["https://mainnet.api.tez.ie"],
slip44: 1729,
testnet: false,
},
testnet: {
name: "Tezos Testnet",
id: "tezos:testnet",
rpc: ["https://ghostnet.ecadinfra.com"],
slip44: 1729,
testnet: true,
},
};
export function getChainMetadata(chainId: string): ChainMetadata {
const reference = chainId.split(":")[1];
const metadata = TezosMetadata[reference];
if (typeof metadata === "undefined") {
throw new Error(`No chain metadata found for chainId: ${chainId}`);
}
return metadata;
}
export function getChainRequestRender(
request: JsonRpcRequest
): ChainRequestRender[] {
let params = [{ label: "Method", value: request.method }];
switch (request.method) {
default:
params = [
...params,
{
label: "params",
value: JSON.stringify(request.params, null, "\t"),
},
];
break;
}
return params;
}

View File

@ -14,6 +14,7 @@ export const DEFAULT_MAIN_CHAINS = [
"polkadot:91b171bb158e2d3848fa23a9f1c25182",
"elrond:1",
"tron:0x2b6653dc",
"tezos:mainnet",
];
export const DEFAULT_TEST_CHAINS = [
@ -28,6 +29,7 @@ export const DEFAULT_TEST_CHAINS = [
"near:testnet",
"elrond:D",
"tron:0xcd8690dc",
"tezos:testnet",
];
export const DEFAULT_CHAINS = [...DEFAULT_MAIN_CHAINS, ...DEFAULT_TEST_CHAINS];
@ -125,6 +127,17 @@ export enum DEFAULT_TRON_METHODS {
export enum DEFAULT_TRON_EVENTS {}
/**
* TEZOS
*/
export enum DEFAULT_TEZOS_METHODS {
TEZOS_GET_ACCOUNTS = "tezos_getAccounts",
TEZOS_SEND = "tezos_send",
TEZOS_SIGN = "tezos_sign",
}
export enum DEFAULT_TEZOS_EVENTS {}
export const DEFAULT_GITHUB_REPO_URL =
"https://github.com/WalletConnect/web-examples/tree/main/dapps/react-dapp-v2";

View File

@ -14,6 +14,7 @@ import { ChainNamespaces, ChainsMap, getAllChainNamespaces } from "../helpers";
import { NearChainData } from "../chains/near";
import { CosmosChainData } from "../chains/cosmos";
import { EIP155ChainData } from "../chains/eip155";
import { TezosChainData } from "../chains/tezos";
/**
* Types
@ -65,6 +66,9 @@ export function ChainDataContextProvider({
case "eip155":
chains = EIP155ChainData;
break;
case "tezos":
chains = TezosChainData;
break;
default:
console.error("Unknown chain namespace: ", namespace);
}

View File

@ -35,6 +35,7 @@ import {
DEFAULT_NEAR_METHODS,
DEFAULT_ELROND_METHODS,
DEFAULT_TRON_METHODS,
DEFAULT_TEZOS_METHODS,
} from "../constants";
import { useChainData } from "./ChainDataContext";
import { signatureVerify, cryptoWaitReady } from "@polkadot/util-crypto";
@ -97,6 +98,11 @@ interface IContext {
testSignMessage: TRpcRequestCallback;
testSignTransaction: TRpcRequestCallback;
};
tezosRpc: {
testGetAccounts: TRpcRequestCallback;
testSignMessage: TRpcRequestCallback;
testSignTransaction: TRpcRequestCallback;
};
rpcResult?: IFormattedRpcResponse | null;
isRpcRequestPending: boolean;
isTestnet: boolean;
@ -1154,6 +1160,103 @@ export function JsonRpcContextProvider({
),
};
// -------- TEZOS RPC METHODS --------
const tezosRpc = {
testGetAccounts: _createJsonRpcRequestHandler(
async (
chainId: string,
address: string
): Promise<IFormattedRpcResponse> => {
try {
const result = await client!.request<{ signature: string }>({
chainId,
topic: session!.topic,
request: {
method: DEFAULT_TEZOS_METHODS.TEZOS_GET_ACCOUNTS,
params: {},
},
});
return {
method: DEFAULT_TEZOS_METHODS.TEZOS_GET_ACCOUNTS,
address,
valid: true,
result: JSON.stringify(result, null, 2),
};
} catch (error: any) {
throw new Error(error.message);
}
}
),
testSignTransaction: _createJsonRpcRequestHandler(
async (
chainId: string,
address: string
): Promise<IFormattedRpcResponse> => {
try {
const result = await client!.request<{ hash: string }>({
chainId,
topic: session!.topic,
request: {
method: DEFAULT_TEZOS_METHODS.TEZOS_SEND,
params: {
account: address,
operations: [
{
kind: "transaction",
amount: "1", // 1 mutez, smallest unit
destination: address, // send to ourselves
},
],
},
},
});
return {
method: DEFAULT_TEZOS_METHODS.TEZOS_SEND,
address,
valid: true,
result: result.hash,
};
} catch (error: any) {
throw new Error(error.message);
}
}
),
testSignMessage: _createJsonRpcRequestHandler(
async (
chainId: string,
address: string
): Promise<IFormattedRpcResponse> => {
const payload = "05010000004254";
try {
const result = await client!.request<{ signature: string }>({
chainId,
topic: session!.topic,
request: {
method: DEFAULT_TEZOS_METHODS.TEZOS_SIGN,
params: {
account: address,
payload,
},
},
});
return {
method: DEFAULT_TEZOS_METHODS.TEZOS_SIGN,
address,
valid: true,
result: result.signature,
};
} catch (error: any) {
throw new Error(error.message);
}
}
),
};
return (
<JsonRpcContext.Provider
value={{
@ -1165,6 +1268,7 @@ export function JsonRpcContextProvider({
nearRpc,
elrondRpc,
tronRpc,
tezosRpc,
rpcResult: result,
isRpcRequestPending: pending,
isTestnet,

View File

@ -14,6 +14,8 @@ import {
DEFAULT_ELROND_METHODS,
DEFAULT_TRON_METHODS,
DEFAULT_TRON_EVENTS,
DEFAULT_TEZOS_METHODS,
DEFAULT_TEZOS_EVENTS,
} from "../constants";
export const getNamespacesFromChains = (chains: string[]) => {
@ -44,6 +46,8 @@ export const getSupportedMethodsByNamespace = (namespace: string) => {
return Object.values(DEFAULT_ELROND_METHODS);
case "tron":
return Object.values(DEFAULT_TRON_METHODS);
case "tezos":
return Object.values(DEFAULT_TEZOS_METHODS);
default:
throw new Error(`No default methods for namespace: ${namespace}`);
}
@ -65,6 +69,8 @@ export const getSupportedEventsByNamespace = (namespace: string) => {
return Object.values(DEFAULT_ELROND_EVENTS);
case "tron":
return Object.values(DEFAULT_TRON_EVENTS);
case "tezos":
return Object.values(DEFAULT_TEZOS_EVENTS);
default:
throw new Error(`No default events for namespace: ${namespace}`);
}

View File

@ -17,6 +17,7 @@ import {
DEFAULT_TEST_CHAINS,
DEFAULT_NEAR_METHODS,
DEFAULT_TRON_METHODS,
DEFAULT_TEZOS_METHODS,
} from "../constants";
import { AccountAction, setLocaleStorageTestnetFlag } from "../helpers";
import Toggle from "../components/Toggle";
@ -75,6 +76,7 @@ const Home: NextPage = () => {
nearRpc,
elrondRpc,
tronRpc,
tezosRpc,
isRpcRequestPending,
rpcResult,
isTestnet,
@ -306,6 +308,35 @@ const Home: NextPage = () => {
];
};
const getTezosActions = (): AccountAction[] => {
const onGetAccounts = async (chainId: string, address: string) => {
openRequestModal();
await tezosRpc.testGetAccounts(chainId, address);
};
const onSignTransaction = async (chainId: string, address: string) => {
openRequestModal();
await tezosRpc.testSignTransaction(chainId, address);
};
const onSignMessage = async (chainId: string, address: string) => {
openRequestModal();
await tezosRpc.testSignMessage(chainId, address);
};
return [
{
method: DEFAULT_TEZOS_METHODS.TEZOS_GET_ACCOUNTS,
callback: onGetAccounts,
},
{
method: DEFAULT_TEZOS_METHODS.TEZOS_SEND,
callback: onSignTransaction,
},
{
method: DEFAULT_TEZOS_METHODS.TEZOS_SIGN,
callback: onSignMessage,
},
];
};
const getBlockchainActions = (chainId: string) => {
const [namespace] = chainId.split(":");
switch (namespace) {
@ -323,6 +354,8 @@ const Home: NextPage = () => {
return getElrondActions();
case "tron":
return getTronActions();
case "tezos":
return getTezosActions();
default:
break;
}

View File

@ -1,3 +1,2 @@
NEXT_PUBLIC_PROJECT_ID=...
NEXT_PUBLIC_RELAY_URL=wss://relay.walletconnect.com

View File

@ -20,6 +20,8 @@
"@polkadot/keyring": "^10.1.2",
"@polkadot/types": "^9.3.3",
"@solana/web3.js": "1.43.0",
"@taquito/signer": "^15.1.0",
"@taquito/taquito": "^15.1.0",
"@walletconnect/client": "1.8.0",
"@walletconnect/legacy-types": "^2.0.0-rc.0",
"@walletconnect/sign-client": "2.4.10",

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="katman_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0{fill:#2C7DF7;}
.st1{fill:#FFFFFF;}
</style>
<path class="st0" d="M399.8,559.9c143.8,0,260.3-116.6,260.3-260.3S543.6,39.2,399.8,39.2c-143.8,0-260.3,116.6-260.3,260.3
S256,559.9,399.8,559.9z"/>
<path class="st1" d="M424.8,449.1c-21.1,0-36.4-5.1-46.1-15.2c-9-8.6-14.2-20.4-14.5-32.8c-0.1-3.8,0.8-7.5,2.5-10.8
c1.7-2.9,4-5.3,6.9-6.9c3.3-1.7,7-2.5,10.8-2.5c3.7,0,7.4,0.9,10.8,2.5c2.9,1.6,5.2,4,6.9,6.9c1.8,3.3,2.7,7.1,2.6,10.8
c0.2,4.5-1.1,9-3.7,12.7c-2.2,3-5.2,5.3-8.8,6.4c3.5,4.4,8.4,7.5,13.8,8.6c6.1,1.8,12.5,2.7,18.9,2.7c8.4,0.1,16.7-2.4,23.7-7.1
c7.3-5.1,12.7-12.5,15.5-21c3.5-10.1,5.2-20.7,5.1-31.4c0.3-11.1-1.6-22.2-5.5-32.6c-3-8.3-8.6-15.5-16-20.3
c-6.9-4.4-14.9-6.6-23-6.6c-7.1,0.6-14,2.9-20,6.8l-14.8,7.4v-7.4l66.5-89.2h-92.2v92.6c-0.3,6.7,1.5,13.3,5.1,18.9
c1.7,2.5,4.1,4.4,6.8,5.7c2.7,1.3,5.7,1.9,8.7,1.7c5.5-0.1,10.9-2,15.3-5.4c5-3.6,9.3-8.1,12.8-13.2c0.3-0.9,0.9-1.7,1.7-2.2
c0.6-0.5,1.4-0.8,2.2-0.8c1.6,0.1,3.1,0.8,4.3,1.8c1.5,1.7,2.4,4,2.3,6.3c-0.2,1.6-0.5,3.1-0.8,4.6c-3.3,7.9-8.8,14.7-15.8,19.6
c-6.5,4.4-14.3,6.8-22.2,6.7c-20,0-33.8-3.9-41.5-11.8c-4-4.3-7-9.4-9-15c-2-5.5-2.8-11.4-2.5-17.3v-92.4h-46.9v-17.2H332v-39.2
l-10.8-10.8v-8.8h31.3l11.8,6.1v52.7l121.8-0.4l12.1,12.2l-74.7,75c4.5-1.8,9.3-3,14.1-3.4c9.6,0.4,18.9,3.1,27.3,7.8
c9.7,4.6,17.8,11.9,23.5,21c5.1,7.7,8.7,16.3,10.6,25.3c1.6,7.1,2.4,14.4,2.5,21.7c0,13.9-3.1,27.6-9.2,40.1
c-5.8,12.1-15.6,21.9-27.7,27.7C452.3,446,438.6,449.1,424.8,449.1L424.8,449.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -5,6 +5,7 @@ import { nearAddresses } from '@/utils/NearWalletUtil'
import { solanaAddresses } from '@/utils/SolanaWalletUtil'
import { elrondAddresses } from '@/utils/ElrondWalletUtil'
import { tronAddresses } from '@/utils/TronWalletUtil'
import { tezosAddresses } from '@/utils/TezosWalletUtil'
import { useSnapshot } from 'valtio'
export default function AccountPicker() {
@ -19,6 +20,7 @@ export default function AccountPicker() {
SettingsStore.setNearAddress(nearAddresses[account])
SettingsStore.setElrondAddress(elrondAddresses[account])
SettingsStore.setTronAddress(tronAddresses[account])
SettingsStore.setTezosAddress(tezosAddresses[account])
}
return (

View File

@ -8,6 +8,7 @@ import SessionSignPolkadotModal from '@/views/SessionSignPolkadotModal'
import SessionSignSolanaModal from '@/views/SessionSignSolanaModal'
import SessionSignElrondModal from '@/views/SessionSignElrondModal'
import SessionSignTronModal from '@/views/SessionSignTronModal'
import SessionSignTezosModal from '@/views/SessionSignTezosModal'
import SessionSignTypedDataModal from '@/views/SessionSignTypedDataModal'
import SessionUnsuportedMethodModal from '@/views/SessionUnsuportedMethodModal'
import LegacySessionProposalModal from '@/views/LegacySessionProposalModal'
@ -33,6 +34,7 @@ export default function Modal() {
{view === 'SessionSignNearModal' && <SessionSignNearModal />}
{view === 'SessionSignElrondModal' && <SessionSignElrondModal />}
{view === 'SessionSignTronModal' && <SessionSignTronModal />}
{view === 'SessionSignTezosModal' && <SessionSignTezosModal />}
{view === 'LegacySessionProposalModal' && <LegacySessionProposalModal />}
{view === 'LegacySessionSignModal' && <LegacySessionSignModal />}
{view === 'LegacySessionSignTypedDataModal' && <LegacySessionSignTypedDataModal />}

View File

@ -0,0 +1,46 @@
type ChainMetadata = {
chainId: string
name: string
logo: string
rgb: string
rpc: string
}
/**
* Types
*/
export type TTezosChain = keyof typeof TEZOS_MAINNET_CHAINS
/**
* Chains
*/
export const TEZOS_MAINNET_CHAINS: Record<string, ChainMetadata> = {
'tezos:mainnet': {
chainId: 'mainnet',
name: 'Tezos',
logo: '/chain-logos/tezos.svg',
rgb: '44, 125, 247',
rpc: 'https://mainnet.api.tez.ie'
}
}
export const TEZOS_TEST_CHAINS: Record<string, ChainMetadata> = {
'tezos:testnet': {
chainId: 'testnet',
name: 'Tezos Testnet',
logo: '/chain-logos/tezos.svg',
rgb: '44, 125, 247',
rpc: 'https://ghostnet.ecadinfra.com'
}
}
export const TEZOS_CHAINS = { ...TEZOS_MAINNET_CHAINS, ...TEZOS_TEST_CHAINS }
/**
* Methods
*/
export const TEZOS_SIGNING_METHODS = {
TEZOS_GET_ACCOUNTS: 'tezos_getAccounts',
TEZOS_SEND: 'tezos_send',
TEZOS_SIGN: 'tezos_sign'
}

View File

@ -5,6 +5,7 @@ import { createOrRestoreSolanaWallet } from '@/utils/SolanaWalletUtil'
import { createOrRestorePolkadotWallet } from '@/utils/PolkadotWalletUtil'
import { createOrRestoreElrondWallet } from '@/utils/ElrondWalletUtil'
import { createOrRestoreTronWallet } from '@/utils/TronWalletUtil'
import { createOrRestoreTezosWallet } from '@/utils/TezosWalletUtil'
import { createSignClient } from '@/utils/WalletConnectUtil'
import { useCallback, useEffect, useRef, useState } from 'react'
import { useSnapshot } from 'valtio'
@ -25,6 +26,7 @@ export default function useInitialization() {
const { nearAddresses } = await createOrRestoreNearWallet()
const { elrondAddresses } = await createOrRestoreElrondWallet()
const { tronAddresses } = await createOrRestoreTronWallet()
const { tezosAddresses } = await createOrRestoreTezosWallet()
SettingsStore.setEIP155Address(eip155Addresses[0])
SettingsStore.setCosmosAddress(cosmosAddresses[0])
@ -33,6 +35,7 @@ export default function useInitialization() {
SettingsStore.setNearAddress(nearAddresses[0])
SettingsStore.setElrondAddress(elrondAddresses[0])
SettingsStore.setTronAddress(tronAddresses[0])
SettingsStore.setTezosAddress(tezosAddresses[0])
await createSignClient(relayerRegionURL)
prevRelayerURLValue.current = relayerRegionURL

View File

@ -10,6 +10,7 @@ import { SignClientTypes } from '@walletconnect/types'
import { useCallback, useEffect } from 'react'
import { NEAR_SIGNING_METHODS } from '@/data/NEARData'
import { approveNearRequest } from '@/utils/NearRequestHandlerUtil'
import { TEZOS_SIGNING_METHODS } from '@/data/TezosData'
export default function useWalletConnectEventsManager(initialized: boolean) {
/******************************************************************************
@ -81,6 +82,10 @@ export default function useWalletConnectEventsManager(initialized: boolean) {
case TRON_SIGNING_METHODS.TRON_SIGN_MESSAGE:
case TRON_SIGNING_METHODS.TRON_SIGN_TRANSACTION:
return ModalStore.open('SessionSignTronModal', { requestEvent, requestSession })
case TEZOS_SIGNING_METHODS.TEZOS_GET_ACCOUNTS:
case TEZOS_SIGNING_METHODS.TEZOS_SEND:
case TEZOS_SIGNING_METHODS.TEZOS_SIGN:
return ModalStore.open('SessionSignTezosModal', { requestEvent, requestSession })
default:
return ModalStore.open('SessionUnsuportedMethodModal', { requestEvent, requestSession })
}

View File

@ -0,0 +1,109 @@
import { TezosToolkit } from '@taquito/taquito'
import { InMemorySigner } from '@taquito/signer'
import { localForger } from '@taquito/local-forging'
import Keyring from 'mnemonic-keyring'
/**
* Constants
*/
const DEFAULT_PATH = "m/44'/1729'/0'/0'"
const DEFAULT_CURVE = 'ed25519'
/**
* Types
*/
interface IInitArguments {
mnemonic?: string
path?: string
curve?: 'ed25519' | 'secp256k1'
}
/**
* Library
*/
export default class TezosLib {
tezos: TezosToolkit
signer: InMemorySigner
mnemonic: string
secretKey: string
publicKey: string
address: string
curve: 'ed25519' | 'secp256k1'
constructor(
tezos: TezosToolkit,
mnemonic: string,
signer: InMemorySigner,
secretKey: string,
publicKey: string,
address: string,
curve: 'ed25519' | 'secp256k1'
) {
this.tezos = tezos
this.mnemonic = mnemonic
this.signer = signer
this.secretKey = secretKey
this.publicKey = publicKey
this.address = address
this.curve = curve
}
static async init({ mnemonic, path, curve }: IInitArguments) {
const params = {
mnemonic: mnemonic ?? Keyring.generateMnemonic(),
derivationPath: path ?? DEFAULT_PATH,
curve: curve ?? DEFAULT_CURVE
}
const Tezos = new TezosToolkit('https://mainnet.api.tez.ie')
const signer = InMemorySigner.fromMnemonic(params)
Tezos.setSignerProvider(signer)
const secretKey = await signer.secretKey()
const publicKey = await signer.publicKey()
const address = await signer.publicKeyHash()
return new TezosLib(Tezos, params.mnemonic, signer, secretKey, publicKey, address, params.curve)
}
public getMnemonic() {
return this.mnemonic
}
public getPublicKey() {
return this.publicKey
}
public getCurve() {
return this.curve
}
public getAddress() {
return this.address
}
public async signTransaction(transaction: any) {
const prepared = await this.tezos.prepare.batch(
transaction.map((tx: any) => ({
amount: tx.amount,
to: tx.destination,
kind: tx.kind,
mutez: true
}))
)
const forged = await localForger.forge(prepared.opOb)
const tx = await this.signer.sign(forged, new Uint8Array([3]))
const hash = await this.tezos.rpc.injectOperation(tx.sbytes)
return hash
}
public async signPayload(payload: any) {
return await this.signer.sign(payload)
}
}

View File

@ -12,6 +12,7 @@ import { Text } from '@nextui-org/react'
import { Fragment } from 'react'
import { useSnapshot } from 'valtio'
import { NEAR_TEST_CHAINS } from '@/data/NEARData'
import { TEZOS_MAINNET_CHAINS, TEZOS_TEST_CHAINS } from '@/data/TezosData'
export default function HomePage() {
const {
@ -22,7 +23,8 @@ export default function HomePage() {
polkadotAddress,
nearAddress,
elrondAddress,
tronAddress
tronAddress,
tezosAddress
} = useSnapshot(SettingsStore.state)
return (
@ -51,6 +53,9 @@ export default function HomePage() {
{Object.values(TRON_MAINNET_CHAINS).map(({ name, logo, rgb }) => (
<AccountCard key={name} name={name} logo={logo} rgb={rgb} address={tronAddress} />
))}
{Object.values(TEZOS_MAINNET_CHAINS).map(({ name, logo, rgb }) => (
<AccountCard key={name} name={name} logo={logo} rgb={rgb} address={tezosAddress} />
))}
{testNets ? (
<Fragment>
@ -75,6 +80,9 @@ export default function HomePage() {
{Object.values(TRON_TEST_CHAINS).map(({ name, logo, rgb }) => (
<AccountCard key={name} name={name} logo={logo} rgb={rgb} address={tronAddress} />
))}
{Object.values(TEZOS_TEST_CHAINS).map(({ name, logo, rgb }) => (
<AccountCard key={name} name={name} logo={logo} rgb={rgb} address={tezosAddress} />
))}
</Fragment>
) : null}
</Fragment>

View File

@ -10,11 +10,18 @@ import { Card, Divider, Row, Switch, Text } from '@nextui-org/react'
import { Fragment } from 'react'
import { useSnapshot } from 'valtio'
import packageJSON from '../../package.json'
import { tezosWallets } from '@/utils/TezosWalletUtil'
export default function SettingsPage() {
const { testNets, eip155Address, cosmosAddress, solanaAddress, elrondAddress, tronAddress } = useSnapshot(
SettingsStore.state
)
const {
testNets,
eip155Address,
cosmosAddress,
solanaAddress,
elrondAddress,
tronAddress,
tezosAddress
} = useSnapshot(SettingsStore.state)
return (
<Fragment>
@ -96,6 +103,13 @@ export default function SettingsPage() {
<Card bordered borderWeight="light" css={{ minHeight: '100px', wordWrap: 'break-word' }}>
<Text css={{ fontFamily: '$mono' }}>{tronWallets[tronAddress].privateKey}</Text>
</Card>
<Text h4 css={{ marginTop: '$10', marginBottom: '$5' }}>
Tezos Mnemonic
</Text>
<Card bordered borderWeight="light" css={{ minHeight: '100px', wordWrap: 'break-word' }}>
<Text css={{ fontFamily: '$mono' }}>{tezosWallets[tezosAddress].getMnemonic()}</Text>
</Card>
</Fragment>
)
}

View File

@ -31,6 +31,7 @@ interface State {
| 'SessionSignNearModal'
| 'SessionSignElrondModal'
| 'SessionSignTronModal'
| 'SessionSignTezosModal'
| 'LegacySessionProposalModal'
| 'LegacySessionSignModal'
| 'LegacySessionSignTypedDataModal'

View File

@ -13,6 +13,7 @@ interface State {
nearAddress: string
elrondAddress: string
tronAddress: string
tezosAddress: string
relayerRegionURL: string
}
@ -29,6 +30,7 @@ const state = proxy<State>({
nearAddress: '',
elrondAddress: '',
tronAddress: '',
tezosAddress: '',
relayerRegionURL: ''
})
@ -72,6 +74,10 @@ const SettingsStore = {
state.tronAddress = tronAddress
},
setTezosAddress(tezosAddress: string) {
state.tezosAddress = tezosAddress
},
toggleTestNets() {
state.testNets = !state.testNets
if (state.testNets) {

View File

@ -125,6 +125,13 @@ export function isElrondChain(chain: string) {
return chain.includes('tron')
}
/**
* Check if chain is part of Tezos standard
*/
export function isTezosChain(chain: string) {
return chain.includes('tezos')
}
/**
* Formats chainId to its name
*/

View File

@ -0,0 +1,46 @@
import { TEZOS_SIGNING_METHODS } from '@/data/TezosData'
import { tezosWallets } from '@/utils/TezosWalletUtil'
import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils'
import { SignClientTypes } from '@walletconnect/types'
import { getSdkError } from '@walletconnect/utils'
export async function approveTezosRequest(
requestEvent: SignClientTypes.EventArguments['session_request']
) {
const { params, id } = requestEvent
const { request } = params
const wallet = tezosWallets[request.params.account ?? Object.keys(tezosWallets)[0]]
const allWallets = Object.keys(tezosWallets).map(key => tezosWallets[key])
switch (request.method) {
case TEZOS_SIGNING_METHODS.TEZOS_GET_ACCOUNTS:
return formatJsonRpcResult(
id,
allWallets.map(wallet => ({
algo: wallet.getCurve(),
address: wallet.getAddress(),
pubkey: wallet.getPublicKey()
}))
)
case TEZOS_SIGNING_METHODS.TEZOS_SEND:
const sendResponse = await wallet.signTransaction(request.params.operations)
return formatJsonRpcResult(id, { hash: sendResponse })
case TEZOS_SIGNING_METHODS.TEZOS_SIGN:
const signResponse = await wallet.signPayload(request.params.payload)
return formatJsonRpcResult(id, { signature: signResponse.prefixSig })
default:
throw new Error(getSdkError('INVALID_METHOD').message)
}
}
export function rejectTezosRequest(request: SignClientTypes.EventArguments['session_request']) {
const { id } = request
return formatJsonRpcError(id, getSdkError('USER_REJECTED_METHODS').message)
}

View File

@ -0,0 +1,50 @@
import TezosLib from '@/lib/TezosLib'
export let wallet1: TezosLib
export let wallet2: TezosLib
export let tezosWallets: Record<string, TezosLib>
export let tezosAddresses: string[]
let address1: string
let address2: string
/**
* Utilities
*/
export function getTezosWallet(address: string) {
let wallet = Object.entries(tezosWallets).find(([walletAddress, _]) => {
return address === walletAddress
})
return wallet?.[1]
}
export async function createOrRestoreTezosWallet() {
const mnemonic1 = localStorage.getItem('TEZOS_MNEMONIC_1')
const mnemonic2 = localStorage.getItem('TEZOS_MNEMONIC_2')
if (mnemonic1 && mnemonic2) {
wallet1 = await TezosLib.init({ mnemonic: mnemonic1 })
wallet2 = await TezosLib.init({ mnemonic: mnemonic2 })
} else {
wallet1 = await TezosLib.init({})
wallet2 = await TezosLib.init({})
// Don't store mnemonic in local storage in a production project!
localStorage.setItem('TEZOS_MNEMONIC_1', wallet1.getMnemonic())
localStorage.setItem('TEZOS_MNEMONIC_2', wallet2.getMnemonic())
}
address1 = wallet1.getAddress()
address2 = wallet2.getAddress()
tezosWallets = {
[address1]: wallet1,
[address2]: wallet2
}
tezosAddresses = Object.keys(tezosWallets)
return {
tezosWallets,
tezosAddresses
}
}

View File

@ -8,6 +8,7 @@ import { eip155Addresses } from '@/utils/EIP155WalletUtil'
import { polkadotAddresses } from '@/utils/PolkadotWalletUtil'
import { elrondAddresses } from '@/utils/ElrondWalletUtil'
import { tronAddresses } from '@/utils/TronWalletUtil'
import { tezosAddresses } from '@/utils/TezosWalletUtil'
import {
isCosmosChain,
isEIP155Chain,
@ -15,7 +16,8 @@ import {
isPolkadotChain,
isNearChain,
isElrondChain,
isTronChain
isTronChain,
isTezosChain
} from '@/utils/HelperUtil'
import { solanaAddresses } from '@/utils/SolanaWalletUtil'
import { signClient } from '@/utils/WalletConnectUtil'
@ -161,6 +163,15 @@ export default function SessionProposalModal() {
chain={chain}
/>
)
} else if (isTezosChain(chain)) {
return (
<ProposalSelectSection
addresses={tezosAddresses}
selectedAddresses={selectedAccounts[chain]}
onSelect={onSelectAccount}
chain={chain}
/>
)
}
}

View File

@ -0,0 +1,78 @@
import ProjectInfoCard from '@/components/ProjectInfoCard'
import RequestDataCard from '@/components/RequestDataCard'
import RequesDetailsCard from '@/components/RequestDetalilsCard'
import RequestMethodCard from '@/components/RequestMethodCard'
import RequestModalContainer from '@/components/RequestModalContainer'
import ModalStore from '@/store/ModalStore'
import { approveTezosRequest, rejectTezosRequest } from '@/utils/TezosRequestHandlerUtil'
import { signClient } from '@/utils/WalletConnectUtil'
import { Button, Divider, Modal, Text } from '@nextui-org/react'
import { Fragment } from 'react'
export default function SessionSignTezosModal() {
// Get request and wallet data from store
const requestEvent = ModalStore.state.data?.requestEvent
const requestSession = ModalStore.state.data?.requestSession
// Ensure request and wallet are defined
if (!requestEvent || !requestSession) {
return <Text>Missing request data</Text>
}
// Get required request data
const { topic, params } = requestEvent
const { request, chainId } = params
// Handle approve action (logic varies based on request method)
async function onApprove() {
if (requestEvent) {
const response = await approveTezosRequest(requestEvent)
await signClient.respond({
topic,
response
})
ModalStore.close()
}
}
// Handle reject action
async function onReject() {
if (requestEvent) {
const response = rejectTezosRequest(requestEvent)
await signClient.respond({
topic,
response
})
ModalStore.close()
}
}
return (
<Fragment>
<RequestModalContainer title="Sign Message">
<ProjectInfoCard metadata={requestSession.peer.metadata} />
<Divider y={2} />
<RequesDetailsCard chains={[chainId ?? '']} protocol={requestSession.relay.protocol} />
<Divider y={2} />
<RequestDataCard data={params} />
<Divider y={2} />
<RequestMethodCard methods={[request.method]} />
</RequestModalContainer>
<Modal.Footer>
<Button auto flat color="error" onClick={onReject}>
Reject
</Button>
<Button auto flat color="success" onClick={onApprove}>
Approve
</Button>
</Modal.Footer>
</Fragment>
)
}

View File

@ -1310,6 +1310,11 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111"
integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==
"@noble/hashes@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==
"@noble/secp256k1@1.7.0", "@noble/secp256k1@^1.6.3":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1"
@ -2093,6 +2098,15 @@
dependencies:
"@stablelib/int" "^1.0.1"
"@stablelib/blake2b@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/blake2b/-/blake2b-1.0.1.tgz#0045a77e182c4cf3260bc9b533fc4cd5c287f8ea"
integrity sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA==
dependencies:
"@stablelib/binary" "^1.0.1"
"@stablelib/hash" "^1.0.1"
"@stablelib/wipe" "^1.0.1"
"@stablelib/bytes@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8"
@ -2123,7 +2137,7 @@
resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35"
integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==
"@stablelib/ed25519@^1.0.2":
"@stablelib/ed25519@^1.0.2", "@stablelib/ed25519@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996"
integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==
@ -2167,6 +2181,27 @@
dependencies:
"@stablelib/bytes" "^1.0.1"
"@stablelib/nacl@^1.0.4":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@stablelib/nacl/-/nacl-1.0.4.tgz#b63e0a1b87eccb13ad91dd46b2382112acfa417e"
integrity sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw==
dependencies:
"@stablelib/poly1305" "^1.0.1"
"@stablelib/random" "^1.0.2"
"@stablelib/wipe" "^1.0.1"
"@stablelib/x25519" "^1.0.3"
"@stablelib/xsalsa20" "^1.0.2"
"@stablelib/pbkdf2@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/pbkdf2/-/pbkdf2-1.0.1.tgz#ba4d4379385db3ca46fb48e504ff7933c451be1d"
integrity sha512-d5jwK6jW1DkMyzqY8D1Io+fRXcsUVr95lk5LKX9ghaUdAITTc1ZL0bff+R0IrwSixbHluxhnivG7vDw59AZ/Nw==
dependencies:
"@stablelib/binary" "^1.0.1"
"@stablelib/hash" "^1.0.1"
"@stablelib/hmac" "^1.0.1"
"@stablelib/wipe" "^1.0.1"
"@stablelib/poly1305@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc"
@ -2183,6 +2218,15 @@
"@stablelib/binary" "^1.0.1"
"@stablelib/wipe" "^1.0.1"
"@stablelib/salsa20@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@stablelib/salsa20/-/salsa20-1.0.2.tgz#95177331f89a59d1c90f153f53265c925d4de138"
integrity sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA==
dependencies:
"@stablelib/binary" "^1.0.1"
"@stablelib/constant-time" "^1.0.1"
"@stablelib/wipe" "^1.0.1"
"@stablelib/sha256@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f"
@ -2215,6 +2259,15 @@
"@stablelib/random" "^1.0.2"
"@stablelib/wipe" "^1.0.1"
"@stablelib/xsalsa20@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz#89efc22a7ba432880ef11d876fdeba13529ccdc4"
integrity sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog==
dependencies:
"@stablelib/binary" "^1.0.1"
"@stablelib/salsa20" "^1.0.2"
"@stablelib/wipe" "^1.0.1"
"@stitches/react@1.2.7":
version "1.2.7"
resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.2.7.tgz#aea2403fac726db66d1740d29557e3910b1a1dc7"
@ -2225,6 +2278,94 @@
resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.34.0.tgz#b6faed02343da7a8956444f5db23bc7246dd5fb5"
integrity sha512-8Df5usnWvjnw/WRAmKOqHXRPPRfiCd1kIN8ttH4YmBrRTERjVInsdu0xvLdbyUYKyvgK6zKhHWQfYohXqllHhg==
"@taquito/http-utils@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/http-utils/-/http-utils-15.1.0.tgz#66f3ce220c483e33d6b31bca6e0c76b5b895ed9b"
integrity sha512-Uug5hN0XvMlFFN+rxSMW+Y9Z8pw5uqHRDZC83eLOBSijbpMo+ScG/2nKkC8MUUrqLaLeHru1HD4kT5DHc1fI+A==
dependencies:
"@vespaiach/axios-fetch-adapter" "github:ecadlabs/axios-fetch-adapter"
axios "^0.26.0"
"@taquito/local-forging@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/local-forging/-/local-forging-15.1.0.tgz#11404d4b90d4b1f4f6e3f7aa591e8227bf08e246"
integrity sha512-ib/2RqtxQQC9SjyTB9T5OSc5yUx9GUSdMOA4dmtiiFcN2+AG+aw7ixn6Hjt9Td8ZIOPt9H6HkyTypKrX7+cENw==
dependencies:
"@taquito/utils" "^15.1.0"
bignumber.js "^9.1.0"
"@taquito/michel-codec@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/michel-codec/-/michel-codec-15.1.0.tgz#b4452757ff02c40b110ec5ecafad1f659e1de4e3"
integrity sha512-wKucIhs7vhaq5H+YSF2f6Qu9+g+QiEL6MPc5ROpxBrXJTeKSwBOEIpfqcKfkfMuecJyHZJW3glNfkpAVTCgkxg==
"@taquito/michelson-encoder@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/michelson-encoder/-/michelson-encoder-15.1.0.tgz#1b3250445d4cc7e945e6a0ed9f8deaf209e62ada"
integrity sha512-uQMEu3g+8WcYb5ZV6+XGvoWJhKoNxU0F2RqodLJB7UxQ1rI/OMa+VlxSLMt4niIxpKXqnO9j4tD7Y4mPC3ufaA==
dependencies:
"@taquito/rpc" "^15.1.0"
"@taquito/utils" "^15.1.0"
bignumber.js "^9.1.0"
fast-json-stable-stringify "^2.1.0"
"@taquito/rpc@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/rpc/-/rpc-15.1.0.tgz#47f973d1f7d15cb56a4095c7a2a4d1803c5181c7"
integrity sha512-OeQA8QwT+s6IUmLaF5yeWruPYzWi/DVCA3kl+AaQ8IFfCMzmAW/MszbbNkJSzHpY2p4jPBwdRNxg3qeJdL482A==
dependencies:
"@taquito/http-utils" "^15.1.0"
"@taquito/utils" "^15.1.0"
bignumber.js "^9.1.0"
"@taquito/signer@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/signer/-/signer-15.1.0.tgz#0cb7bc9612e7f5ffbefc274f0aa6da27f5d755fd"
integrity sha512-VP7hS8cYQ6cMerVkbD5X3AqpoIXvh72xNuv3++R4reEjdl+E3VWs1CZZGnJj6yzlFV21SrdGKSILx8Rl3Ql4DA==
dependencies:
"@stablelib/blake2b" "^1.0.1"
"@stablelib/ed25519" "^1.0.3"
"@stablelib/hmac" "^1.0.1"
"@stablelib/nacl" "^1.0.4"
"@stablelib/pbkdf2" "^1.0.1"
"@stablelib/sha512" "^1.0.1"
"@taquito/taquito" "^15.1.0"
"@taquito/utils" "^15.1.0"
"@types/bn.js" "^5.1.1"
bip39 "^3.0.4"
elliptic "^6.5.4"
pbkdf2 "^3.1.2"
typedarray-to-buffer "^4.0.0"
"@taquito/taquito@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/taquito/-/taquito-15.1.0.tgz#9a3340a8bcaa8bd6e9567776cea1c1659aafe5e9"
integrity sha512-2AXWeNoXsmMOSkJVXtXjOlJkS+hKXITaSybMA6nJuS1YWY4e7iAr678Y6UgVEHRJxeGohX4R4Ww12Ymr3Sfedg==
dependencies:
"@taquito/http-utils" "^15.1.0"
"@taquito/local-forging" "^15.1.0"
"@taquito/michel-codec" "^15.1.0"
"@taquito/michelson-encoder" "^15.1.0"
"@taquito/rpc" "^15.1.0"
"@taquito/utils" "^15.1.0"
bignumber.js "^9.1.0"
rxjs "^6.6.3"
"@taquito/utils@^15.1.0":
version "15.1.0"
resolved "https://registry.yarnpkg.com/@taquito/utils/-/utils-15.1.0.tgz#c72f07c4fe369920620809a23808817db4b7a221"
integrity sha512-lqVThoFMmOKPg9jyREr4A63cpeckf5esCwOyOAW3sm+yCxD9s5khnBPtH8s52cRVnChFdwk/eqmADka9gat5hw==
dependencies:
"@stablelib/blake2b" "^1.0.1"
"@stablelib/ed25519" "^1.0.3"
"@types/bs58check" "^2.1.0"
bignumber.js "^9.1.0"
blakejs "^1.2.1"
bs58check "^2.1.2"
buffer "^6.0.3"
elliptic "^6.5.4"
typedarray-to-buffer "^4.0.0"
"@tsconfig/node10@^1.0.7":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
@ -2252,6 +2393,13 @@
dependencies:
"@types/node" "*"
"@types/bs58check@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@types/bs58check/-/bs58check-2.1.0.tgz#7d25a8b88fe7a9e315d2647335ee3c43c8fdb0c0"
integrity sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==
dependencies:
"@types/node" "*"
"@types/connect@^3.4.33":
version "3.4.35"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
@ -2369,6 +2517,10 @@
"@typescript-eslint/types" "5.42.1"
eslint-visitor-keys "^3.3.0"
"@vespaiach/axios-fetch-adapter@github:ecadlabs/axios-fetch-adapter":
version "0.3.1"
resolved "https://codeload.github.com/ecadlabs/axios-fetch-adapter/tar.gz/05cf8ba547aae387933939850231e8abaf323efe"
"@walletconnect/browser-utils@^1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951"
@ -2885,7 +3037,7 @@ axe-core@^4.4.3:
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.1.tgz#04d561c11b6d76d096d34e9d14ba2c294fb20cdc"
integrity sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==
axios@^0.26.1:
axios@^0.26.0, axios@^0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
@ -2983,6 +3135,11 @@ bignumber.js@^9.0.1:
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62"
integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==
bignumber.js@^9.1.0:
version "9.1.1"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6"
integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@ -3028,6 +3185,13 @@ bip39@^3.0.2, bip39@^3.0.3:
pbkdf2 "^3.0.9"
randombytes "^2.0.1"
bip39@^3.0.4:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3"
integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==
dependencies:
"@noble/hashes" "^1.2.0"
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@ -3052,6 +3216,11 @@ blake2b@2.1.3:
blake2b-wasm "^1.1.0"
nanoassert "^1.0.0"
blakejs@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
bn.js@4.11.8:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@ -3136,7 +3305,7 @@ bs58@^4.0.0, bs58@^4.0.1:
dependencies:
base-x "^3.0.2"
bs58check@<3.0.0, bs58check@^2.1.1:
bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
@ -3153,7 +3322,7 @@ buffer@6.0.1:
base64-js "^1.3.1"
ieee754 "^1.2.1"
buffer@6.0.3, buffer@~6.0.3:
buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
@ -4044,7 +4213,7 @@ fast-glob@^3.2.9:
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-json-stable-stringify@^2.0.0:
fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@ -5319,7 +5488,7 @@ pathval@^1.1.1:
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
pbkdf2@^3.0.9:
pbkdf2@^3.0.9, pbkdf2@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
@ -5740,6 +5909,13 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
rxjs@^6.6.3:
version "6.6.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
dependencies:
tslib "^1.9.0"
rxjs@^7.5.7:
version "7.5.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
@ -6192,7 +6368,7 @@ tsconfig-paths@^3.14.1:
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@1.14.1, tslib@^1.8.1:
tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@ -6245,6 +6421,11 @@ typedarray-to-buffer@3.1.5:
dependencies:
is-typedarray "^1.0.0"
typedarray-to-buffer@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz#cdd2933c61dd3f5f02eda5d012d441f95bfeb50a"
integrity sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==
typeforce@^1.11.5:
version "1.18.0"
resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"