generated from PolymeshAssociation/typescript-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 11
/
index.ts
136 lines (121 loc) · 3.31 KB
/
index.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import BigNumber from 'bignumber.js';
import { remove } from 'lodash';
import {
Context,
FungibleAsset,
launchOffering,
Namespace,
Offering,
PolymeshError,
} from '~/internal';
import {
ErrorCode,
LaunchOfferingParams,
OfferingStatus,
OfferingWithDetails,
ProcedureMethod,
} from '~/types';
import { fundraiserToOfferingDetails, stringToTicker, u64ToBigNumber } from '~/utils/conversion';
import { createProcedureMethod } from '~/utils/internal';
/**
* Handles all Asset Offering related functionality
*/
export class Offerings extends Namespace<FungibleAsset> {
/**
* @hidden
*/
constructor(parent: FungibleAsset, context: Context) {
super(parent, context);
const { ticker } = parent;
this.launch = createProcedureMethod(
{ getProcedureAndArgs: args => [launchOffering, { ticker, ...args }] },
context
);
}
/**
* Launch an Asset Offering
*
* @note required roles:
* - Offering Portfolio Custodian
* - Raising Portfolio Custodian
*/
public launch: ProcedureMethod<LaunchOfferingParams, Offering>;
/**
* Retrieve a single Offering associated to this Asset by its ID
*
* @throws if there is no Offering with the passed ID
*/
public async getOne(args: { id: BigNumber }): Promise<Offering> {
const {
parent: { ticker },
context,
} = this;
const { id } = args;
const offering = new Offering({ ticker, id }, context);
const exists = await offering.exists();
if (!exists) {
throw new PolymeshError({
code: ErrorCode.DataUnavailable,
message: 'The Offering does not exist',
});
}
return offering;
}
/**
* Retrieve all of the Asset's Offerings and their details. Can be filtered using parameters
*
* @param opts.status - status of the Offerings to fetch. If defined, only Offerings that have all passed statuses will be returned
*/
public async get(
opts: { status?: Partial<OfferingStatus> } = {}
): Promise<OfferingWithDetails[]> {
const {
parent: { ticker },
context: {
polymeshApi: {
query: { sto },
},
},
context,
} = this;
const { status: { timing: timingFilter, balance: balanceFilter, sale: saleFilter } = {} } =
opts;
const rawTicker = stringToTicker(ticker, context);
const [fundraiserEntries, nameEntries] = await Promise.all([
sto.fundraisers.entries(rawTicker),
sto.fundraiserNames.entries(rawTicker),
]);
const offerings = fundraiserEntries.map(
([
{
args: [, rawFundraiserId],
},
fundraiser,
]) => {
const id = u64ToBigNumber(rawFundraiserId);
const [[, name]] = remove(
nameEntries,
([
{
args: [, rawId],
},
]) => u64ToBigNumber(rawId).eq(id)
);
return {
offering: new Offering({ id, ticker }, context),
details: fundraiserToOfferingDetails(fundraiser.unwrap(), name.unwrap(), context),
};
}
);
return offerings.filter(
({
details: {
status: { timing, sale, balance },
},
}) =>
(!timingFilter || timingFilter === timing) &&
(!saleFilter || saleFilter === sale) &&
(!balanceFilter || balanceFilter === balance)
);
}
}