Skip to content
This repository was archived by the owner on Jun 24, 2025. It is now read-only.

Commit 2a7a9c0

Browse files
authored
Merge pull request #10 from tronprotocol/release/v1.1.2
Release/v1.1.2
2 parents 0343f2e + 46156d1 commit 2a7a9c0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3090
-1224
lines changed

.npmrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
strict-peer-dependencies=false
1+
strict-peer-dependencies=false
2+
# not add workspace: to package.json
3+
save-workspace-protocol=false

demos/dev-demo/.prettierrc.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"printWidth": 180,
3+
"trailingComma": "es5",
4+
"tabWidth": 4,
5+
"semi": true,
6+
"singleQuote": true
7+
}

demos/dev-demo/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
"@emotion/react": "^11.10.4",
1313
"@emotion/styled": "^11.10.4",
1414
"@mui/material": "^5.10.10",
15-
"@tronweb3/tronwallet-abstract-adapter": "workspace:^1.1.0",
16-
"@tronweb3/tronwallet-adapter-ledger": "workspace:^1.0.0",
17-
"@tronweb3/tronwallet-adapter-react-hooks": "workspace:^1.0.0",
18-
"@tronweb3/tronwallet-adapter-react-ui": "workspace:^1.1.0",
19-
"@tronweb3/tronwallet-adapters": "workspace:^1.1.0",
15+
"@tronweb3/tronwallet-abstract-adapter": "^1.1.0",
16+
"@tronweb3/tronwallet-adapter-ledger": "^1.1.2",
17+
"@tronweb3/tronwallet-adapter-react-hooks": "^1.0.0",
18+
"@tronweb3/tronwallet-adapter-react-ui": "^1.1.0",
19+
"@tronweb3/tronwallet-adapters": "^1.1.2",
2020
"events": "^3.3.0",
2121
"react": "^18.2.0",
2222
"react-dom": "^18.2.0",

