Skip to main content

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;
}