diff --git a/lib/generic.ts b/lib/generic.ts index 873897a1..4b73ad94 100644 --- a/lib/generic.ts +++ b/lib/generic.ts @@ -4,6 +4,7 @@ export { GenericProvable, GenericProvablePure, GenericProvableExtended, + GenericProvableExtendedPure, GenericField, GenericBool, GenericHashInput, @@ -29,13 +30,22 @@ interface GenericProvablePure extends GenericProvable { check: (x: T) => void; } -type GenericProvableExtended = GenericProvable & { +type ProvableExtension = { toInput: (x: T) => { fields?: Field[]; packed?: [Field, number][] }; toJSON: (x: T) => TJson; fromJSON: (x: TJson) => T; emptyValue?: () => T; }; +type GenericProvableExtended = GenericProvable & + ProvableExtension; + +type GenericProvableExtendedPure = GenericProvablePure< + T, + Field +> & + ProvableExtension; + type GenericField = ((value: number | string | bigint) => Field) & GenericProvableExtended & Binable & { sizeInBytes(): number }; diff --git a/lib/provable-generic.ts b/lib/provable-generic.ts index dbb80d0b..5d5fbc5e 100644 --- a/lib/provable-generic.ts +++ b/lib/provable-generic.ts @@ -3,6 +3,7 @@ import { GenericProvable, GenericProvablePure, GenericProvableExtended, + GenericProvableExtendedPure, } from './generic.js'; export { @@ -180,7 +181,7 @@ function createProvable(): ProvableConstructor { let keys = isToplevel ? objectKeys : Object.keys(typeObj); let values = fromJSON( keys.map((k) => typeObj[k]), - json + keys.map((k) => json[k]) ); return Object.fromEntries(keys.map((k, i) => [k, values[i]])); } @@ -353,12 +354,6 @@ type IsPureBase = A extends GenericProvablePure }[keyof A] : false; -type GenericProvableExtendedPure = GenericProvablePure< - T, - Field -> & - GenericProvableExtended; - type InferredProvable = IsPure extends true ? GenericProvableExtendedPure, InferJson, Field> : GenericProvableExtended, InferJson, Field>; diff --git a/lib/provable-snarky.ts b/lib/provable-snarky.ts index 185b2ee4..73e6863a 100644 --- a/lib/provable-snarky.ts +++ b/lib/provable-snarky.ts @@ -7,10 +7,10 @@ import { InferJson, InferredProvable as GenericInferredProvable, IsPure as GenericIsPure, + createHashInput, } from './provable-generic.js'; import { Tuple } from '../../lib/util/types.js'; - -// TODO make this whole file reuse ./provable-generic.ts +import { GenericHashInput } from './generic.js'; // external API export { ProvableExtended, provable, provablePure, provableTuple }; @@ -29,6 +29,7 @@ type ProvableExtension = { toInput: (x: T) => { fields?: Field[]; packed?: [Field, number][] }; toJSON: (x: T) => TJson; fromJSON: (x: TJson) => T; + emptyValue?: () => T; }; type ProvableExtended = Provable & ProvableExtension; @@ -39,18 +40,8 @@ type InferProvable = GenericInferProvable; type InferredProvable = GenericInferredProvable; type IsPure = GenericIsPure; -type HashInput = { fields?: Field[]; packed?: [Field, number][] }; -const HashInput = { - get empty() { - return {}; - }, - append(input1: HashInput, input2: HashInput): HashInput { - return { - fields: (input1.fields ?? []).concat(input2.fields ?? []), - packed: (input1.packed ?? []).concat(input2.packed ?? []), - }; - }, -}; +type HashInput = GenericHashInput; +const HashInput = createHashInput(); const provable = createProvable();