demos/dev-demo/src/App.tsx

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,57 @@
1+
import { Box, Tab, Tabs } from '@mui/material';
12
import React from 'react';
2-
// import {
3-
// WalletActionButton,
4-
// WalletConnectButton,
5-
// WalletDisconnectButton,
6-
// WalletSelectButton,
7-
// } from '@tronweb3/tronwallet-adapter-react-ui';
83
import { LedgerAdapterDemo } from './LedgerAdapterDemo.js';
4+
import { CustomConnectWithSelectAccount } from './LedgerDemo/CustomConnectWithSelectAccount.js';
5+
import { CustomConnectWithGetAccounts } from './LedgerDemo/CustomConnectWithGetAccounts.js';
96
import { TronLinkAdapterDemo } from './TronLinkAdapterDemo.js';
7+
interface TabPanelProps {
8+
children?: React.ReactNode;
9+
index: number;
10+
value: number;
11+
}
12+
13+
function TabPanel(props: TabPanelProps) {
14+
const { children, value, index, ...other } = props;
1015

16+
return (
17+
<div role="tabpanel" hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-tab-${index}`} {...other}>
18+
{value === index && <Box sx={{ p: 3 }}>{children}</Box>}
19+
</div>
20+
);
21+
}
1122
function App() {
23+
const [value, setValue] = React.useState(() => {
24+
return Number(localStorage.getItem('tab')) || 0;
25+
});
26+
27+
const handleChange = (event: React.SyntheticEvent, newValue: number) => {
28+
localStorage.setItem('tab', String(newValue));
29+
setValue(newValue);
30+
};
1231
return (
1332
<div className="App">
14-
{/* <button onClick={() => setIsOpen((v) => !v)}>{isOpen ? 'fold' : 'expand'}</button>
15-
<Collapse isOpen={isOpen}>Collapse Content</Collapse> */}
16-
{/* <h2>WalletSelectButton</h2>
17-
<WalletSelectButton></WalletSelectButton>
18-
<h2>WalletConnectButton</h2>
19-
<WalletConnectButton></WalletConnectButton>
20-
<h2>WalletDisconnectButton</h2>
21-
<WalletDisconnectButton></WalletDisconnectButton>
22-
<h2>WalletActionButton</h2>
23-
<WalletActionButton></WalletActionButton> */}
24-
<LedgerAdapterDemo></LedgerAdapterDemo>
25-
<TronLinkAdapterDemo></TronLinkAdapterDemo>
33+
<Box sx={{ width: '100%' }}>
34+
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
35+
<Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
36+
<Tab label="TronLinkAdapter Demo" />
37+
<Tab label="LedgerAdapter Demo" />
38+
<Tab label="LedgerAdapter CustomConnectWithSelectAccount" />
39+
<Tab label="LedgerAdapter CustomConnectWithGetAccounts" />
40+
</Tabs>
41+
</Box>
42+
<TabPanel value={value} index={0}>
43+
<TronLinkAdapterDemo></TronLinkAdapterDemo>
44+
</TabPanel>
45+
<TabPanel value={value} index={1}>
46+
<LedgerAdapterDemo></LedgerAdapterDemo>
47+
</TabPanel>
48+
<TabPanel value={value} index={2}>
49+
<CustomConnectWithSelectAccount></CustomConnectWithSelectAccount>
50+
</TabPanel>
51+
<TabPanel value={value} index={3}>
52+
<CustomConnectWithGetAccounts></CustomConnectWithGetAccounts>
53+
</TabPanel>
54+
</Box>
2655
</div>
2756
);
2857
}

demos/dev-demo/src/LedgerAdapterDemo.tsx

Lines changed: 88 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,72 @@
1-
import React, { useCallback, useEffect, useMemo, useState } from 'react'
1+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
22
import type { ReactNode } from 'react';
33
import { LedgerAdapter } from '@tronweb3/tronwallet-adapters';
44
import { AdapterState } from '@tronweb3/tronwallet-abstract-adapter';
5-
import { Box, Button, Typography, Alert, TextField } from '@mui/material';
5+
import { Box, Button, Typography, Alert, TextField, DialogContent, DialogContentText } from '@mui/material';
66
import { tronWeb } from './tronweb';
7+
import DialogTitle from '@mui/material/DialogTitle';
8+
import Dialog from '@mui/material/Dialog';
9+
import { selectAccount as openSelectAccountModal } from './LedgerDemo/selectAccount.js';
10+
import type { SelectAccount } from '@tronweb3/tronwallet-adapter-ledger/lib/types/LedgerWallet.js';
11+
export const receiver = 'TMDKznuDWaZwfZHcM61FVFstyYNmK6Njk1';
712

813
export function LedgerAdapterDemo() {
914
const [connectState, setConnectState] = useState(AdapterState.NotFound);
1015
const [account, setAccount] = useState('');
1116
const [signMessage, setSignMessage] = useState('Hello, Adapter');
12-
const [signedMessage, setSignedMessage] = useState('')
13-
const receiver = 'TMDKznuDWaZwfZHcM61FVFstyYNmK6Njk1';
14-
17+
const [signedMessage, setSignedMessage] = useState('');
18+
1519
const [open, setOpen] = useState(false);
16-
const adapter = useMemo(() => new LedgerAdapter({ accountNumber: 2 }), []);
20+
const [loadingVisible, setLoadingVisible] = useState(false);
21+
const [verifyAddressVisible, setVerifyAddressVisible] = useState(false);
22+
23+
async function onConnect() {
24+
try {
25+
await adapter.connect();
26+
// eslint-disable-next-line no-useless-catch
27+
} catch (e: any) {
28+
alert(e.message);
29+
throw e;
30+
} finally {
31+
setLoadingVisible(false);
32+
setVerifyAddressVisible(false);
33+
}
34+
}
35+
36+
const selectAccount = useCallback<SelectAccount>(async function ({ accounts, ledgerUtils }) {
37+
const account = await openSelectAccountModal({ accounts, getAccounts: ledgerUtils.getAccounts });
38+
return account;
39+
}, []);
40+
const adapter = useMemo(
41+
() =>
42+
new LedgerAdapter({
43+
accountNumber: 1,
44+
getDerivationPath(index: number) {
45+
return `44'/195'/0'/0/${index}`;
46+
},
47+
}),
48+
[]
49+
);
1750

