In this section we show how to use implement support for custom contract calls in ContractCondition
.
Let's start with the following example:
import { conditions } from '@nucypher/taco';
const myFunctionAbi: conditions.base.contract.FunctionAbiProps = {
name: 'myFunction',
type: 'function',
stateMutability: 'view',
inputs: [
{
internalType: 'address',
name: 'account',
type: 'address',
},
{
internalType: 'uint256',
name: 'myCustomParam',
type: 'uint256',
},
],
outputs: [
{
internalType: 'uint256',
name: 'someValue',
type: 'uint256',
},
],
};
const myContractCallCondition = new conditions.base.contract.ContractCondition({
method: 'myFunction', // `myMethodAbi.name`
parameters: [':userAddress', ':myCustomParam'], // `myMethodAbi.inputs`
functionAbi: myFunctionAbi, // Our custom function ABI
contractAddress: '0x0...1',
chain: 5,
returnValueTest: {
comparator: '>',
value: 0,
},
});
First, let's take a look at myFunctionAbi
:
- We define a complete function ABI with
name
,type
,stateMutability
,inputs
, andoutputs
- With those fields in place, our function shapes up to be defined as
myFunction(address, uint256): uint256
- Note that
type
field required to befunction
andstateMutability
topure
andview
to avoid accidentally mutating the contract state
Now, looking at myContractCallCondition
we can see that:
- We need to pass
myFunction
asmethod
andmyFunctionAbi
asfunctionAbi
for our contract call to be recognized correctly - We've mapped our function parameters to
parameters
, so thataddress
is represented as':userAddress'
anduint256
is represented as':myCustomParam'
. See Condition Context and Context Variables for more details. - Lastly, the
myFunctionAbi.outputs
will be used byreturnValueTest
to compare with the selected thresholdvalue
, resulting in a testmyFunctionAbi.outputs[0] > 0
- See how to implement access control revocation using custom contract calls here.