import React, { useState, useEffect } from "react";
import { Connection, PublicKey, Transaction, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { useAccount, useWallet, useClient } from "@getpara/react-sdk";
import { ParaSolanaWeb3Signer } from "@getpara/solana-web3.js-v1-integration";
import { Actions, Swig, findSwigPda, createEd25519AuthorityInfo } from "@swig-wallet/classic";
export const SwigAccountCreation: React.FC = () => {
const { data: account } = useAccount();
const { data: wallet } = useWallet();
const [swigAddress, setSwigAddress] = useState<string | null>(null);
const [solBalance, setSolBalance] = useState<number | null>(null);
const [isCreatingSwig, setIsCreatingSwig] = useState(false);
const para = useClient();
const connection = new Connection("https://api.devnet.solana.com");
const createSwigAccount = async () => {
if (!wallet?.address || !para) return;
setIsCreatingSwig(true);
try {
const id = new Uint8Array(32);
crypto.getRandomValues(id);
const paraPubkey = new PublicKey(wallet.address);
const [swigPdaAddress] = findSwigPda(id);
const signer = new ParaSolanaWeb3Signer(para, connection, wallet.id);
const rootAuthorityInfo = createEd25519AuthorityInfo(paraPubkey);
const rootActions = Actions.set().all().get();
const createSwigInstruction = Swig.create({
authorityInfo: rootAuthorityInfo,
id,
payer: paraPubkey,
actions: rootActions,
});
const transaction = new Transaction();
transaction.add(createSwigInstruction);
transaction.feePayer = paraPubkey;
const { blockhash } = await connection.getLatestBlockhash();
transaction.recentBlockhash = blockhash;
const signedTransaction = await signer.signTransaction(transaction);
const signature = await connection.sendRawTransaction(signedTransaction.serialize());
await connection.confirmTransaction({
signature,
blockhash,
lastValidBlockHeight: (await connection.getLatestBlockhash()).lastValidBlockHeight,
});
setSwigAddress(swigPdaAddress.toBase58());
setIsCreatingSwig(false);
console.log("Swig account created successfully!");
console.log("Swig address:", swigPdaAddress.toBase58());
console.log("Transaction signature:", signature);
} catch (error) {
console.error("Error in transaction signing:", error);
setIsCreatingSwig(false);
}
};
useEffect(() => {
const fetchBalance = async () => {
if (wallet?.address) {
try {
const balance = await connection.getBalance(new PublicKey(wallet.address));
setSolBalance(balance / LAMPORTS_PER_SOL);
} catch (e) {
setSolBalance(null);
}
}
};
fetchBalance();
}, [wallet?.address]);
if (!account?.isConnected || !wallet) {
return <div>Please connect your wallet first</div>;
}
return (
<div className="space-y-4">
<div className="text-center">
<p className="text-green-700 font-medium">You are signed in!</p>
<p className="text-sm text-gray-700">
Wallet address: <span className="font-mono break-all">{wallet.address}</span>
</p>
{solBalance !== null && (
<p className="text-sm text-gray-700">
Balance: <span className="font-mono">{solBalance} SOL</span>
</p>
)}
</div>
{swigAddress && (
<div className="text-center p-4 bg-green-50 rounded-md">
<p className="text-green-800 font-medium">Swig Account Created!</p>
<p className="text-sm text-green-700 break-all">
Address: {swigAddress}
</p>
</div>
)}
{!swigAddress && (
<button
onClick={createSwigAccount}
disabled={isCreatingSwig}
className="w-full px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:bg-blue-400"
>
{isCreatingSwig ? "Creating Swig..." : "Create Swig Account"}
</button>
)}
</div>
);
};