Type Definitions
The EVVM TypeScript library provides comprehensive type definitions for all contract interactions, ensuring type safety and better development experience. All types are exported from the main package and can be imported individually.
Core Types
Base Signature Types
import { SignatureResult, DualSignatureResult } from '@evvm/viem-signature-library';
SignatureResult: Used for single signature operations
interface SignatureResult {
signature: `0x${string}`;
}
DualSignatureResult: Used for operations requiring both payment and action signatures
interface DualSignatureResult {
paySignature?: `0x${string}`;
actionSignature: `0x${string}`;
}
Re-exported Viem/Wagmi Types
The library re-exports common types from viem and wagmi for convenience:
import { Account, WalletClient, Config } from '@evvm/viem-signature-library';
EVVM Payment Types
PayInputData
Type definition for individual payment transactions:
import { PayInputData } from '@evvm/viem-signature-library';
type PayInputData = {
from: `0x${string}`; // Sender address
to_address: `0x${string}`; // Recipient address
to_identity: string; // Recipient username (if applicable)
token: `0x${string}`; // Token contract address
amount: bigint; // Payment amount
priorityFee: bigint; // Priority fee for faster processing
nonce: bigint; // Transaction nonce
priority: boolean; // Priority flag
executor: string; // Transaction executor
signature: string; // Transaction signature
};
DispersePayInputData
Type definition for multi-recipient payments:
import { DispersePayInputData, DispersePayMetadata } from '@evvm/viem-signature-library';
type DispersePayMetadata = {
amount: bigint; // Amount for this recipient
to_address: `0x${string}`; // Recipient address
to_identity: string; // Recipient username (if applicable)
};
type DispersePayInputData = {
from: `0x${string}`; // Sender address
toData: DispersePayMetadata[]; // Array of recipients and amounts
token: `0x${string}`; // Token contract address
amount: bigint; // Total payment amount
priorityFee: bigint; // Priority fee
priority: boolean; // Priority flag
nonce: bigint; // Transaction nonce
executor: string; // Transaction executor
signature: string; // Transaction signature
};
NameService Types
All NameService operations use dual signature patterns with both service and payment signatures.
Username Registration Types
import {
PreRegistrationUsernameInputData,
RegistrationUsernameInputData
} from '@evvm/viem-signature-library';
PreRegistrationUsernameInputData: For username pre-registration
type PreRegistrationUsernameInputData = {
user: `0x${string}`;
hashPreRegisteredUsername: string;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
RegistrationUsernameInputData: For final username registration
type RegistrationUsernameInputData = {
user: `0x${string}`;
username: string;
clowNumber: bigint;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
Marketplace Types
import {
MakeOfferInputData,
WithdrawOfferInputData,
AcceptOfferInputData,
RenewUsernameInputData
} from '@evvm/viem-signature-library';
MakeOfferInputData: For creating username offers
type MakeOfferInputData = {
user: `0x${string}`;
username: string;
expireDate: bigint;
amount: bigint;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
Metadata Management Types
import {
AddCustomMetadataInputData,
RemoveCustomMetadataInputData,
FlushCustomMetadataInputData,
FlushUsernameInputData
} from '@evvm/viem-signature-library';
AddCustomMetadataInputData: For adding metadata to usernames
type AddCustomMetadataInputData = {
user: `0x${string}`;
identity: string;
value: string;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
Staking Types
Basic Staking Types
import {
GoldenStakingInputData,
PresaleStakingInputData,
PublicStakingInputData,
PublicServiceStakingInputData
} from '@evvm/viem-signature-library';
GoldenStakingInputData: For golden staking (single signature)
type GoldenStakingInputData = {
isStaking: boolean;
amountOfStaking: bigint;
signature_EVVM: string;
};
PublicStakingInputData: For public staking (dual signature)
type PublicStakingInputData = {
user: `0x${string}`;
isStaking: boolean;
amountOfStaking: bigint;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
PublicServiceStakingInputData: For service-specific staking
type PublicServiceStakingInputData = {
user: `0x${string}`;
service: `0x${string}`; // Service contract address
isStaking: boolean;
amountOfStaking: bigint;
nonce: bigint;
signature: string;
priorityFee_EVVM: bigint;
nonce_EVVM: bigint;
priorityFlag_EVVM: boolean;
signature_EVVM: string;
};
ABI Types
Contract ABI Structure
import {
ABIFunction,
ABIParameter,
ContractABI,
EstimatorABIType,
EvvmABIType,
NameServiceABIType,
StakingABIType
} from '@evvm/viem-signature-library';
ABIFunction: Defines contract function structure
interface ABIFunction {
type: 'function' | 'constructor' | 'event' | 'error';
name?: string;
inputs: ABIParameter[];
outputs?: ABIParameter[];
stateMutability?: 'pure' | 'view' | 'nonpayable' | 'payable';
}
ABIParameter: Defines function parameter structure
interface ABIParameter {
name: string;
type: string;
internalType?: string;
components?: ABIParameter[];
}
Usage Patterns
Type-Safe Contract Calls
import { writeContract } from '@wagmi/core';
import {
PayInputData,
EvvmABI,
EVVMSignatureBuilder
} from '@evvm/viem-signature-library';
const executeTypedPayment = async (
inputData: PayInputData, // Type-safe input
config: Config
) => {
return writeContract(config, {
abi: EvvmABI, // Type-safe ABI
address: evvmAddress,
functionName: 'pay', // Type-checked function name
args: [ // Type-checked arguments
inputData.from,
inputData.to_address,
inputData.to_identity,
inputData.token,
inputData.amount,
inputData.priorityFee,
inputData.nonce,
inputData.priority,
inputData.executor,
inputData.signature,
],
});
};
Dual Signature Pattern
import {
StakingSignatureBuilder,
PublicStakingInputData,
DualSignatureResult
} from '@evvm/viem-signature-library';
const createStakingInput = async (): Promise<PublicStakingInputData> => {
// Generate dual signatures
const signatures: DualSignatureResult = await stakingBuilder.signPublicStaking(
/* parameters */
);
// Use typed input data structure
const inputData: PublicStakingInputData = {
user: account.address,
isStaking: true,
amountOfStaking: BigInt("5"),
nonce: BigInt("100"),
signature: signatures.actionSignature,
priorityFee_EVVM: BigInt("0"),
nonce_EVVM: BigInt("101"),
priorityFlag_EVVM: false,
signature_EVVM: signatures.paySignature || '0x',
};
return inputData;
};
Custom Type Guards
const isValidPayInputData = (data: any): data is PayInputData => {
return (
typeof data === 'object' &&
typeof data.from === 'string' &&
typeof data.to_address === 'string' &&
typeof data.amount === 'bigint' &&
typeof data.signature === 'string'
);
};
Type Import Patterns
Individual Imports
import { PayInputData, DispersePayInputData } from '@evvm/viem-signature-library';
import { PublicStakingInputData } from '@evvm/viem-signature-library';
import { RegistrationUsernameInputData } from '@evvm/viem-signature-library';
Grouped Imports
import {
// Core types
SignatureResult,
DualSignatureResult,
// Payment types
PayInputData,
DispersePayInputData,
// Staking types
PublicStakingInputData,
GoldenStakingInputData,
// NameService types
RegistrationUsernameInputData,
MakeOfferInputData
} from '@evvm/viem-signature-library';
All types are designed to provide maximum type safety and integrate seamlessly with TypeScript's type checking system, ensuring robust and maintainable EVVM applications.