Create a dApp with StarKey
Create your first Dapp using StarKey wallet, the official wallet of Supra
Setup the project
Start building
2
3
Initialize the supraProvider and state hooks
supraProvider and state hooksimport React, {useEffect, useState} from "react";
import { HexString, TxnBuilderTypes, BCS } from "supra-l1-sdk";
function App() {
let supraProvider: any = typeof window !== "undefined" && (window as any)?.starkey?.supra;
const [isStarkeyInstalled, setIsStarkeyInstalled] = useState<boolean>(!!supraProvider);
const [accounts, setAccounts] = useState<string[]>([]);
const [networkData, setNetworkData] = useState<any>();
return <div></div>;
}4
Check for the injected StarKey object
const checkForStarkey = () => {
const intervalId = setInterval(() => {
if ((window as any)?.starkey) {
supraProvider = (window as any)?.starkey.supra;
clearInterval(intervalId);
setIsStarkeyInstalled(true);
updateAccounts().then();
}
}, 500);
setTimeout(() => {
clearInterval(intervalId);
}, 5000);
};
useEffect(() => {
checkForStarkey();
}, []);5
6
7
Initialize additional hooks
useEffect(() => {
if (supraProvider) {
supraProvider.on("accountChanged", (acc: string[]) => {
setAccounts(acc);
});
supraProvider.on("networkChanged", (data: any) => {
setNetworkData(data);
});
supraProvider.on("disconnect", () => {
resetWalletData();
});
}
}, [supraProvider]);
useEffect(() => {
if (accounts) {
getNetworkData().then();
}
}, [accounts]);8
Handle wallet connections
const connectWallet = async () => {
const response = await supraProvider.connect();
updateAccounts().then();
};
const disconnectWallet = async () => {
if (supraProvider) {
await supraProvider.disconnect();
}
resetWalletData();
};
const resetWalletData = ()=>{
setAccounts([]);
setNetworkData({});
}9
Switch between mainnet and testnet
const switchToTestnet = async (id:string) => {
if (supraProvider) {
await supraProvider.changeNetwork({chainId:"6"});
await getNetworkData()
}
};
const switchToMainnet = async () => {
if (supraProvider) {
await supraProvider.changeNetwork({chainId:"8"});
await getNetworkData()
}
};10
Send a transaction
const sendRawTransaction = async () => {
const txExpiryTime = (Math.ceil(Date.now() / 1000) + 30) //30 seconds
/** OptionalTransactionPayloadArgs {
maxGas?: bigint;
gasUnitPrice?: bigint;
txExpiryTime?: bigint;
}*/
const optionalTransactionPayloadArgs = {
txExpiryTime
}
const rawTxPayload = [
accounts[0],
0,
"0000000000000000000000000000000000000000000000000000000000000001",
"supra_account",
"transfer",
[],
[
new HexString("0x8de4158b48633d853186d5fc790718e5821d7d3c4855e06bcd97b105389a7d0f").toUint8Array(),
BCS.bcsSerializeUint64(100000000)
],
optionalTransactionPayloadArgs
];
const data = await supraProvider.createRawTransactionData(rawTxPayload);
if (data) {
const params = {
data: data,
/*from: accounts[0],
to: "",
chainId: networkData.chainId,
value: "100000000",*/
};
const txHash = await supraProvider.sendTransaction(params);
}
};11
Create the buttons displayed on the frontend
return <div>
<button onClick={connectWallet}>Connect Wallet</button>
<button onClick={disconnectWallet}>Disconnect Wallet</button>
<p>Connected Account(s): {JSON.stringify(accounts)}</p>
<p>Network Data: {JSON.stringify(networkData)}</p>
<button onClick={switchToTestnet}>Switch to Testnet</button>
<button onClick={switchToMainnet}>Switch to Mainnet</button>
<br></br>
<button onClick={sendRawTransaction}>Send Test Transaction</button>
</div>;13
Final code for App.tsx
App.tsximport React, {useEffect, useState} from "react";
import { HexString, TxnBuilderTypes, BCS } from "supra-l1-sdk";
function App() {
let supraProvider: any = typeof window !== "undefined" && (window as any)?.starkey?.supra;
const [isStarkeyInstalled, setIsStarkeyInstalled] = useState<boolean>(!!supraProvider);
const [accounts, setAccounts] = useState<string[]>([]);
const [networkData, setNetworkData] = useState<any>();
const checkForStarkey = () => {
const intervalId = setInterval(() => {
if ((window as any)?.starkey) {
supraProvider = (window as any)?.starkey.supra;
clearInterval(intervalId);
setIsStarkeyInstalled(true);
updateAccounts().then();
}
}, 500);
setTimeout(() => {
clearInterval(intervalId);
}, 5000);
};
useEffect(() => {
checkForStarkey();
}, []);
const getNetworkData = async () => {
if (supraProvider) {
const data = await supraProvider.getChainId();
console.log(data);
if (data) {
setNetworkData(data)
}
}
};
const updateAccounts = async () => {
if (supraProvider) {
try {
const response_acc = await supraProvider.account();
if (response_acc.length > 0) {
setAccounts(response_acc);
} else {
setAccounts([]);
}
} catch (e) {
setAccounts([]);
}
getNetworkData().then();
}
};
useEffect(() => {
if (supraProvider) {
supraProvider.on("accountChanged", (acc: string[]) => {
setAccounts(acc);
});
supraProvider.on("networkChanged", (data: any) => {
setNetworkData(data);
});
supraProvider.on("disconnect", () => {
resetWalletData();
});
}
}, [supraProvider]);
useEffect(() => {
if (accounts) {
getNetworkData().then();
}
}, [accounts]);
const resetWalletData = ()=>{
setAccounts([]);
setNetworkData({});
}
const connectWallet = async () => {
const response = await supraProvider.connect();
updateAccounts().then();
};
const disconnectWallet = async () => {
if (supraProvider) {
await supraProvider.disconnect();
}
resetWalletData();
};
const switchToTestnet = async () => {
if (supraProvider) {
await supraProvider.changeNetwork({chainId:"6"});
await getNetworkData()
}
};
const switchToMainnet = async () => {
if (supraProvider) {
await supraProvider.changeNetwork({chainId:"8"});
await getNetworkData()
}
};
const sendRawTransaction = async () => {
const txExpiryTime = (Math.ceil(Date.now() / 1000) + 30) //30 seconds
/** OptionalTransactionPayloadArgs {
maxGas?: bigint;
gasUnitPrice?: bigint;
txExpiryTime?: bigint;
}*/
const optionalTransactionPayloadArgs = {
txExpiryTime
}
const rawTxPayload = [
accounts[0],
0,
"0000000000000000000000000000000000000000000000000000000000000001",
"supra_account",
"transfer",
[],
[
new HexString("0x8de4158b48633d853186d5fc790718e5821d7d3c4855e06bcd97b105389a7d0f").toUint8Array(),
BCS.bcsSerializeUint64(100000000)
],
optionalTransactionPayloadArgs
];
const data = await supraProvider.createRawTransactionData(rawTxPayload);
if (data) {
const params = {
data: data,
/*from: accounts[0],
to: "",
chainId: networkData.chainId,
value: "100000000",*/
};
const txHash = await supraProvider.sendTransaction(params);
}
};
return <div>
<button onClick={connectWallet}>Connect Wallet</button>
<button onClick={disconnectWallet}>Disconnect Wallet</button>
<p>Connected Account(s): {JSON.stringify(accounts)}</p>
<p>Network Data: {JSON.stringify(networkData)}</p>
<button onClick={switchToTestnet}>Switch to Testnet</button>
<button onClick={switchToMainnet}>Switch to Mainnet</button>
<br></br>
<button onClick={sendRawTransaction}>Send Test Transaction</button>
</div>;
}
export default App;Last updated
