// drep = // [ 0, addr_keyhash // // 1, scripthash // // 2 ; always abstain // // 3 ; always no confidence // ] export type RawDRep = [0, Buffer] | [1, Buffer] | [2] | [3]; export class DRep { type!: string; keyHash!: Buffer; scriptHash!: Buffer; static fromCborObject(obj: RawDRep): DRep { throw new Error("Method 'fromCborObject' must be implemented in derived classes"); } } export class KeyDRep extends DRep { declare keyHash: Buffer; constructor(keyHash: Buffer) { super(); this.keyHash = keyHash; this.type = "keyDRep"; } static override fromCborObject(obj: RawDRep): KeyDRep { if (obj[0] == 0) { return new KeyDRep(obj[1]); } else throw new Error("Invalid CBOR type for KeyDRep"); } } export class ScriptDRep extends DRep { declare scriptHash: Buffer; constructor(scriptHash: Buffer) { super(); this.scriptHash = scriptHash; this.type = "scriptDRep"; } static override fromCborObject(obj: RawDRep): ScriptDRep { if (obj[0] == 1) { return new ScriptDRep(obj[1]); } else throw new Error("Invalid CBOR type for ScriptDRep"); } } export class AbstainDRep extends DRep { constructor() { super(); this.type = "abstainDRep"; } static override fromCborObject(obj: RawDRep): AbstainDRep { if (obj[0] == 2) { return new AbstainDRep(); } else throw new Error("Invalid CBOR type for AbstainDRep"); } } export class NoConfidenceDRep extends DRep { constructor() { super(); this.type = "noConfidenceDRep"; } static override fromCborObject(obj: RawDRep): NoConfidenceDRep { if (obj[0] == 3) { return new NoConfidenceDRep(); } else throw new Error("Invalid CBOR type for NoConfidenceDRep"); } } DRep.fromCborObject = function (obj: RawDRep): DRep { switch (obj[0]) { case 0: return KeyDRep.fromCborObject(obj); case 1: return ScriptDRep.fromCborObject(obj); case 2: return AbstainDRep.fromCborObject(obj); case 3: return NoConfidenceDRep.fromCborObject(obj); default: throw new Error("Unknown DRep type"); } };