-
Notifications
You must be signed in to change notification settings - Fork 54
/
withAddresses.ts
60 lines (57 loc) · 2.26 KB
/
withAddresses.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
import { Cardano } from '@cardano-sdk/core';
import { Hash28ByteBase16 } from '@cardano-sdk/crypto';
import { WithUtxo } from './withUtxo';
import { unifiedProjectorOperator } from '../utils';
import uniq from 'lodash/uniq';
export interface Address {
address: Cardano.PaymentAddress;
type: Cardano.AddressType;
/** Applicable only for base/grouped, enterprise and pointer addresses */
paymentCredentialHash?: Hash28ByteBase16;
/** Hash28ByteBase16 for base/grouped addresses. Pointer for pointer addresses. */
stakeCredential?: Hash28ByteBase16 | Cardano.Pointer;
}
export interface WithAddresses {
addresses: Address[];
}
/** Collect all unique addresses from produced utxo */
export const withAddresses = unifiedProjectorOperator<WithUtxo, WithAddresses>((evt) => ({
...evt,
addresses: uniq(evt.utxo.produced.map(([_, txOut]) => txOut.address)).map((address): Address => {
const parsed = Cardano.Address.fromString(address)!;
let paymentCredentialHash: Hash28ByteBase16 | undefined;
let stakeCredentialHash: Hash28ByteBase16 | undefined;
let pointer: Cardano.Pointer | undefined;
const type = parsed.getType();
switch (type) {
case Cardano.AddressType.BasePaymentKeyStakeKey:
case Cardano.AddressType.BasePaymentKeyStakeScript:
case Cardano.AddressType.BasePaymentScriptStakeKey:
case Cardano.AddressType.BasePaymentScriptStakeScript: {
const baseAddress = parsed.asBase()!;
paymentCredentialHash = baseAddress.getPaymentCredential().hash;
stakeCredentialHash = baseAddress.getStakeCredential().hash;
break;
}
case Cardano.AddressType.EnterpriseKey:
case Cardano.AddressType.EnterpriseScript: {
const enterpriseAddress = parsed.asEnterprise()!;
paymentCredentialHash = enterpriseAddress.getPaymentCredential().hash;
break;
}
case Cardano.AddressType.PointerKey:
case Cardano.AddressType.PointerScript: {
const pointerAddress = parsed.asPointer()!;
paymentCredentialHash = pointerAddress.getPaymentCredential().hash;
pointer = pointerAddress.getStakePointer();
break;
}
}
return {
address,
paymentCredentialHash,
stakeCredential: stakeCredentialHash || pointer,
type
};
})
}));