Skip to content

Commit 6613b67

Browse files
committed
tx with wallet
1 parent a27a967 commit 6613b67

File tree

3 files changed

+51
-16
lines changed

3 files changed

+51
-16
lines changed

docs/course/demos/solana-memo-call.tsx

+34-13
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
import React, { useState } from 'react';
22
import { BrowserLink, ConnectButton, Connector, useAccount } from '@ant-design/web3';
33
import { useConnection, useWallet } from '@ant-design/web3-solana';
4-
import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js';
5-
import { Button, Card, ConfigProvider, Flex, Form, Input, message, Space } from 'antd';
4+
import {
5+
LAMPORTS_PER_SOL,
6+
PublicKey,
7+
SystemProgram,
8+
Transaction,
9+
TransactionInstruction,
10+
} from '@solana/web3.js';
11+
import { Button, Card, ConfigProvider, Flex, Form, Input, InputNumber, message, Space } from 'antd';
12+
13+
type FormModel = {
14+
memo: string;
15+
amount: number;
16+
};
617

718
const MEMO_PROGRAM_ID = new PublicKey('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr');
819

@@ -14,30 +25,37 @@ export default function MemoTx() {
1425
const { publicKey, sendTransaction } = useWallet();
1526
const [signatures, setSignatures] = useState<string[]>([]);
1627

17-
const writeMemo = async (memo: string) => {
28+
const writeMemo = async (values: FormModel) => {
1829
if (!publicKey) {
1930
messageApi.error('Please connect wallet first');
2031
return;
2132
}
2233

34+
// Create a transaction instruction to transfer 0.1 SOL
35+
const transferIns = SystemProgram.transfer({
36+
fromPubkey: publicKey,
37+
toPubkey: new PublicKey('4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1t'),
38+
lamports: values.amount * LAMPORTS_PER_SOL,
39+
});
40+
2341
// Create a transaction instruction to write memo
24-
const ins = new TransactionInstruction({
42+
const memoIns = new TransactionInstruction({
2543
programId: MEMO_PROGRAM_ID,
2644
keys: [{ pubkey: publicKey, isSigner: true, isWritable: false }],
27-
data: Buffer.from(memo, 'utf-8'),
45+
data: Buffer.from(values.memo, 'utf-8'),
2846
});
2947

30-
const tx = new Transaction().add(ins);
48+
const tx = new Transaction().add(transferIns, memoIns);
3149

3250
// Send transaction via wallet (通过钱包发送交易)
33-
// Once the transaction is sent, the signature will be returned (发送交易后会返回签名
51+
// Once the transaction is confirmed, the signature will be returned (交易确认后会返回签名
3452
const signature = await sendTransaction?.(tx, connection);
3553

3654
setSignatures([...signatures, signature]);
3755

3856
messageApi.info(
3957
<Space>
40-
<span>Memo sent with signature: </span>
58+
<span>Transaction sent with signature: </span>
4159
<BrowserLink type="transaction" address={signature} ellipsis target="_blank" />
4260
</Space>,
4361
60,
@@ -46,16 +64,19 @@ export default function MemoTx() {
4664

4765
return (
4866
<Flex gap={16} flex={1}>
49-
<Form
67+
<Form<FormModel>
5068
style={{ flex: 1 }}
5169
layout="vertical"
5270
disabled={!publicKey}
53-
onFinish={(values) => {
54-
writeMemo(values.memo);
55-
}}
71+
initialValues={{ amount: 0.1, memo: 'Hello, Solana!' }}
72+
onFinish={writeMemo}
5673
>
74+
<Form.Item name="amount" label="Amount" required rules={[{ required: true }]}>
75+
<InputNumber min={0.1} precision={1} step={0.1} style={{ width: 400 }} />
76+
</Form.Item>
77+
5778
<Form.Item name="memo" label="Memo" required rules={[{ required: true }]}>
58-
<Input.TextArea />
79+
<Input.TextArea style={{ width: 400 }} />
5980
</Form.Item>
6081

6182
<Space>

docs/course/demos/solana-tx.tsx docs/course/demos/solana-tx-without-wallet.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const programId = new PublicKey('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr');
1818

1919
export default function App() {
2020
const [amount, setAmount] = useState(0.1);
21-
const [memo, setMemo] = useState('Hello Ant Design Web3 - Solana!');
21+
const [memo, setMemo] = useState('Hello, Web3!');
2222

2323
const writeMemo = async () => {
2424
const keypair = Keypair.generate();

docs/course/intro-call-contract-solana.zh-CN.md

+16-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Memo Program 是 Solana 上的一个示例程序,它是一个简单的合约
2424

2525
所谓的直接调用合约,是指不使用钱包,而是直接使用私钥来签署交易。这种方式适用于一些简单的场景,比如在测试网络上进行一些调试。
2626

27-
<code src="./demos/solana-tx.tsx"></code>
27+
<code src="./demos/solana-tx-without-wallet.tsx"></code>
2828

2929
在上面的代码中,我们并没有使用任何 `@ant-design/web3-solana` 中的内容,实际调用位于 `writeMemo` 函数。
3030

@@ -54,7 +54,9 @@ Memo Program 是 Solana 上的一个示例程序,它是一个简单的合约
5454

5555
而在创建 memo 指令时,由于 @solana/web3.js 中没有提供对应的函数,所以我们选择手动构造转账指令对象。我们需要指明要调用的合约(Memo)的地址([MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr](https://solscan.io/account/MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr?cluster=devnet))、参与这条指令的公钥、以及要传递的数据(这里是一个字符串,但是转为了 Buffer)。注意:参与者账户必须是交易的签名者,所以 `isSigner` 值为 `true`。具体文档可以在这里找到:https://spl.solana.com/memo#operational-notes
5656

57-
最后,我们使用 `sendAndConfirmTransaction` 方法来发送交易。这个方法会将交易发送到网络,并等待确认。如果交易成功,它会返回一个 TransactionSignature 对象。实际上是一个字符串,表示交易的哈希值,我们可以通过它去区块链浏览器上查看交易的详情。
57+
最后,我们使用 `sendAndConfirmTransaction` 方法来发送交易。这个方法会将交易发送到网络,并等待确认。注意我们调用它的时候,传入了密钥对,这样它就可以使用私钥来签名交易。
58+
59+
如果交易成功,它会返回一个 TransactionSignature 对象。实际上是一个字符串,表示交易的哈希值,我们可以通过它去区块链浏览器上查看交易的详情。
5860

5961
让我们点击【Send】按钮,运行一下代码,看看效果吧!
6062

@@ -64,4 +66,16 @@ Memo Program 是 Solana 上的一个示例程序,它是一个简单的合约
6466

6567
## 使用钱包调用合约
6668

69+
在 dApp 开发中,我们通常会使用钱包来管理用户的密钥对。这样可以更加安全,也更加方便。于是,用户可以通过钱包来签署交易,而不是将自己的私钥暴露给 dApp。
70+
6771
<code src="./demos/solana-tx-with-wallet.tsx"></code>
72+
73+
相比第一节中直接调用合约的代码,这里做了些删减,去掉了生成密钥对、请求测试币空投等步骤。我们直接使用钱包中的密钥对来签署交易。
74+
75+
具体交易处理逻辑在 `writeMemo` 中,和之前的逻辑基本一致。同样创建了一个转账指令和一个 memo 指令,然后将它们添加到交易中。
76+
77+
不同的是,我们使用了 `useWallet` hook 来获取钱包提供的 `sendTransaction` 方法。这个方法会将交易发送到网络,并等待确认。注意我们调用它的时候,并没有传入密钥对。
78+
79+
## 其他
80+
81+
在上面两个示例中,我们在创建 Memo 指令时,均通过手动构造 `TransactionInstruction` 对象进行。这样做虽然可以让我们更加灵活,但是也增加了一些工作量。如果你想要更加简单的方式,可以使用 `@solana/spl-memo` 提供的 `createMemoInstruction` 方法。具体代码可在此处找到:[@solana/spl-memo](https://github.com/solana-program/memo/blob/main/clients/js-legacy/src/index.ts)

0 commit comments

Comments
 (0)