tanglepaysdk-client
Version:
DApp SDK to interact with TanglePay wallets
1,027 lines (987 loc) • 31 kB
JavaScript
import React, { useEffect, useState, useRef } from 'react';
import IotaSDK from 'tanglepaysdk-client';
import './App.css';
function App() {
const [installed, setInstalled] = useState(false);
const iota = useRef(IotaSDK).current;
useEffect(() => {
console.log('effect called');
iota._events.on('iota-ready', async () => {
console.log('iota-ready');
iota.on('accountsChanged', changeAccountHandler);
setInstalled(true);
await connect();
});
}, []);
const [texts, setTexts] = useState([]);
const showText = (text) => {
setTexts((s) => [...s, text]);
};
const connect = async () => {
try {
const res = await iota.request({
method: 'iota_connect',
params: {
// expires: 3000000
},
});
showText(`Connect result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Connect result: ${JSON.stringify(error)}`);
return error;
}
};
const changeAccountHandler = (e) => {
showText(`Switch account event: ${JSON.stringify(e)}`);
};
const [signData, setSignData] = useState({ content: '' });
const sign = async () => {
const { content } = signData;
if (!content) {
return;
}
try {
const res = await iota.request({
method: 'iota_sign',
params: {
content,
},
});
showText(`Sign result: ${JSON.stringify(res)}`);
} catch (error) {
showText(`Sign result: ${JSON.stringify(error)}`);
return error;
}
};
const getAccounts = async () => {
try {
const res = await iota.request({
method: 'iota_accounts',
});
showText(`GetAccounts result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`GetAccounts result: ${JSON.stringify(error)}`);
return error;
}
};
const [assetsList, setAssetsList] = useState([]);
const getBalances = async () => {
if (assetsList.length) {
try {
// iota balance
const res = await iota.request({
method: 'iota_getBalance',
params: {
assetsList, // ['iota','soonaverse','smr','asmb']
// addressList:addressList,
addressList: [], // current addressList
},
});
showText(`Get balance result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Get balance result: ${JSON.stringify(error)}`);
return error;
}
}
};
const [assetsListShimmer, setAssetsListShimmer] = useState([]);
const getBalancesShimmer = async (addressList) => {
if (assetsListShimmer.length) {
try {
// shimmer balance
const res = await iota.request({
method: 'iota_getBalance',
params: {
assetsListShimmer, // ['smr']
// addressList:addressList,
addressList: [], // current addressList
},
});
showText(`Get balance(shimmer) result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Get balance(shimmer) result: ${JSON.stringify(error)}`);
return error;
}
}
};
const [iotaSendData, setIotaSendData] = useState({
address: '',
amount: '',
data: '',
unit: 'IOTA',
metadata: '',
tag: '',
});
const sendTransaction = async () => {
const { address, amount, data, tag, unit, metadata } = iotaSendData;
if (!address || !amount) {
return;
}
try {
const res = await iota.request({
method: 'iota_sendTransaction',
params: {
to: address,
value: parseFloat(amount),
data,
unit,
tag,
metadata
},
});
showText(`Send Transaction result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Send Transaction result: ${JSON.stringify(error)}`);
return error;
}
};
const [shimmerSendData, setShimmerSendData] = useState({
address: '',
amount: '',
data: '',
tag: '',
metadata: '',
unit: 'SMR',
});
const sendTransactionShimmer = async () => {
const { address, amount, data, tag, unit, metadata } = shimmerSendData;
if (!address || !amount) {
return;
}
try {
const res = await iota.request({
method: 'iota_sendTransaction',
params: {
to: address,
value: parseFloat(amount),
data,
unit,
tag,
metadata,
},
});
showText(`Send Transaction result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Send Transaction result: ${JSON.stringify(error)}`);
return error;
}
};
const [sendShimmerTokenData, setSendShimmerTokenData] = useState({
address: '',
amount: '',
data: '',
tag: '',
assetId: '',
metadata: '',
});
const sendTransactionShimmerToken = async () => {
const { address, amount, data, tag, assetId, metadata } =
sendShimmerTokenData;
if (!address || !amount || !assetId) {
return;
}
try {
const res = await iota.request({
method: 'iota_sendTransaction',
params: {
to: address,
value: parseFloat(amount),
data,
assetId,
tag,
metadata,
},
});
showText(`Send Transaction result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Send Transaction result: ${JSON.stringify(error)}`);
return error;
}
};
const [sendShimmerNFTData, setSendShimmerNFTData] = useState({
address: '',
data: '',
tag: '',
nftId: '',
metadata: '',
});
const sendTransactionShimmerNft = async () => {
const { address, data, tag, metadata, nftId } = sendShimmerNFTData;
if (!address || !nftId) {
return;
}
try {
const res = await iota.request({
method: 'iota_sendTransaction',
params: {
to: address,
data,
nftId,
tag,
metadata,
},
});
showText(`Send Transaction result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Send Transaction result: ${JSON.stringify(error)}`);
return error;
}
};
const [iotaNetwork, setIotaNetwork] = useState('');
const changeAccount = async () => {
if (!iotaNetwork) {
return;
}
try {
const res = await iota.request({
method: 'iota_changeAccount',
params: {
network: iotaNetwork, //mainnet ,iota-evm
},
});
showText(`Change Account result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Change Account result: ${JSON.stringify(error)}`);
return error;
}
};
const [address, setAddress] = useState('');
const getPublicKey = async () => {
if (!address) {
return;
}
try {
const res = await iota.request({
method: 'iota_getPublicKey',
params: { address },
});
showText(`Get publicKey result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Get publicKey result: ${JSON.stringify(error)}`);
return error;
}
};
const [personalSignContent, setPersonalSignContent] = useState('');
const ethPersonalSign = async (bool) => {
if (!personalSignContent) {
return;
}
try {
const res = await iota.request({
method: 'personal_sign',
params: {
content: personalSignContent,
},
});
showText(`Sign result: ${JSON.stringify(res)}`);
} catch (error) {
showText(`Sign result: ${JSON.stringify(error)}`);
}
};
const [ethAssetsList, setEthAssetsList] = useState([]);
const getEthBalances = async (addressList) => {
if (ethAssetsList.length <= 0) {
return;
}
try {
const res = await iota.request({
method: 'eth_getBalance',
params: {
assetsList: ethAssetsList, // ['evm','soonaverse']
// addressList:addressList,
addressList: [], // current addressList
},
});
showText(`Get eth balance result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Get eth balance result: ${JSON.stringify(error)}`);
return error;
}
};
const [sendContractData, setSendContractData] = useState({
address: '',
data: '',
});
const ethSendContractTransaction = async () => {
const { address, data } = sendContractData;
if (!address || !data) {
return;
}
try {
const res = await iota.request({
method: 'eth_sendTransaction',
params: {
to: address,
data,
},
});
showText(`Send Transaction result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`Send Transaction result: ${error}`);
return error;
}
};
const [importContractData, setImportContractData] = useState({
contract: '',
});
const ethImportContract = async () => {
const { contract } = importContractData;
if (!contract) {
return;
}
try {
const res = await iota.request({
method: 'eth_importContract',
params: {
contract,
},
});
showText(`import contract result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`import contract error: ${JSON.stringify(error)}`);
return error;
}
};
const [importNFTData, setImportNFTData] = useState({
nft: '',
tokenId: undefined,
});
const ethImportNFT = async () => {
const { nft, tokenId } = importNFTData;
if (!nft || !tokenId) {
return;
}
try {
const res = await iota.request({
method: 'eth_importNFT',
params: {
nft,
tokenId: parseInt(tokenId),
},
});
showText(`import nft result: ${JSON.stringify(res)}`);
return res;
} catch (error) {
showText(`import nft error: ${JSON.stringify(error)}`);
return error;
}
};
return (
<div className="App">
<Header />
<h2>Wallet status</h2>
<div id="status">
{installed ? (
<div>
<p>TanglePay installed</p>
<p>Version {iota.tanglePayVersion || '--'}</p>
</div>
) : (
'TanglePay not installed'
)}
</div>
<div className="content">
<div className="left">
<h2>API examples</h2>
<div className="block">
<h4>iota_connect</h4>
<button onClick={connect} className="btn btn-primary">
Connect
</button>
</div>
<div className="block">
<h4>iota_sign</h4>
<div className="address-input">
<input
id="sign_data"
type="text"
placeholder="content"
value={signData.content}
onChange={(e) => setSignData({ content: e.target.value })}
/>
</div>
<button onClick={sign} className="btn btn-primary">
Sign
</button>
</div>
<div className="block">
<h4>iota_accounts</h4>
<button onClick={getAccounts} className="btn btn-primary">
Get accounts
</button>
</div>
<div className="block">
<h4>iota_getBalance</h4>
<div className="radio-con">
{[
{ value: 'iota' },
{ value: 'soonaverse' },
{ value: 'smr' },
{ value: 'asmb' },
].map(({ value }) => (
<span key={value}>
<input
type="checkbox"
checked={assetsList.includes(value)}
onChange={(e) => {
const checked = e.target.checked;
if (checked) {
setAssetsList((s) => [...s, value]);
} else {
setAssetsList((s) => s.filter((i) => i !== value));
}
}}
/>
<span>{value}</span>
</span>
))}
</div>
<button onClick={getBalances} className="btn btn-primary">
Get balances
</button>
</div>
<div className="block">
<h4>iota_getBalance ( shimmer )</h4>
<div className="radio-con">
{[{ value: 'smr' }, { value: 'soonaverse' }].map(({ value }) => (
<span key={value}>
<input
type="checkbox"
checked={assetsListShimmer.includes(value)}
onChange={(e) => {
const checked = e.target.checked;
if (checked) {
setAssetsListShimmer((s) => [...s, value]);
} else {
setAssetsListShimmer((s) =>
s.filter((i) => i !== value),
);
}
}}
/>
<span>{value}</span>
</span>
))}
</div>
<button onClick={getBalancesShimmer} className="btn btn-primary">
Get balances ( shimmer )
</button>
</div>
<div className="block">
<h4>iota_sendTransaction</h4>
<div className="address-input">
<input
id="iota_address"
type="text"
value={iotaSendData.address}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
address: e.target.value,
}))
}
placeholder="send to ( address ) "
/>
<input
id="iota_amount"
type="number"
placeholder="amount"
value={iotaSendData.amount}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
amount: e.target.value,
}))
}
/>
<input
id="iota_metadata"
placeholder="metadata"
value={iotaSendData.metadata}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
metadata: e.target.value,
}))
}
/>
<input
id="iota_tag"
placeholder="tag"
value={iotaSendData.tag}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
tag: e.target.value,
}))
}
/>
<input
id="iota_data"
placeholder="data"
value={iotaSendData.data}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
data: e.target.value,
}))
}
/>
<input
id="iota_unit"
placeholder="unit (Optional)"
value={iotaSendData.unit}
onChange={(e) =>
setIotaSendData((s) => ({
...s,
unit: e.target.value,
}))
}
/>
</div>
<button onClick={sendTransaction} className="btn btn-primary">
Send Transaction
</button>
</div>
<div className="block">
<h4>shimmer_sendTransaction</h4>
<div className="address-input">
<input
id="shimmer_address"
type="text"
placeholder="send to ( address ) "
value={shimmerSendData.address}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
address: e.target.value,
}))
}
/>
<input
id="shimmer_amount"
type="number"
placeholder="amount"
value={shimmerSendData.amount}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
amount: e.target.value,
}))
}
/>
<input
id="shimmer_tag"
placeholder="tag"
value={shimmerSendData.tag}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
tag: e.target.value,
}))
}
/>
<input
id="shimmer_metadata"
placeholder="metadata"
value={shimmerSendData.metadata}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
metadata: e.target.value,
}))
}
/>
<input
id="shimmer_data"
placeholder="data"
value={shimmerSendData.data}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
data: e.target.value,
}))
}
/>
<input
id="shimmer_unit"
placeholder="unit (Optional)"
value={shimmerSendData.unit}
onChange={(e) =>
setShimmerSendData((s) => ({
...s,
unit: e.target.value,
}))
}
/>
</div>
<button
onClick={sendTransactionShimmer}
className="btn btn-primary">
Send Transaction
</button>
</div>
</div>
<div className="middle">
<div className="block">
<h4>shimmer_token_sendTransaction</h4>
<div className="address-input">
<input
id="shimmer_token_address"
type="text"
placeholder="send to ( address ) "
value={sendShimmerTokenData.address}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
address: e.target.value,
}))
}
/>
<input
id="shimmer_token_amount"
type="number"
placeholder="amount"
value={sendShimmerTokenData.amount}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
amount: e.target.value,
}))
}
/>
<input
id="shimmer_token_tag"
placeholder="tag"
value={sendShimmerTokenData.tag}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
tag: e.target.value,
}))
}
/>
<input
id="shimmer_token_metadata"
placeholder="metadata"
value={sendShimmerTokenData.metadata}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
metadata: e.target.value,
}))
}
/>
<input
id="shimmer_token_data"
placeholder="data"
value={sendShimmerTokenData.data}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
data: e.target.value,
}))
}
/>
<input
id="shimmer_token_assetId"
placeholder="assetId"
value={sendShimmerTokenData.assetId}
onChange={(e) =>
setSendShimmerTokenData((s) => ({
...s,
assetId: e.target.value,
}))
}
/>
</div>
<button
onClick={sendTransactionShimmerToken}
className="btn btn-primary">
Send Transaction
</button>
</div>
<div className="block">
<h4>shimmer_nft_sendTransaction</h4>
<div className="address-input">
<input
id="shimmer_nft_address"
type="text"
placeholder="send to ( address ) "
value={sendShimmerNFTData.address}
onChange={(e) =>
setSendShimmerNFTData((s) => ({
...s,
address: e.target.value,
}))
}
/>
<input
id="shimmer_nft_tag"
placeholder="tag"
value={sendShimmerNFTData.tag}
onChange={(e) =>
setSendShimmerNFTData((s) => ({
...s,
tag: e.target.value,
}))
}
/>
<input
id="shimmer_nft_metadata"
placeholder="metadata"
value={sendShimmerNFTData.metadata}
onChange={(e) =>
setSendShimmerNFTData((s) => ({
...s,
metadata: e.target.value,
}))
}
/>
<input
id="shimmer_nft_data"
placeholder="data"
value={sendShimmerNFTData.data}
onChange={(e) =>
setSendShimmerNFTData((s) => ({
...s,
data: e.target.value,
}))
}
/>
<input
id="shimmer_nft_assetId"
placeholder="nftId"
value={sendShimmerNFTData.nftId}
onChange={(e) =>
setSendShimmerNFTData((s) => ({
...s,
nftId: e.target.value,
}))
}
/>
</div>
<button
onClick={sendTransactionShimmerNft}
className="btn btn-primary">
Send Transaction
</button>
</div>
<div className="block">
<h4>iota_changeAccount</h4>
<div className="radio-con">
{[
{ value: 'mainnet', label: 'iota mainnet' },
{ value: 'iota-evm', label: 'iota-evm' },
{
value: 'bsc',
label: 'bsc',
},
].map(({ value, label }) => (
<span key={value}>
<input
type="radio"
name="changeAccount"
checked={iotaNetwork === value}
onChange={(e) => {
const checked = e.target.checked;
if (checked) {
setIotaNetwork(value);
}
}}
/>
<span>{label}</span>
</span>
))}
</div>
<button onClick={changeAccount} className="btn btn-primary">
Change Account
</button>
</div>
<div className="block">
<h4>iota_getPublicKey</h4>
<div className="address-input">
<input
id="public_key_address"
type="text"
placeholder="publickey address"
value={address}
onChange={(e) => setAddress(e.target.value)}
/>
</div>
<button onClick={getPublicKey} className="btn btn-primary">
Get PublicKey
</button>
</div>
<div className="block">
<h4>personal_sign</h4>
<div className="address-input">
<input
id="sign_eth_data"
type="text"
placeholder="content"
value={personalSignContent}
onChange={(e) => setPersonalSignContent(e.target.value)}
/>
</div>
<button onClick={ethPersonalSign} className="btn btn-primary">
Personal Sign
</button>
</div>
<div className="block">
<h4>eth_getBalance</h4>
<div className="radio-con">
{[{ value: 'evm' }, { value: 'soonaverse' }].map(({ value }) => (
<span key={value}>
<input
type="checkbox"
checked={ethAssetsList.includes(value)}
onChange={(e) => {
const checked = e.target.checked;
if (checked) {
setEthAssetsList((s) => [...s, value]);
} else {
setEthAssetsList((s) => s.filter((i) => i !== value));
}
}}
/>
<span>{value}</span>
</span>
))}
</div>
<button onClick={getEthBalances} className="btn btn-primary">
Get Eth balances
</button>
</div>
<div className="block">
<h4>eth_sendTransaction (contract)</h4>
<div className="address-input">
<input
id="eth_contract_address"
type="text"
placeholder="send to ( address ) "
value={sendContractData.address}
onChange={(e) =>
setSendContractData((s) => ({
...s,
address: e.target.value,
}))
}
/>
<input
id="eth_contract_data"
placeholder="data"
value={sendContractData.data}
onChange={(e) =>
setSendContractData((s) => ({
...s,
data: e.target.value,
}))
}
/>
</div>
<button
onClick={ethSendContractTransaction}
className="btn btn-primary">
ETH Send Transaction
</button>
</div>
<div className="block">
<h4>eth_importContract (contract)</h4>
<div className="address-input">
<input
id="eth_import_contract"
type="text"
placeholder="contract"
value={importContractData.contract}
onChange={(e) =>
setImportContractData((s) => ({
...s,
contract: e.target.value,
}))
}
/>
</div>
<button onClick={ethImportContract} className="btn btn-primary">
ETH Import Contract
</button>
</div>
<div className="block">
<h4>eth_importNFT</h4>
<div className="address-input">
<input
id="eth_import_contract"
type="text"
placeholder="contract"
value={importNFTData.nft}
onChange={(e) =>
setImportNFTData((s) => ({
...s,
nft: e.target.value,
}))
}
/>
<input
id="eth_import_contract"
type="text"
placeholder="tokenId"
value={importNFTData.tokenId}
onChange={(e) =>
setImportNFTData((s) => ({
...s,
tokenId: e.target.value,
}))
}
/>
</div>
<button onClick={ethImportNFT} className="btn btn-primary">
ETH Import NFT
</button>
</div>
</div>
<div className="right">
<div id="text">
{texts.map((text, index) => (
<div key={index} style={{ marginTop: 30 }}>
{text}
</div>
))}
</div>
</div>
</div>
</div>
);
}
function Header() {
return (
<>
<h2>TanglePay-SDK</h2>
Hi, this is the demo site of integrating your DApp with IOTA using
TanglePay wallet.
<br />
For more details, please refer to the spec
<a
href="https://github.com/TanglePay/TanglePay-SDK"
rel="noreferrer"
style={{ marginLeft: 8 }}
target="_blank">
here
</a>
.
</>
);
}
export default App;