-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathExecuteWasmContract.tsx
More file actions
117 lines (104 loc) · 3.09 KB
/
ExecuteWasmContract.tsx
File metadata and controls
117 lines (104 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import { useMemo, useState } from 'react';
import { Box, Text } from '@interchain-ui/react';
import { useChain } from '@interchain-kit/react';
import { Coin } from '@interchainjs/react/cosmos/base/v1beta1/coin';
import {
JsonInput,
InputField,
AttachFundsRadio,
ContractAddressField,
} from '../common';
import { Button } from '../../common';
import { useChainStore } from '@/contexts';
import { useDetectBreakpoints, useExecuteContractTx } from '@/hooks';
import { validateJson } from '@/utils';
import { ExecuteTabProps } from './ExecuteTab';
const INPUT_LINES = 12;
type ExecuteWasmContractProps = ExecuteTabProps;
export const ExecuteWasmContract = ({
show,
addressValue,
onAddressInput,
}: ExecuteWasmContractProps) => {
const [contractAddress, setContractAddress] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [executeMsg, setExecuteMsg] = useState('');
const [funds, setFunds] = useState<Coin[]>([]);
const [isAssetListJsonValid, setIsAssetListJsonValid] = useState(true);
const { selectedChain } = useChainStore();
const { address, connect } = useChain(selectedChain);
const { executeTx } = useExecuteContractTx(selectedChain);
const handleExecuteMsg = () => {
if (!address) {
connect();
return;
}
setIsLoading(true);
executeTx({
msg: JSON.parse(executeMsg),
address,
contractAddress,
fee: { amount: [], gas: '200000' },
funds,
onTxSucceed: () => setIsLoading(false),
onTxFailed: () => setIsLoading(false),
});
};
const isMsgValid = validateJson(executeMsg) === null;
const buttonText = useMemo(() => {
if (!address) return 'Connect Wallet';
return 'Execute';
}, [address]);
const isButtonDisabled = useMemo(() => {
if (!address) return false;
return !contractAddress || !isMsgValid || !isAssetListJsonValid;
}, [address, contractAddress, isMsgValid, isAssetListJsonValid]);
const { isMobile } = useDetectBreakpoints();
return (
<Box
display={show ? 'flex' : 'none'}
maxWidth="560px"
mx="auto"
flexDirection="column"
gap="20px"
>
<Text
fontSize="24px"
fontWeight="500"
color="$blackAlpha600"
textAlign="center"
>
Execute Contract
</Text>
<ContractAddressField
addressValue={addressValue}
onAddressInput={onAddressInput}
onValidAddressChange={setContractAddress}
/>
<InputField title="Execute Message">
<JsonInput
value={executeMsg}
setValue={setExecuteMsg}
minLines={INPUT_LINES}
height="250px"
/>
</InputField>
<InputField title="Attach Funds">
<AttachFundsRadio
setFunds={setFunds}
setIsAssetListJsonValid={setIsAssetListJsonValid}
direction={isMobile ? 'column' : 'row'}
/>
</InputField>
<Button
onClick={handleExecuteMsg}
disabled={isButtonDisabled}
isLoading={isLoading}
width="100%"
variant="primary"
>
{buttonText}
</Button>
</Box>
);
};