@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
197 lines (176 loc) • 5.08 kB
text/typescript
import { TSchema, Data } from '@evolution-sdk/evolution';
import {
ProposalContentSchema,
TreasuryWithdrawalSchema,
} from '../gov/types-new';
import {
AddressSchema,
OutputReferenceSchema,
} from '@3rd-eye-labs/cardano-offchain-common';
import { option as O, function as F } from 'fp-ts';
import { match, P } from 'ts-pattern';
import { DEFAULT_SCHEMA_OPTIONS } from '../../types/evolution-schema-options';
const PollStatusSchema = TSchema.Struct({
yesVotes: TSchema.Integer,
noVotes: TSchema.Integer,
});
export type PollStatus = typeof PollStatusSchema.Type;
const PollManagerContentSchema = TSchema.Struct({
pollId: TSchema.Integer,
pollOwner: TSchema.ByteArray,
content: ProposalContentSchema,
treasuryWithdrawal: TSchema.NullOr(TreasuryWithdrawalSchema),
status: PollStatusSchema,
votingEndTime: TSchema.Integer,
createdShardsCount: TSchema.Integer,
talliedShardsCount: TSchema.Integer,
totalShardsCount: TSchema.Integer,
proposingEndTime: TSchema.Integer,
expirationTime: TSchema.Integer,
protocolVersion: TSchema.Integer,
minimumQuorum: TSchema.Integer,
});
export type PollManagerContent = typeof PollManagerContentSchema.Type;
const PollShardContentSchema = TSchema.Struct({
pollId: TSchema.Integer,
status: PollStatusSchema,
votingEndTime: TSchema.Integer,
managerAddress: AddressSchema,
});
export type PollShardContent = typeof PollShardContentSchema.Type;
const PollDatumSchema = TSchema.Union(
TSchema.Struct(
{
PollManager: PollManagerContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct({ PollShard: PollShardContentSchema }, { flatInUnion: true }),
);
export type PollDatum = typeof PollDatumSchema.Type;
const VoteOptionSchema = TSchema.Union(
TSchema.Literal('Yes', { flatInUnion: true }),
TSchema.Literal('No', { flatInUnion: true }),
);
export type VoteOption = typeof VoteOptionSchema.Type;
const PollShardRedeemerSchema = TSchema.Union(
TSchema.Struct({ Vote: VoteOptionSchema }, { flatInUnion: true }),
TSchema.Struct(
{
MergeShards: TSchema.Struct(
{
currentTime: TSchema.Integer,
pollManagerRef: OutputReferenceSchema,
},
{ flatFields: true },
),
},
{ flatInUnion: true },
),
);
export type PollShardRedeemer = typeof PollShardRedeemerSchema.Type;
const PollManagerRedeemerSchema = TSchema.Union(
TSchema.Struct(
{
EndPoll: TSchema.Struct(
{ currentTime: TSchema.Integer },
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Struct(
{
CreateShards: TSchema.Struct(
{ currentTime: TSchema.Integer },
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Struct(
{
MergeShardsManager: TSchema.Struct(
{ currentTime: TSchema.Integer },
{ flatFields: true },
),
},
{ flatInUnion: true },
),
);
export type PollManagerRedeemer = typeof PollManagerRedeemerSchema.Type;
export function serialisePollManagerRedeemer(r: PollManagerRedeemer): string {
return Data.withSchema(PollManagerRedeemerSchema).toCBORHex(r);
}
export function serialisePollShardRedeemer(r: PollShardRedeemer): string {
return Data.withSchema(PollShardRedeemerSchema).toCBORHex(r);
}
export function parsePollShardRedeemer(
datum: string,
): O.Option<PollShardRedeemer> {
try {
return O.some(
Data.withSchema(
PollShardRedeemerSchema,
DEFAULT_SCHEMA_OPTIONS,
).fromCBORHex(datum),
);
} catch (_) {
return O.none;
}
}
export function parsePollShardRedeemerOrThrow(
datum: string,
): PollShardRedeemer {
return F.pipe(
parsePollShardRedeemer(datum),
O.match(() => {
throw new Error('Expected a poll shard redeemer.');
}, F.identity),
);
}
export function parsePollManager(datum: string): O.Option<PollManagerContent> {
try {
return match(
Data.withSchema(PollDatumSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
datum,
),
)
.with({ PollManager: P.select() }, (res) => O.some(res))
.otherwise(() => O.none);
} catch (_) {
return O.none;
}
}
export function parsePollManagerOrThrow(datum: string): PollManagerContent {
return F.pipe(
parsePollManager(datum),
O.match(() => {
throw new Error('Expected a poll manager datum.');
}, F.identity),
);
}
export function parsePollShard(datum: string): O.Option<PollShardContent> {
try {
return match(
Data.withSchema(PollDatumSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
datum,
),
)
.with({ PollShard: P.select() }, (res) => O.some(res))
.otherwise(() => O.none);
} catch (_) {
return O.none;
}
}
export function parsePollShardOrThrow(datum: string): PollShardContent {
return F.pipe(
parsePollShard(datum),
O.match(() => {
throw new Error('Expected a poll shard datum.');
}, F.identity),
);
}
export function serialisePollDatum(d: PollDatum): string {
return Data.withSchema(PollDatumSchema).toCBORHex(d);
}