Calling contract functions
This is the most complex transaction type that we can work with -- this is for when you're interested in calling a specific public function for a given smart contract deployed to the blockchain.
💡
If you're interested in learning how to call read-only contract functions, check out this guide.
Usage
@micro-stacks/react
exports a hook that you will use to call contract functions:
useOpenContractCall
.
import { useOpenContractCall } from '@micro-stacks/react';
Parameters
contractAddress
: The principal that deployed the contract you want to interact with.contractName
: The name of the contract.functionName
: The specific function that you want to call.functionArgs
: An array of either hex-encodedClarityValue
orClarityValue
values.validateWithAbi
: A boolean value, if set to true, the function will attempt to fetch the ABI for the contract. Alternatively, you can pass the ABI directly to this parameter.
Example
import {
uintCV,
intCV,
bufferCV,
stringAsciiCV,
stringUtf8CV,
standardPrincipalCV,
trueCV,
} from 'micro-stacks/clarity';
import { utf8ToBytes } from 'micro-stacks/common';
import { FungibleConditionCode, makeStandardSTXPostCondition } from 'micro-stacks/transactions';
export const MyContractCallTx = () => {
const { openContractCall, isRequestPending } = useOpenContractCall();
const { stxAddress } = useAccount();
const [response, setResponse] = useState(null);
const functionArgs = [
uintCV(1234),
intCV(-234),
bufferCV(utf8ToBytes('hello, world')),
stringAsciiCV('hey-ascii'),
stringUtf8CV('hey-utf8'),
standardPrincipalCV('ST1X6M947Z7E58CNE0H8YJVJTVKS9VW0PHEG3NHN3'),
trueCV(),
];
const handleOpenContractCall = async () => {
const postConditions = [
makeStandardSTXPostCondition(stxAddress!, FungibleConditionCode.LessEqual, '100'),
];
await openContractCall({
contractAddress: 'ST1X6M947Z7E58CNE0H8YJVJTVKS9VW0PHEG3NHN3',
contractName: 'faker',
functionName: 'rawr',
functionArgs,
postConditions,
attachment: 'This is an attachment',
onFinish: async data => {
console.log('finished contract call!', data);
setResponse(data);
},
onCancel: () => {
console.log('popup closed!');
},
});
};
return (
<div>
<h4>Faker contract call</h4>
{response && (
<pre>
<code>{JSON.stringify(response, null, 2)}</code>
</pre>
)}
<button onClick={() => handleOpenContractCall()}>
{isRequestPending ? 'request pending...' : 'Call Contract'}
</button>
</div>
);
};