base^exp mod modulus for arbitrary-precision integers. EIP-198/EIP-2565.
Copy
Ask AI
import { ModExpService, ModExpLive } from 'voltaire-effect/crypto'
import { Effect } from 'effect'
const result = await Effect.runPromise(
Effect.gen(function* () {
const modexp = yield* ModExpService
return yield* modexp.modexp(2n, 10n, 1000n)
}).pipe(Effect.provide(ModExpLive))
)
// 24n (2^10 mod 1000)
Byte Array Version
Copy
Ask AI
const resultBytes = yield* modexp.modexpBytes(baseBytes, expBytes, modBytes)
Gas Calculation
Copy
Ask AI
const gas = yield* modexp.calculateGas(baseLen, expLen, modLen, expHead)
Testing
Copy
Ask AI
import { ModExpTest } from 'voltaire-effect/crypto'
myProgram.pipe(Effect.provide(ModExpTest))
// modexp returns 0n, calculateGas returns 200n
Interface
Copy
Ask AI
interface ModExpServiceShape {
readonly modexp: (base: bigint, exp: bigint, modulus: bigint) => Effect.Effect<bigint>
readonly modexpBytes: (baseBytes: Uint8Array, expBytes: Uint8Array, modBytes: Uint8Array) => Effect.Effect<Uint8Array>
readonly calculateGas: (baseLen: bigint, expLen: bigint, modLen: bigint, expHead: bigint) => Effect.Effect<bigint>
}

