Skip to main content
import * as FunctionSignature from 'voltaire-effect/primitives/FunctionSignature'
import * as Schema from 'effect/Schema'
import { Effect } from 'effect'

// Parse signature → selector + name
const sig = Effect.runSync(FunctionSignature.from('transfer(address,uint256)'))
console.log(sig.name)      // 'transfer'
console.log(sig.selector)  // Uint8Array(4) [0xa9, 0x05, 0x9c, 0xbb]
console.log(sig.signature) // 'transfer(address,uint256)'

// Schema
const parsed = Schema.decodeSync(FunctionSignature.String)('balanceOf(address)')

Type

type FunctionSignatureType = {
  selector: Uint8Array  // 4-byte keccak256 prefix
  signature: string     // original signature
  name: string          // function name
}

API

FunctionType
SchemaSchema<FunctionSignatureType, string>
from(sig: string) => Effect<FunctionSignatureType, FunctionSignatureError>
fromSignaturealias for from

Example: Build Calldata

const buildCalldata = (signature: string, args: Uint8Array) =>
  Effect.gen(function* () {
    const sig = yield* FunctionSignature.from(signature)
    const calldata = new Uint8Array(4 + args.length)
    calldata.set(sig.selector, 0)
    calldata.set(args, 4)
    return calldata
  })