Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/tdec-epic' into prefix-conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
piotr-roslaniec committed Jun 16, 2023
2 parents 14ddace + 7138a04 commit 3212506
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 139 deletions.
35 changes: 34 additions & 1 deletion src/conditions/base/contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,47 @@ import { RpcCondition, rpcConditionRecord } from './rpc';

export const STANDARD_CONTRACT_TYPES = ['ERC20', 'ERC721'];

const functionAbiVariable = Joi.object({
internalType: Joi.string().required(),
name: Joi.string().required(),
type: Joi.string().required(),
});

const functionAbiSchema = Joi.object({
name: Joi.string().required(),
type: Joi.string().valid('function').required(),
inputs: Joi.array().items(functionAbiVariable),
outputs: Joi.array().items(functionAbiVariable),
// TODO: Should we restrict this to 'view'?
// stateMutability: Joi.string().valid('view').required(),
}).custom((functionAbi, helper) => {
// Validate method name
const method = helper.state.ancestors[0].method;
if (functionAbi.name !== method) {
return helper.message({
custom: '"method" must be the same as "functionAbi.name"',
});
}

// Validate nr of parameters
const parameters = helper.state.ancestors[0].parameters;
if (functionAbi.inputs?.length !== parameters.length) {
return helper.message({
custom: '"parameters" must have the same length as "functionAbi.inputs"',
});
}

return functionAbi;
});

export const contractConditionRecord = {
...rpcConditionRecord,
contractAddress: Joi.string().pattern(ETH_ADDRESS_REGEXP).required(),
standardContractType: Joi.string()
.valid(...STANDARD_CONTRACT_TYPES)
.optional(),
method: Joi.string().required(),
functionAbi: Joi.object().optional(),
functionAbi: functionAbiSchema.optional(),
parameters: Joi.array().required(),
};

Expand Down
56 changes: 56 additions & 0 deletions test/unit/conditions/base/condition.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
TEST_CONTRACT_ADDR,
TEST_CONTRACT_ADDR_2,
testContractConditionObj,
testFunctionAbi,
} from '../../testVariables';

describe('validation', () => {
Expand Down Expand Up @@ -61,3 +62,58 @@ describe('serialization', () => {
});
});
});
describe('accepts either standardContractType or functionAbi but not both or none', () => {
const standardContractType = 'ERC20';

it('accepts standardContractType', () => {
const conditionObj = {
...testContractConditionObj,
standardContractType,
functionAbi: undefined,
};
const contractCondition = new ContractCondition(conditionObj);
expect(contractCondition.toObj()).toEqual({
...conditionObj,
});
});

it('accepts functionAbi', () => {
const conditionObj = {
...testContractConditionObj,
functionAbi: testFunctionAbi,
method: testFunctionAbi.name,
parameters: [1, 2],
standardContractType: undefined,
};
const contractCondition = new ContractCondition(conditionObj);
expect(contractCondition.toObj()).toEqual({
...conditionObj,
});
});

it('rejects both', () => {
const conditionObj = {
...testContractConditionObj,
standardContractType,
functionAbi: testFunctionAbi,
method: testFunctionAbi.name,
parameters: [1, 2],
};
const contractCondition = new ContractCondition(conditionObj);
expect(() => contractCondition.toObj()).toThrow(
'"value" contains a conflict between exclusive peers [standardContractType, functionAbi]'
);
});

it('rejects none', () => {
const conditionObj = {
...testContractConditionObj,
standardContractType: undefined,
functionAbi: undefined,
};
const contractCondition = new ContractCondition(conditionObj);
expect(() => contractCondition.toObj()).toThrow(
'"value" must contain at least one of [standardContractType, functionAbi]'
);
});
});
138 changes: 0 additions & 138 deletions test/unit/conditions/base/evm.test.ts

This file was deleted.

1 change: 1 addition & 0 deletions test/unit/conditions/context.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ describe('context parameters', () => {
...testContractConditionObj,
standardContractType: undefined, // We're going to use a custom function ABI
functionAbi: testFunctionAbi,
method: testFunctionAbi.name,
parameters: [USER_ADDRESS_PARAM, customParamKey], // We're going to use a custom parameter
returnValueTest: {
...testReturnValueTest,
Expand Down
3 changes: 3 additions & 0 deletions test/unit/testVariables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,19 @@ export const testFunctionAbi = {
type: 'function',
inputs: [
{
internalType: 'address',
name: 'account',
type: 'address',
},
{
internalType: 'uint256',
name: 'myCustomParam',
type: 'uint256',
},
],
outputs: [
{
internalType: 'uint256',
name: 'someValue',
type: 'uint256',
},
Expand Down

0 comments on commit 3212506

Please sign in to comment.