@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
269 lines (246 loc) • 7.75 kB
text/typescript
import { TSchema, Data } from '@evolution-sdk/evolution';
import { DEFAULT_SCHEMA_OPTIONS } from '../../types/evolution-schema-options';
import {
AddressSchema,
AssetClassSchema,
} from '@3rd-eye-labs/cardano-offchain-common';
import { option as O, function as F } from 'fp-ts';
import { IAssetPriceInfoSchema } from '../iasset/types';
import { MultisigSchema } from '../../types/multisig';
import { RationalSchema } from '../../types/rational';
export const ProtocolParamsSchema = TSchema.Struct({
proposalDeposit: TSchema.Integer,
votingPeriod: TSchema.Integer,
effectiveDelay: TSchema.Integer,
expirationPeriod: TSchema.Integer,
proposingPeriod: TSchema.Integer,
totalShards: TSchema.Integer,
minimumQuorum: TSchema.Integer,
maxTreasuryLovelaceSpend: TSchema.Integer,
maxTreasuryIndySpend: TSchema.Integer,
cdpRedemptionRequiredSignature: TSchema.NullOr(TSchema.ByteArray),
electorate: TSchema.Integer,
foundationMultisig: MultisigSchema,
});
export type ProtocolParams = typeof ProtocolParamsSchema.Type;
const UpgradePathSchema = TSchema.Struct({
upgradeSymbol: TSchema.ByteArray,
});
const UpgradePathsSchema = TSchema.Struct({
upgradeId: TSchema.Integer,
/// Underlying representation of the following mapping: ValidatorHash -> UpgradePath
upgradePaths: TSchema.Array(
TSchema.Tuple([TSchema.ByteArray, UpgradePathSchema]),
),
});
export type UpgradePaths = typeof UpgradePathsSchema.Type;
const ProposeIAssetContentSchema = TSchema.Struct({
asset: TSchema.ByteArray,
debtMintingFeeRatio: RationalSchema,
liquidationProcessingFeeRatio: RationalSchema,
stabilityPoolWithdrawalFeeRatio: RationalSchema,
redemptionReimbursementRatio: RationalSchema,
redemptionProcessingFeeRatio: RationalSchema,
});
export type ProposeAssetContent = typeof ProposeIAssetContentSchema.Type;
const ModifyIAssetContentSchema = TSchema.Struct({
asset: TSchema.ByteArray,
newDebtMintingFeeRatio: RationalSchema,
newLiquidationProcessingFeeRatio: RationalSchema,
newStabilityPoolWithdrawalFeeRatio: RationalSchema,
newRedemptionReimbursementRatio: RationalSchema,
newRedemptionProcessingFeeRatio: RationalSchema,
});
const AddCollateralAssetContentSchema = TSchema.Struct({
correspondingIAsset: TSchema.ByteArray,
collateralAsset: AssetClassSchema,
assetExtraDecimals: TSchema.Integer,
assetPriceInfo: IAssetPriceInfoSchema,
interestOracleNft: AssetClassSchema,
redemptionRatio: RationalSchema,
maintenanceRatio: RationalSchema,
liquidationRatio: RationalSchema,
minCollateralAmt: TSchema.Integer,
});
export type AddCollateralAsssetContent =
typeof AddCollateralAssetContentSchema.Type;
const UpdateCollateralAssetContentSchema = TSchema.Struct({
correspondingIAsset: TSchema.ByteArray,
collateralAsset: AssetClassSchema,
newAssetExtraDecimals: TSchema.Integer,
newAssetPriceInfo: IAssetPriceInfoSchema,
newInterestOracleNft: AssetClassSchema,
newRedemptionRatio: RationalSchema,
newMaintenanceRatio: RationalSchema,
newLiquidationRatio: RationalSchema,
newMinCollateralAmt: TSchema.Integer,
});
const ProposeStableswapPoolContentSchema = TSchema.Struct({
iasset: TSchema.ByteArray,
collateralAsset: AssetClassSchema,
collateralToIassetRatio: RationalSchema,
mintingFeeRatio: RationalSchema,
redemptionFeeRatio: RationalSchema,
feeManager: TSchema.NullOr(TSchema.ByteArray),
minMintingAmount: TSchema.Integer,
minRedemptionAmount: TSchema.Integer,
stableswapValHash: TSchema.ByteArray,
});
export type ProposeStableswapPoolContent =
typeof ProposeStableswapPoolContentSchema.Type;
const ModifyStableswapPoolContentSchema = TSchema.Struct({
iasset: TSchema.ByteArray,
collateralAsset: AssetClassSchema,
newCollateralToIassetRatio: RationalSchema,
newMintingFeeRatio: RationalSchema,
newRedemptionFeeRatio: RationalSchema,
newMintingEnabled: TSchema.Boolean,
newRedemptionEnabled: TSchema.Boolean,
newFeeManager: TSchema.NullOr(TSchema.ByteArray),
newMinMintingAmount: TSchema.Integer,
newMinRedemptionAmount: TSchema.Integer,
newStableswapValHash: TSchema.ByteArray,
});
export type ModifyStableswapPoolContent =
typeof ModifyStableswapPoolContentSchema.Type;
export const ProposalContentSchema = TSchema.Union(
TSchema.Struct(
{
ProposeIAsset: ProposeIAssetContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
ModifyIAsset: ModifyIAssetContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
AddCollateralAsset: AddCollateralAssetContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
UpdateCollateralAsset: UpdateCollateralAssetContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
ProposeStableswapPool: ProposeStableswapPoolContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
ModifyStableswapPool: ModifyStableswapPoolContentSchema,
},
{ flatInUnion: true },
),
TSchema.Struct(
{
ModifyProtocolParams: TSchema.Struct(
{
newParams: ProtocolParamsSchema,
},
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Struct(
{
UpgradeProtocol: TSchema.Struct(
{
content: UpgradePathsSchema,
},
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Struct(
{
TextProposal: TSchema.ByteArray,
},
{ flatInUnion: true },
),
);
export type ProposalContent = typeof ProposalContentSchema.Type;
const TreasuryWithdrawalItemSchema = TSchema.Struct({
currencySymbol: TSchema.ByteArray,
tokenName: TSchema.ByteArray,
amount: TSchema.Integer,
});
export type TreasuryWithdrawalItem = typeof TreasuryWithdrawalItemSchema.Type;
export const TreasuryWithdrawalSchema = TSchema.Struct({
destination: AddressSchema,
value: TSchema.Array(TreasuryWithdrawalItemSchema),
});
export type TreasuryWithdrawal = typeof TreasuryWithdrawalSchema.Type;
const GovRedeemerSchema = TSchema.Union(
TSchema.Struct(
{
CreatePoll: TSchema.Struct(
{
currentTime: TSchema.Integer,
proposalOwner: TSchema.ByteArray,
content: ProposalContentSchema,
treasuryWithdrawal: TSchema.NullOr(TreasuryWithdrawalSchema),
},
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Struct(
{
WitnessEndPoll: TSchema.Struct(
{
currentTime: TSchema.Integer,
},
{ flatFields: true },
),
},
{ flatInUnion: true },
),
TSchema.Literal('UpgradeGov', { flatInUnion: true }),
TSchema.Literal('UpgradeVersion', { flatInUnion: true }),
);
export type GovRedeemer = typeof GovRedeemerSchema.Type;
const GovDatumSchema = TSchema.Struct({
currentProposal: TSchema.Integer,
protocolParams: ProtocolParamsSchema,
currentVersion: TSchema.Integer,
iassetsCount: TSchema.Integer,
activeProposals: TSchema.Integer,
});
export type GovDatum = typeof GovDatumSchema.Type;
export function serialiseGovRedeemer(r: GovRedeemer): string {
return Data.withSchema(GovRedeemerSchema).toCBORHex(r);
}
export function serialiseGovDatum(d: GovDatum): string {
return Data.withSchema(GovDatumSchema).toCBORHex(d);
}
export function parseGovDatum(datum: string): O.Option<GovDatum> {
try {
return O.some(
Data.withSchema(GovDatumSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
datum,
),
);
} catch (_) {
return O.none;
}
}
export function parseGovDatumOrThrow(datum: string): GovDatum {
return F.pipe(
parseGovDatum(datum),
O.match(() => {
throw new Error('Expected a Gov datum.');
}, F.identity),
);
}