Step 2: Prepare Payload
Once you've managed with Rule ID, now you are ready to prepare a payload
The payload must be a valid typed structured json according to EIP-712
There is an example how to prepare it using Viem and PureFi Verifier-SDK npm packages in Typescript, but feel free to make your own implementation
import { parseUnits, createWalletClient, custom, http, Chain } from 'viem';
import {
PureFI,
PackageType,
createDomain,
createRuleV5Types,
RuleV5Data,
RuleV5Payload,
PureFIRuleV5Payload,
} from '@purefi/verifier-sdk';
async function preparePayload(
ruleId: string,
packageType: PackageType,
userAddress: `0x${string}`,
contractAddress: `0x${string}`,
token0Address: `0x${string}`, // zero address for native coins
token0Decimals: number,
token0Value: string,
chain: Chain
): Promise<PureFIRuleV5Payload> {
const domain = createDomain('PureFi', chain.id);
const token0ValueParsed = parseUnits(token0Value, token0Decimals);
const ruleV5Payload: RuleV5Payload = {
ruleId,
from: userAddress,
to: contractAddress,
tokenData0: {
address: token0Address,
value: token0ValueParsed.toString(),
decimals: token0Decimals.toString(),
},
packageType,
};
const ruleV5Data: RuleV5Data = {
account: {
address: userAddress,
},
chain: {
id: chain.id.toString(),
},
payload: ruleV5Payload,
};
const v5RuleTypes = createRuleV5Types(ruleV5Payload);
// IN CASE OF BACKEND INTEGRATION, e.g. Custom Signer
// const account = privateKeyToAccount('0x...')
// const walletClient = createWalletClient({
// account,
// chain,
// transport: http(),
// });
const walletClient = createWalletClient({
chain,
transport: custom((window as any).ethereum!),
});
const signature = await walletClient.signTypedData({
account: userAddress,
domain,
types: v5RuleTypes,
primaryType: 'Data',
message: ruleV5Data,
});
const payload: PureFIRuleV5Payload = {
message: ruleV5Data,
signature,
};
return payload;
}