Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,752 changes: 2,538 additions & 214 deletions demo/vue-app-new/package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions demo/vue-app-new/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@
"lint": "eslint --cache --fix"
},
"dependencies": {
"@solana/web3.js": "^1.98.4",
"@solana/kit": "^5.4.0",
"@solana-program/system": "^0.10.0",
"@tanstack/vue-query": "^5.92.6",
"@toruslabs/base-controllers": "^8.15.0",
"@toruslabs/bs58": "^1.0.0",
"@toruslabs/ethereum-controllers": "^8.15.0",
"@toruslabs/solana-controllers": "^8.15.0",
"@toruslabs/tweetnacl-js": "^1.0.4",
Expand Down
55 changes: 24 additions & 31 deletions demo/vue-app-new/src/components/AppDashboard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ import { useI18n } from "petite-vue-i18n";
import { useSignAndSendTransaction, useSignMessage as useSolanaSignMessage, useSignTransaction, useSolanaWallet } from "@web3auth/modal/vue/solana";
import { useAccount, useBalance, useChainId, useSignMessage, useSignTypedData, useSwitchChain as useWagmiSwitchChain } from "@wagmi/vue";

import { LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from "@solana/web3.js";
import { generateLegacyTransaction, generateSolTransferInstruction } from "../utils/solana";
import { ProviderConfig } from "@toruslabs/base-controllers";
import { SUPPORTED_NETWORKS } from "@toruslabs/ethereum-controllers";
import { computed, ref, watch } from "vue";
import { getPrivateKey, sendEth, sendEthWithSmartAccount, signTransaction as signEthTransaction } from "../services/ethHandlers";
import { getBalance as getSolBalance, getPrivateKey as getSolPrivateKey, signAllTransactions } from "../services/solHandlers";
import { getBalance as getSolBalance, getPrivateKey as getSolPrivateKey } from "../services/solHandlers";
import { formDataStore } from "../store/form";
import { SOLANA_SUPPORTED_NETWORKS } from "../utils/constants";

Expand Down Expand Up @@ -59,7 +59,7 @@ const balance = useBalance({
address: address,
});

const { accounts: solanaAccounts, connection } = useSolanaWallet();
const { accounts: solanaAccounts, rpc, solanaWallet } = useSolanaWallet();
const { signMessage: signSolanaMessage } = useSolanaSignMessage();
const { signTransaction: signSolTransaction } = useSignTransaction();
const { signAndSendTransaction } = useSignAndSendTransaction();
Expand Down Expand Up @@ -242,43 +242,23 @@ const onGetSolPrivateKey = async () => {

const onSignAndSendTransaction = async () => {
if (!solanaAccounts.value) throw new Error("No account connected");
if (!connection.value) throw new Error("No connection");
const block = await connection.value?.getLatestBlockhash("finalized");
if (!rpc.value) throw new Error("No RPC connection");
const pubKey = solanaAccounts.value[0];

const transactionInstruction = SystemProgram.transfer({
fromPubkey: new PublicKey(pubKey),
toPubkey: new PublicKey(pubKey),
lamports: 0.01 * LAMPORTS_PER_SOL,
});

const transaction = new Transaction({
blockhash: block.blockhash,
lastValidBlockHeight: block.lastValidBlockHeight,
feePayer: new PublicKey(pubKey),
}).add(transactionInstruction);
const instruction = generateSolTransferInstruction(pubKey, pubKey, 0.01);
const transaction = await generateLegacyTransaction(rpc.value, pubKey, [instruction]);

const data = await signAndSendTransaction(transaction);
printToConsole("result", data);
};

const onSignSolTransaction = async () => {
if (!solanaAccounts.value) throw new Error("No account connected");
if (!connection.value) throw new Error("No connection");
const block = await connection.value?.getLatestBlockhash("finalized");
if (!rpc.value) throw new Error("No RPC connection");
const pubKey = solanaAccounts.value[0];

const transactionInstruction = SystemProgram.transfer({
fromPubkey: new PublicKey(pubKey),
toPubkey: new PublicKey(pubKey),
lamports: 0.01 * LAMPORTS_PER_SOL,
});

const transaction = new Transaction({
blockhash: block.blockhash,
lastValidBlockHeight: block.lastValidBlockHeight,
feePayer: new PublicKey(pubKey),
}).add(transactionInstruction);
const instruction = generateSolTransferInstruction(pubKey, pubKey, 0.01);
const transaction = await generateLegacyTransaction(rpc.value, pubKey, [instruction]);

const result = await signSolTransaction(transaction);
printToConsole("result", result);
Expand All @@ -290,11 +270,24 @@ const onSignSolMessage = async () => {
};

const onGetSolBalance = async () => {
await getSolBalance(provider.value as IProvider, printToConsole);
if (!rpc.value) throw new Error("No RPC connection");
if (!solanaAccounts.value) throw new Error("No account connected");
await getSolBalance(rpc.value, solanaAccounts.value[0], printToConsole);
};

const onSignAllTransactions = async () => {
await signAllTransactions(provider.value as IProvider, printToConsole);
if (!rpc.value) throw new Error("No RPC connection");
if (!solanaAccounts.value) throw new Error("No account connected");
if (!solanaWallet.value) throw new Error("No Solana wallet");

const account = solanaAccounts.value[0];
const instruction = generateSolTransferInstruction(account, account, 0.1);
const tx1 = await generateLegacyTransaction(rpc.value, account, [instruction]);
const tx2 = await generateLegacyTransaction(rpc.value, account, [instruction]);
const tx3 = await generateLegacyTransaction(rpc.value, account, [instruction]);

const signedTransactions = await solanaWallet.value.signAllTransactions([tx1, tx2, tx3]);
printToConsole("signed transactions", { signedTransactions });
};

// Common
Expand Down
139 changes: 8 additions & 131 deletions demo/vue-app-new/src/services/solHandlers.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,11 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Connection, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from "@solana/web3.js";
import { CustomChainConfig, IProvider, log, SolanaWallet, TransactionOrVersionedTransaction } from "@web3auth/modal";
import { address, type Rpc, type SolanaRpcApi } from "@solana/kit";
import { IProvider, log } from "@web3auth/modal";
import { SOLANA_METHOD_TYPES } from "@web3auth/ws-embed";

export const getConnection = async (provider: IProvider): Promise<Connection> => {
const solanaWallet = new SolanaWallet(provider);
/** Logger function type for demo console output */
type UIConsole = (title: string, data: unknown) => void;

const connectionConfig = await solanaWallet.request<never, CustomChainConfig>({ method: "solana_provider_config" });
const conn = new Connection(connectionConfig.rpcTarget);
return conn;
};

function getNewTx(publicKeys: any, blockhash: any) {
const inst = SystemProgram.transfer({
fromPubkey: new PublicKey(publicKeys[0]),
toPubkey: new PublicKey(publicKeys[0]),
lamports: 0.1 * LAMPORTS_PER_SOL,
});
return new Transaction({ recentBlockhash: blockhash, feePayer: new PublicKey(publicKeys![0]) }).add(inst);
}

export const getAccounts = async (provider: IProvider, uiConsole: any): Promise<string[] | undefined> => {
try {
const solWeb3 = new SolanaWallet(provider);
const acc = await solWeb3.requestAccounts();
uiConsole("accounts", acc);
return acc;
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
return [];
}
};

export const getPrivateKey = async (provider: IProvider, uiConsole: any): Promise<string | undefined> => {
export const getPrivateKey = async (provider: IProvider, uiConsole: UIConsole): Promise<string | undefined> => {
try {
const privateKey = (await provider.request({
method: SOLANA_METHOD_TYPES.SOLANA_PRIVATE_KEY,
Expand All @@ -48,105 +20,10 @@ export const getPrivateKey = async (provider: IProvider, uiConsole: any): Promis
}
};

export const getBalance = async (provider: IProvider, uiConsole: any): Promise<void> => {
try {
const conn = await getConnection(provider);
const solanaWallet = new SolanaWallet(provider);
const accounts = await solanaWallet.requestAccounts();
const balance = await conn.getBalance(new PublicKey(accounts[0]));
uiConsole("balance", { balance });
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
}
};

export const signAndSendTransaction = async (provider: IProvider, uiConsole: any) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clean up as these functions are not used

try {
const conn = await getConnection(provider);
const solWeb3 = new SolanaWallet(provider);
const pubKey = await solWeb3.requestAccounts();

const block = await conn.getLatestBlockhash("finalized");
const transactionInstruction = SystemProgram.transfer({
fromPubkey: new PublicKey(pubKey[0]),
toPubkey: new PublicKey(pubKey[0]),
lamports: 0.01 * LAMPORTS_PER_SOL,
});

const transaction = new Transaction({
blockhash: block.blockhash,
lastValidBlockHeight: block.lastValidBlockHeight,
feePayer: new PublicKey(pubKey[0]),
}).add(transactionInstruction);

const signature = await solWeb3.signAndSendTransaction(transaction as unknown as TransactionOrVersionedTransaction);
uiConsole("signature", { signature });
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
}
};

export const signTransaction = async (provider: IProvider, uiConsole: any) => {
export const getBalance = async (rpc: Rpc<SolanaRpcApi>, account: string, uiConsole: UIConsole): Promise<void> => {
try {
const conn = await getConnection(provider);
const solWeb3 = new SolanaWallet(provider);
const pubKey = await solWeb3.requestAccounts();
log.info("pubKey", pubKey);

const transactionInstruction = SystemProgram.transfer({
fromPubkey: new PublicKey(pubKey[0]),
toPubkey: new PublicKey(pubKey[0]),
lamports: 0 * LAMPORTS_PER_SOL,
});

const block = await conn.getLatestBlockhash("finalized");
const transaction = new Transaction({
blockhash: block.blockhash,
lastValidBlockHeight: block.lastValidBlockHeight,
feePayer: new PublicKey(pubKey[0]),
}).add(transactionInstruction);

const signature = await solWeb3.signTransaction(transaction);
log.info("signedTx", signature);
uiConsole("signature", { signature });
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
}
};

export const signMessage = async (provider: IProvider, uiConsole: any) => {
try {
const solWeb3 = new SolanaWallet(provider);
const pubKey = await solWeb3.requestAccounts();
log.info("pubKey", pubKey);

const msg = "Test Signing Message";
const signature = await solWeb3.signMessage(msg, pubKey[0]);
uiConsole("solana signed message", { signature });
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
}
};

export const signAllTransactions = async (provider: IProvider, uiConsole: any) => {
try {
const conn = await getConnection(provider);
const solWeb3 = new SolanaWallet(provider);
const publicKeys = await solWeb3.requestAccounts();
const { blockhash } = await conn.getLatestBlockhash("finalized");
log.info("blockhash", blockhash);

const signedTransactions = await solWeb3.signAllTransactions([
getNewTx(publicKeys, blockhash) as unknown as TransactionOrVersionedTransaction,
getNewTx(publicKeys, blockhash) as unknown as TransactionOrVersionedTransaction,
getNewTx(publicKeys, blockhash) as unknown as TransactionOrVersionedTransaction,
]);
log.info("signedTransactions", signedTransactions);
uiConsole("signed transactions", { signedTransactions });
const { value: balance } = await rpc.getBalance(address(account)).send();
uiConsole("balance", { balance: balance.toString() });
} catch (error) {
log.error("Error", error);
uiConsole("error", error);
Expand Down
Loading