1851
useEffect(() => {
19-
console.log('--- new adapter ----');
2052
setConnectState(adapter.state);
2153
setAccount(adapter.address || '');
2254

2355
adapter.on('connect', () => {
24-
console.log('---connect', adapter.address);
56+
console.log('[Adapter Event] connect', adapter.address);
2557
setAccount(adapter.address || '');
2658
});
2759
adapter.on('stateChanged', (state) => {
28-
console.log('---state change', state);
60+
console.log('[Adapter Event] state change', state);
2961
setConnectState(state);
3062
});
3163
adapter.on('accountsChanged', (data) => {
32-
console.log('---account changed', data);
64+
console.log('[Adapter Event] account changed', data);
3365
setAccount(data as string);
3466
});
3567

3668
adapter.on('disconnect', () => {
37-
console.log('---disconnect');
69+
console.log('[Adapter Event] disconnect');
3870
});
3971

4072
return () => {
@@ -45,20 +77,25 @@ export function LedgerAdapterDemo() {
4577
async function onSignTransaction() {
4678
const transaction = await tronWeb.transactionBuilder.sendTrx(receiver, tronWeb.toSun(0.1), adapter.address);
4779
const signedTransaction = await adapter.signTransaction(transaction);
48-
// const signedTransaction = await tronWeb.trx.sign(transaction);
4980
const res = await tronWeb.trx.sendRawTransaction(signedTransaction);
5081
setOpen(true);
5182
}
5283

53-
const onSignMessage = useCallback(async function () {
54-
const res = await adapter.signMessage(signMessage);
55-
setSignedMessage(res);
56-
}, [adapter, signMessage, setSignedMessage]);
84+
const onSignMessage = useCallback(
85+
async function () {
86+
const res = await adapter.signMessage(signMessage);
87+
setSignedMessage(res);
88+
},
89+
[adapter, signMessage, setSignedMessage]
90+
);
5791

58-
const onVerifyMessage = useCallback(async function() {
59-
const address = await tronWeb.trx.verifyMessageV2(signMessage, signedMessage);
60-
alert(address === adapter.address ? '验证成功' : '验证失败')
61-
}, [signMessage, signedMessage, adapter])
92+
const onVerifyMessage = useCallback(
93+
async function () {
94+
const address = await tronWeb.trx.verifyMessageV2(signMessage, signedMessage);
95+
alert(address === adapter.address ? 'success verify' : 'failed verify');
96+
},
97+
[signMessage, signedMessage, adapter]
98+
);
6299

63100
return (
64101
<Box sx={{ width: '100%', maxWidth: 500 }}>
@@ -68,35 +105,57 @@ export function LedgerAdapterDemo() {
68105
</Typography>
69106
<Detail>{account}</Detail>
70107

71-
72108
<Typography variant="h6" gutterBottom>
73109
Current connection status:&nbsp;&nbsp;
74110
<span style={{ color: adapter?.connected ? '#08f108' : 'orange' }}>{connectState}</span>
75111
</Typography>
76112
<Typography variant="h6" gutterBottom>
77-
<TextField value={signMessage} onChange={e => setSignMessage(e.target.value)}></TextField>
113+
<TextField label="Message to sign" size="small" value={signMessage} onChange={(e) => setSignMessage(e.target.value)}></TextField>
78114
</Typography>
79115
<Detail>
80-
<Button variant="contained" disabled={adapter?.connected} onClick={() => adapter?.connect()}>
116+
<Button variant="contained" disabled={adapter?.connected} onClick={onConnect}>
81117
Connect
82-
</Button>&nbsp;&nbsp;&nbsp;&nbsp;
118+
</Button>
119+
&nbsp;&nbsp;&nbsp;&nbsp;
83120
<Button variant="contained" disabled={!adapter?.connected} onClick={() => adapter?.disconnect()}>
84121
Disconnect
85-
</Button>&nbsp;&nbsp;&nbsp;&nbsp;
86-
<Button variant="contained" disabled={!adapter?.connected} onClick={onSignTransaction}>Transfer</Button>
122+
</Button>
123+
&nbsp;&nbsp;&nbsp;&nbsp;
124+
<Button variant="contained" disabled={!adapter?.connected} onClick={onSignTransaction}>
125+
Transfer
126+
</Button>
87127
</Detail>
88128
<Detail>
89-
<Button variant="contained" onClick={onSignMessage}>Sign Message</Button>&nbsp;&nbsp;&nbsp;&nbsp;
90-
<Button variant="contained" disabled={!signedMessage} onClick={onVerifyMessage}>Verify Signed Message</Button>
129+
<Button variant="contained" onClick={onSignMessage}>
130+
Sign Message
131+
</Button>
132+
&nbsp;&nbsp;&nbsp;&nbsp;
133+
<Button variant="contained" disabled={!signedMessage} onClick={onVerifyMessage}>
134+
Verify Signed Message
135+
</Button>
91136
</Detail>
92137
{open && (
93138
<Alert onClose={() => setOpen(false)} severity="success" sx={{ width: '100%', marginTop: 1 }}>
94-
Success! You can confirm your transfer on{' '}
139+
Success! You can confirm your transfer on
95140
<a target="_blank" rel="noreferrer" href={`https://nile.tronscan.org/#/address/${adapter.address}`}>
96141
Tron Scan
97142
</a>
98143
</Alert>
99144
)}
145+
146+
<Dialog onClose={() => setLoadingVisible(false)} open={loadingVisible}>
147+
<DialogTitle>Connecting to Ledger....</DialogTitle>
148+
<DialogContent>
149+
<DialogContentText>Please connect your ledger and enter TRON app...</DialogContentText>
150+
</DialogContent>
151+
</Dialog>
152+
153+
<Dialog onClose={() => setVerifyAddressVisible(false)} open={verifyAddressVisible}>
154+
<DialogTitle>Verify on Ledger....</DialogTitle>
155+
<DialogContent>
156+
<DialogContentText>Please approve on your ledger</DialogContentText>
157+
</DialogContent>
158+
</Dialog>
100159
</Box>
101160
);
102161
}
@@ -108,4 +167,3 @@ function Detail(props: { children: ReactNode }) {
108167
</Typography>
109168
);
110169
}
111-
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export function ConnectTip() {
2+
return (
3+
<div>
4+
<strong>Note</strong>
5+
<ul>
6+
<li>1. Ledger Firmware versions supported: Nano S: v1.5.5 and above; Nano X: v1.2.4-1 and above</li>
7+
<li>
8+
2. Enable these features before you use them:
9+
<ul>
10+
<li>2.1 Transaction Data: Enable it to add notes to transfers.</li>
11+
<li>2.2 Custom Contracts: Enable it to support smart contract transaction, such as TRC20 transfer.</li>
12+
<li>2.3 Sign By Hash: Enable it to edit the account access, i.e. set up multi-signature for the account.</li>
13+
</ul>
14+
</li>
15+
</ul>
16+
</div>
17+
);
18+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Alert, Button, TextField } from '@mui/material';
2+
import type { LedgerAdapter } from '@tronweb3/tronwallet-adapter-ledger';
3+
import { useCallback, useState } from 'react';
4+
import { receiver } from '../LedgerAdapterDemo.js';
5+
import { tronWeb } from '../tronweb.js';
6+
7+
export function ConnectedSection(props: { adapter: LedgerAdapter }) {
8+
const [signMessage, setSignMessage] = useState('Hello, Adapter');
9+
const [signedMessage, setSignedMessage] = useState('');
10+
const [open, setOpen] = useState(false);
11+
12+
const onSignMessage = useCallback(
13+
async function () {
14+
const res = await props.adapter.signMessage(signMessage);
15+
setSignedMessage(res);
16+
},
17+
[props.adapter, signMessage, setSignedMessage]
18+
);
19+
20+
const onVerifyMessage = useCallback(
21+
async function () {
22+
const address = await tronWeb.trx.verifyMessageV2(signMessage, signedMessage);
23+
alert(address === props.adapter.address ? 'success verify' : 'failed verify');
24+
},
25+
[signMessage, signedMessage, props.adapter]
26+
);
27+
async function onSignTransaction() {
28+
const transaction = await tronWeb.transactionBuilder.sendTrx(receiver, tronWeb.toSun(0.1), props.adapter.address);
29+
const signedTransaction = await props.adapter.signTransaction(transaction);
30+
const res = await tronWeb.trx.sendRawTransaction(signedTransaction);
31+
setOpen(true);
32+
}
33+
return (
34+
<div>
35+
<div>
36+
<p>Connect successfully! </p>
37+
<p>Your address is {props.adapter.address}</p>
38+
</div>
39+
<TextField label="Message to sign" size="small" value={signMessage} onChange={(e) => setSignMessage(e.target.value)}></TextField>
40+
<div style={{ marginTop: 10 }}>
41+
<Button variant="contained" disabled={!props.adapter?.connected} onClick={onSignTransaction}>
42+
Transfer
43+
</Button>
44+
&nbsp;&nbsp;&nbsp;&nbsp;
45+
<Button variant="contained" onClick={onSignMessage}>
46+
Sign Message
47+
</Button>
48+
&nbsp;&nbsp;&nbsp;&nbsp;
49+
<Button variant="contained" disabled={!signedMessage} onClick={onVerifyMessage}>
50+
Verify Signed Message
51+
</Button>
52+
</div>
53+
{open && (
54+
<Alert onClose={() => setOpen(false)} severity="success" sx={{ width: '100%', marginTop: 1 }}>
55+
Success! You can confirm your transfer on
56+
<a target="_blank" rel="noreferrer" href={`https://nile.tronscan.org/#/address/${props.adapter.address}`}>
57+
Tron Scan
58+
</a>
59+
</Alert>
60+
)}
61+
</div>
62+
);
63+
}

0 commit comments

Comments
 (0)