generated from PolymeshAssociation/typescript-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Distributions.ts
119 lines (105 loc) · 3.2 KB
/
Distributions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import BigNumber from 'bignumber.js';
import {
configureDividendDistribution,
Context,
DividendDistribution,
FungibleAsset,
Namespace,
PolymeshError,
} from '~/internal';
import {
ConfigureDividendDistributionParams,
DistributionWithDetails,
ErrorCode,
ProcedureMethod,
} from '~/types';
import {
balanceToBigNumber,
bigNumberToU32,
boolToBoolean,
corporateActionIdentifierToCaId,
distributionToDividendDistributionParams,
meshCorporateActionToCorporateActionParams,
stringToTicker,
} from '~/utils/conversion';
import { createProcedureMethod } from '~/utils/internal';
/**
* Handles all Asset Distributions related functionality
*/
export class Distributions extends Namespace<FungibleAsset> {
/**
* Create a Dividend Distribution for a subset of the Asset Holders at a certain (existing or future) Checkpoint
*
* @note required role:
* - Origin Portfolio Custodian
*/
public configureDividendDistribution: ProcedureMethod<
ConfigureDividendDistributionParams,
DividendDistribution
>;
/**
* @hidden
*/
constructor(parent: FungibleAsset, context: Context) {
super(parent, context);
const { ticker } = parent;
this.configureDividendDistribution = createProcedureMethod(
{ getProcedureAndArgs: args => [configureDividendDistribution, { ticker, ...args }] },
context
);
}
/**
* Retrieve a single Dividend Distribution associated to this Asset by its ID
*
* @throws if there is no Distribution with the passed ID
*/
public async getOne(args: { id: BigNumber }): Promise<DistributionWithDetails> {
const {
parent: { ticker },
context: {
polymeshApi: { query },
},
context,
} = this;
const { id } = args;
const rawTicker = stringToTicker(ticker, context);
const rawLocalId = bigNumberToU32(id, context);
const rawCaId = corporateActionIdentifierToCaId({ ticker, localId: id }, context);
const [corporateAction, capitalDistribution, details] = await Promise.all([
query.corporateAction.corporateActions(rawTicker, rawLocalId),
query.capitalDistribution.distributions(rawCaId),
query.corporateAction.details(rawCaId),
]);
if (corporateAction.isNone || capitalDistribution.isNone) {
throw new PolymeshError({
code: ErrorCode.DataUnavailable,
message: 'The Dividend Distribution does not exist',
});
}
const dist = capitalDistribution.unwrap();
const distribution = new DividendDistribution(
{
id,
ticker,
...meshCorporateActionToCorporateActionParams(corporateAction.unwrap(), details, context),
...distributionToDividendDistributionParams(dist, context),
},
context
);
const { reclaimed, remaining } = dist;
return {
distribution,
details: {
remainingFunds: balanceToBigNumber(remaining),
fundsReclaimed: boolToBoolean(reclaimed),
},
};
}
/**
* Retrieve all Dividend Distributions associated to this Asset, along with their details
*/
public get(): Promise<DistributionWithDetails[]> {
const { parent, context } = this;
return context.getDividendDistributionsForAssets({ assets: [parent] });
}
}