上次的交互是只读的,现在我们通过发送交易来与合约交互。 我们在合约上开发的第一个功能是递增。让我们在主页面上添加一个发送交易的按钮。正如您所记得的,在链上发送交易需要花费GAS,因此我们希望钱包能与用户一起批准这一操作,并显示将花费多少Ton币。 在开始之前,我们将添加另一个钩子,从 TON Connect 接口生成一个发送方对象。该发送方代表已连接的钱包,允许我们代表它们发送交易。 在处理该交易请求时,我们还将在用户界面中显示钱包的连接状态,以便我们的用户界面将隐藏需要授权的元素。 就像我们在之前的课程中所做的那样,让我们使用 React 钩子来保留一些我们稍后将在代码中使用的功能。 让我们创建包含以下内容的文件 src/hooks/useTonConnect.ts: - import { useTonConnectUI } from '@tonconnect/ui-react';% Z+ W! U6 N/ `
- import { Sender, SenderArguments } from 'ton-core';
# G0 g7 m0 y E- D1 a2 W- n" F9 b - . T G; d) d R
- export function useTonConnect(): { sender: Sender; connected: boolean } {( N* R2 N6 x R! x: }
- const [tonConnectUI] = useTonConnectUI();( f/ ?$ I3 U# k7 h" E
- % ?7 _- _# x0 g" A) T" e5 T ~1 ]
- return {3 l7 M6 Y% H, e, T, q8 g1 V* b6 W
- sender: {, q5 |$ H+ Y( }1 T8 e' `5 i, Y
- send: async (args: SenderArguments) => {
0 k1 u, ^- c2 \) D U - tonConnectUI.sendTransaction({- h% Q7 B; o% s4 ]
- messages: [
- s& @5 w) H/ F - {
! V/ [/ v, Y1 g, C - address: args.to.toString(),3 M/ D( S+ K% |
- amount: args.value.toString(),# B5 \ t* v, `9 x' o
- payload: args.body?.toBoc().toString('base64'),. |, a6 v8 i/ H n
- },
+ _1 e% Z5 [: A( m$ w! C - ],
% d5 A; L% w. c2 [8 P% z- J7 } - validUntil: Date.now() + 5 * 60 * 1000, // 5 minutes for user to approve
/ E+ S5 [* K" O( X& |5 {: N1 W" z4 W - });9 ^8 k1 W# |$ T) P S
- },4 Z; `! O6 K* Z: w
- },
, d2 ` f/ e. |6 t - connected: tonConnectUI.connected,
' \: W( T9 B0 Q* j( } - };8 s& N" [- g: @( W$ o) t
- }
复制代码您可以看到,我们正在返回一个对象,其中的函数 send 可以让我们触发交易请求,参数 connected 可以存储连接的当前状态。 接下来我们要做的是优化现有的 useCounterContract 钩子,并添加两个小功能。 我们需要更新一些代码: - // ... previous imports+ }1 i9 X2 x: \3 L/ O8 \
- import { toNano } from "ton-core";
( ~# F8 a6 G1 U+ o9 ~ - import { useTonConnect } from "./useTonConnect";
- p. [( h3 P% _- u- A: d7 T8 R E
* i: Q U1 F. S; |! y2 Y
2 X v* G; ~. \- export function useCounterContract() {
7 r+ e9 S% C9 @) @ - 7 _ a% w+ D4 I, y' o; C
- // ... variables definitions) N# F: x2 j1 J+ i' ~
- const { sender } = useTonConnect();
5 g: f7 d+ N9 N2 ? - ( V# m) d. b- @2 n1 I- B+ e8 O! d( x
- const sleep = (time: number) => new Promise((resolve) => setTimeout(resolve, time));6 t; |* `1 K/ g8 N5 M" B
-
6 L$ L5 Q% t* f - // ... mainContract definition0 N- I' |" i' e Y! ]. o: m/ r* @% H! u
-
- ?. t* ]) o, s9 X - useEffect(() => {
8 b+ J- g4 [9 u5 |8 M' ^; p - async function getValue() {- J' k, } `( J/ j# {$ t' ]
- - V8 }+ \3 h. W1 O7 p+ l
- // ... previous getValue code
9 f* v2 g% e, g& u - 1 a; Z6 O9 p z( p" q1 Z! E' p* F
- await sleep(5000); // sleep 5 seconds and poll value again
7 t% ~) E5 K0 {7 t# ]2 j - getValue();3 N* T% T5 H* Q' y& N. Q0 l: D7 {
- }) m7 m }7 y A: ~: j
- getValue();* @/ ^6 i5 {+ A. ?. }+ D3 ]
- }, [counterContract]);$ F8 n: d. w+ f4 p& j$ l
/ H7 W: i8 ]8 r
' j+ o# f2 y0 [% {* j% w% D9 j6 x- return {
: A- _* I9 V! b( O; \/ e9 a) { - value: val,
7 r5 M7 o+ u# T5 L8 C. c - address: counterContract?.address.toString(),% ?' M. K' ?) [. q) O. f0 W* k4 M
- sendIncrement: () => {
4 |. V- d5 R: W1 G - return mainContract?.sendIncrement(sender, toNano(0.05), 3);8 q* l' l3 D4 k
- },
- N4 |& f, x; Q' r- \! a, u, g- n' E* ] - };, P/ X" }9 _, K, [& {
- }
复制代码此时,我们只需更新用户界面,就可以触发所需的交易。我们还需要在其中添加两样东西:
3 F1 l% M! e& K: F ^8 A% m- x- // ... previous imports
8 u) b# o5 }& x - import { useTonConnect } from "./hooks/useTonConnect";
3 x$ X0 ?: i# |+ K - ' V8 s7 s: F+ R! N O$ `' _
, ^2 H6 _2 x1 q3 j2 _7 t2 F- function App() {
, E: T2 X) u& \* t: K - ; H l2 d7 N0 q7 `8 q& m
- const { ..., sendIncrement } = useMainContract();9 z: ~. a8 @. g4 A
- const { connected } = useTonConnect()
# P( Q3 t" _3 o& L - + V, Y# a2 O3 ^" r6 U' l
- return (
" V/ A4 L. r, V* t9 Z# A/ k; w/ U - // ... other HTML code
; V3 U* f, T# r: R- k% w' H- T+ b& ] -
2 D! @' M: c$ y - {connected && (
' l+ b& }4 q+ X0 ` - <a
& B2 W6 J7 k) H) Z, ~8 L - onClick={() => {7 X' H/ @( U7 N& w Q
- sendIncrement();* ?- X* ? p) p- R, S
- }}
" }5 \# C' L: Q - ># L. w8 |+ T3 Q% B* E) p9 g& G
- Increment
. ?: H8 \% G$ S9 f - </a>
# \: N2 l; ^4 G$ ?8 b- A, o - )}
$ K% q6 p" }7 R4 f5 e8 f4 @4 r - $ y' @$ o. P( V5 m6 T. j
- // ... other HTML code
# ]# ]- O$ Z5 _) W! j2 g - )# \- q3 H( @% ?
- }
复制代码 5 D2 m" H6 w% u8 d( _# P4 L7 _
4 F j2 R) N, C$ j K" R2 p% T3 R/ X; K7 Z7 \ Z4 L* n7 ~+ T/ z
|