@bitgo-beta/sdk-coin-canton 1.0.1-beta.60 → 1.0.1-beta.601

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/src/canton.d.ts +22 -1
  2. package/dist/src/canton.d.ts.map +1 -1
  3. package/dist/src/canton.js +231 -8
  4. package/dist/src/cantonToken.d.ts +19 -0
  5. package/dist/src/cantonToken.d.ts.map +1 -0
  6. package/dist/src/cantonToken.js +52 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/allocationAllocateBuilder.d.ts +126 -0
  11. package/dist/src/lib/allocationAllocateBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/allocationAllocateBuilder.js +250 -0
  13. package/dist/src/lib/allocationRequestBuilder.d.ts +116 -0
  14. package/dist/src/lib/allocationRequestBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/allocationRequestBuilder.js +246 -0
  16. package/dist/src/lib/cantonCommandBuilder.d.ts +72 -0
  17. package/dist/src/lib/cantonCommandBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/cantonCommandBuilder.js +173 -0
  19. package/dist/src/lib/clearSigning.d.ts +58 -0
  20. package/dist/src/lib/clearSigning.d.ts.map +1 -0
  21. package/dist/src/lib/clearSigning.js +66 -0
  22. package/dist/src/lib/constant.d.ts +2 -0
  23. package/dist/src/lib/constant.d.ts.map +1 -1
  24. package/dist/src/lib/constant.js +4 -2
  25. package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts +56 -0
  26. package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/cosignDelegationAcceptBuilder.js +112 -0
  28. package/dist/src/lib/cosignDelegationProposalBuilder.d.ts +60 -0
  29. package/dist/src/lib/cosignDelegationProposalBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/cosignDelegationProposalBuilder.js +111 -0
  31. package/dist/src/lib/iface.d.ts +140 -2
  32. package/dist/src/lib/iface.d.ts.map +1 -1
  33. package/dist/src/lib/iface.js +3 -1
  34. package/dist/src/lib/index.d.ts +11 -0
  35. package/dist/src/lib/index.d.ts.map +1 -1
  36. package/dist/src/lib/index.js +25 -2
  37. package/dist/src/lib/messages/cantonBaseMessage.d.ts +16 -0
  38. package/dist/src/lib/messages/cantonBaseMessage.d.ts.map +1 -0
  39. package/dist/src/lib/messages/cantonBaseMessage.js +28 -0
  40. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts +14 -0
  41. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts.map +1 -0
  42. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.js +23 -0
  43. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts +17 -0
  44. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.js +25 -0
  46. package/dist/src/lib/messages/cantonSignTopology/index.d.ts +3 -0
  47. package/dist/src/lib/messages/cantonSignTopology/index.d.ts.map +1 -0
  48. package/dist/src/lib/messages/cantonSignTopology/index.js +19 -0
  49. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts +13 -0
  50. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts.map +1 -0
  51. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.js +22 -0
  52. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts +14 -0
  53. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.js +22 -0
  55. package/dist/src/lib/messages/cantonSignTransaction/index.d.ts +3 -0
  56. package/dist/src/lib/messages/cantonSignTransaction/index.d.ts.map +1 -0
  57. package/dist/src/lib/messages/cantonSignTransaction/index.js +19 -0
  58. package/dist/src/lib/messages/index.d.ts +5 -0
  59. package/dist/src/lib/messages/index.d.ts.map +1 -0
  60. package/dist/src/lib/messages/index.js +21 -0
  61. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  62. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  63. package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
  64. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts +11 -1
  65. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts.map +1 -1
  66. package/dist/src/lib/oneStepPreApprovalBuilder.js +29 -1
  67. package/dist/src/lib/resourcesInterface.d.ts +1 -1
  68. package/dist/src/lib/resourcesInterface.d.ts.map +1 -1
  69. package/dist/src/lib/resourcesInterface.js +1 -1
  70. package/dist/src/lib/transaction/transaction.d.ts +21 -2
  71. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  72. package/dist/src/lib/transaction/transaction.js +330 -9
  73. package/dist/src/lib/transactionBuilder.d.ts +3 -3
  74. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  75. package/dist/src/lib/transactionBuilder.js +1 -5
  76. package/dist/src/lib/transactionBuilderFactory.d.ts +18 -1
  77. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  78. package/dist/src/lib/transactionBuilderFactory.js +64 -2
  79. package/dist/src/lib/transferAcceptanceBuilder.d.ts +7 -5
  80. package/dist/src/lib/transferAcceptanceBuilder.d.ts.map +1 -1
  81. package/dist/src/lib/transferAcceptanceBuilder.js +20 -6
  82. package/dist/src/lib/transferAcknowledgeBuilder.d.ts +72 -0
  83. package/dist/src/lib/transferAcknowledgeBuilder.d.ts.map +1 -0
  84. package/dist/src/lib/transferAcknowledgeBuilder.js +133 -0
  85. package/dist/src/lib/transferBuilder.d.ts +87 -3
  86. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  87. package/dist/src/lib/transferBuilder.js +169 -1
  88. package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts +67 -0
  89. package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts.map +1 -0
  90. package/dist/src/lib/transferOfferWithdrawnBuilder.js +130 -0
  91. package/dist/src/lib/transferRejectionBuilder.d.ts +59 -0
  92. package/dist/src/lib/transferRejectionBuilder.d.ts.map +1 -0
  93. package/dist/src/lib/transferRejectionBuilder.js +116 -0
  94. package/dist/src/lib/utils.d.ts +51 -3
  95. package/dist/src/lib/utils.d.ts.map +1 -1
  96. package/dist/src/lib/utils.js +684 -44
  97. package/dist/src/lib/walletInitBuilder.d.ts +2 -1
  98. package/dist/src/lib/walletInitBuilder.d.ts.map +1 -1
  99. package/dist/src/lib/walletInitBuilder.js +4 -1
  100. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts +2 -1
  101. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts.map +1 -1
  102. package/dist/src/lib/walletInitialization/walletInitTransaction.js +14 -1
  103. package/dist/src/register.d.ts.map +1 -1
  104. package/dist/src/register.js +5 -1
  105. package/dist/test/helper.d.ts +3 -0
  106. package/dist/test/helper.d.ts.map +1 -0
  107. package/dist/test/helper.js +9 -0
  108. package/dist/test/integration/canton.integration.d.ts +2 -0
  109. package/dist/test/integration/canton.integration.d.ts.map +1 -0
  110. package/dist/test/integration/canton.integration.js +157 -0
  111. package/dist/test/integration/canton.token.integration.d.ts +2 -0
  112. package/dist/test/integration/canton.token.integration.d.ts.map +1 -0
  113. package/dist/test/integration/canton.token.integration.js +51 -0
  114. package/dist/test/resources.d.ts +216 -2
  115. package/dist/test/resources.d.ts.map +1 -1
  116. package/dist/test/resources.js +221 -7
  117. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts +2 -0
  118. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.js +341 -0
  120. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts +2 -0
  121. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.js +386 -0
  123. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts +2 -0
  124. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.js +340 -0
  126. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts +2 -0
  127. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts.map +1 -0
  128. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.js +104 -0
  129. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts +2 -0
  130. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.js +74 -0
  132. package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.js +25 -7
  133. package/dist/test/unit/builder/transfer/transferBuilder.d.ts +2 -0
  134. package/dist/test/unit/builder/transfer/transferBuilder.d.ts.map +1 -0
  135. package/dist/test/unit/builder/transfer/transferBuilder.js +84 -0
  136. package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.js +65 -15
  137. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.d.ts +2 -0
  138. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.d.ts.map +1 -0
  139. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.js +32 -0
  140. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts +2 -0
  141. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts.map +1 -0
  142. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.js +64 -0
  143. package/dist/test/unit/builder/transferReject/transferRejectBuilder.d.ts +2 -0
  144. package/dist/test/unit/builder/transferReject/transferRejectBuilder.d.ts.map +1 -0
  145. package/dist/test/unit/builder/transferReject/transferRejectBuilder.js +96 -0
  146. package/dist/test/unit/canton.d.ts +2 -0
  147. package/dist/test/unit/canton.d.ts.map +1 -0
  148. package/dist/test/unit/canton.js +705 -0
  149. package/dist/test/unit/index.d.ts +5 -0
  150. package/dist/test/unit/index.d.ts.map +1 -1
  151. package/dist/test/unit/index.js +6 -1
  152. package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts +2 -0
  153. package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts.map +1 -0
  154. package/dist/test/unit/messages/cantonSignTopologyMessage.js +46 -0
  155. package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts +2 -0
  156. package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts.map +1 -0
  157. package/dist/test/unit/messages/cantonSignTransactionMessage.js +48 -0
  158. package/dist/test/unit/messages/clearSigning.d.ts +2 -0
  159. package/dist/test/unit/messages/clearSigning.d.ts.map +1 -0
  160. package/dist/test/unit/messages/clearSigning.js +72 -0
  161. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  162. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  163. package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
  164. package/dist/test/unit/utils.js +376 -5
  165. package/dist/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +8 -8
@@ -1,9 +1,19 @@
1
- import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions, SignedTransaction, SignTransactionOptions, TssVerifyAddressOptions, VerifyTransactionOptions } from '@bitgo-beta/sdk-core';
1
+ import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, CantonCommandParams, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions, PopulatedIntent, PrebuildTransactionWithIntentOptions, SignedTransaction, SignTransactionOptions, TokenEnablementConfig, TransactionExplanation as BaseTransactionExplanation, TransactionParams, TransactionType, TssVerifyAddressOptions, VerifyTransactionOptions } from '@bitgo-beta/sdk-core';
2
2
  import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
3
+ export interface TransactionExplanation extends BaseTransactionExplanation {
4
+ type: TransactionType;
5
+ }
6
+ export interface ExplainTransactionOptions {
7
+ txHex: string;
8
+ }
9
+ export interface CantonTransactionParams extends TransactionParams {
10
+ cantonCommandParams?: CantonCommandParams;
11
+ }
3
12
  export declare class Canton extends BaseCoin {
4
13
  protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
5
14
  protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
6
15
  static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>): BaseCoin;
16
+ private getBuilder;
7
17
  /** @inheritDoc */
8
18
  getBaseFactor(): number;
9
19
  /** @inheritDoc */
@@ -14,6 +24,8 @@ export declare class Canton extends BaseCoin {
14
24
  getFullName(): string;
15
25
  /** @inheritDoc */
16
26
  supportsTss(): boolean;
27
+ /** @inheritDoc */
28
+ supportsMessageSigning(): boolean;
17
29
  /** inherited doc */
18
30
  getDefaultMultisigType(): MultisigType;
19
31
  /** inherited doc */
@@ -21,6 +33,8 @@ export declare class Canton extends BaseCoin {
21
33
  getMPCAlgorithm(): MPCAlgorithm;
22
34
  /** @inheritDoc */
23
35
  verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
36
+ private verifyCantonCommandTransaction;
37
+ private relativeSkipPaths;
24
38
  /** @inheritDoc */
25
39
  isWalletAddress(params: TssVerifyAddressOptions): Promise<boolean>;
26
40
  /** @inheritDoc */
@@ -28,12 +42,19 @@ export declare class Canton extends BaseCoin {
28
42
  /** @inheritDoc */
29
43
  generateKeyPair(seed?: Buffer): KeyPair;
30
44
  /** @inheritDoc */
45
+ explainTransaction(params: ExplainTransactionOptions): Promise<TransactionExplanation>;
46
+ /** @inheritDoc */
31
47
  isValidPub(pub: string): boolean;
32
48
  /** @inheritDoc */
33
49
  isValidAddress(address: string): boolean;
34
50
  /** @inheritDoc */
51
+ getTokenEnablementConfig(): TokenEnablementConfig;
52
+ getAddressFromPublicKey(publicKeyHex: string): string;
53
+ /** @inheritDoc */
35
54
  signTransaction(params: SignTransactionOptions): Promise<SignedTransaction>;
36
55
  /** @inheritDoc */
37
56
  auditDecryptedKey({ multiSigType, prv, publicKey }: AuditDecryptedKeyParams): void;
57
+ /** @inheritDoc */
58
+ setCoinSpecificFieldsInIntent(intent: PopulatedIntent, params: PrebuildTransactionWithIntentOptions): void;
38
59
  }
39
60
  //# sourceMappingURL=canton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canton.d.ts","sourceRoot":"","sources":["../../src/canton.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,YAAY,EACZ,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EAEtB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAKzE,qBAAa,MAAO,SAAQ,QAAQ;IAClC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,kBAAkB;IACX,aAAa,IAAI,MAAM;IAI9B,kBAAkB;IACX,QAAQ,IAAI,MAAM;IAIzB,kBAAkB;IACX,SAAS,IAAI,MAAM;IAI1B,kBAAkB;IACX,WAAW,IAAI,MAAM;IAI5B,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,oBAAoB;IACpB,uCAAuC,IAAI,OAAO;IAIlD,eAAe,IAAI,YAAY;IAI/B,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB3E,kBAAkB;IAClB,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,kBAAkB;IAClB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,kBAAkB;IAClB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAYvC,kBAAkB;IAClB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMxC,kBAAkB;IAClB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,IAAI;CAMnF"}
1
+ {"version":3,"file":"canton.d.ts","sourceRoot":"","sources":["../../src/canton.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EAER,SAAS,EAET,mBAAmB,EAMnB,OAAO,EACP,YAAY,EACZ,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,oCAAoC,EACpC,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,IAAI,0BAA0B,EACpD,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAOzE,MAAM,WAAW,sBAAuB,SAAQ,0BAA0B;IACxE,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,qBAAa,MAAO,SAAQ,QAAQ;IAClC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,OAAO,CAAC,UAAU;IAIlB,kBAAkB;IACX,aAAa,IAAI,MAAM;IAI9B,kBAAkB;IACX,QAAQ,IAAI,MAAM;IAIzB,kBAAkB;IACX,SAAS,IAAI,MAAM;IAI1B,kBAAkB;IACX,WAAW,IAAI,MAAM;IAI5B,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,sBAAsB,IAAI,OAAO;IAIjC,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,oBAAoB;IACpB,uCAAuC,IAAI,OAAO;IAIlD,eAAe,IAAI,YAAY;IAI/B,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6F3E,OAAO,CAAC,8BAA8B;IAoItC,OAAO,CAAC,iBAAiB;IAWzB,kBAAkB;IACZ,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBxE,kBAAkB;IAClB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,kBAAkB;IAClB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAYvC,kBAAkB;IAClB,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAatF,kBAAkB;IAClB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMxC,kBAAkB;IAClB,wBAAwB,IAAI,qBAAqB;IAOjD,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAKrD,kBAAkB;IAClB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,IAAI;IAOlF,kBAAkB;IAClB,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;CAc3G"}
@@ -21,6 +21,9 @@ class Canton extends sdk_core_1.BaseCoin {
21
21
  static createInstance(bitgo, staticsCoin) {
22
22
  return new Canton(bitgo, staticsCoin);
23
23
  }
24
+ getBuilder() {
25
+ return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
26
+ }
24
27
  /** @inheritDoc */
25
28
  getBaseFactor() {
26
29
  return 1e10;
@@ -41,6 +44,10 @@ class Canton extends sdk_core_1.BaseCoin {
41
44
  supportsTss() {
42
45
  return true;
43
46
  }
47
+ /** @inheritDoc */
48
+ supportsMessageSigning() {
49
+ return true;
50
+ }
44
51
  /** inherited doc */
45
52
  getDefaultMultisigType() {
46
53
  return sdk_core_1.multisigTypes.tss;
@@ -55,27 +62,203 @@ class Canton extends sdk_core_1.BaseCoin {
55
62
  /** @inheritDoc */
56
63
  async verifyTransaction(params) {
57
64
  const coinConfig = statics_1.coins.get(this.getChain());
58
- // extract `txParams` when verifying other transaction types
59
- const { txPrebuild: txPrebuild } = params;
65
+ const { txPrebuild: txPrebuild, txParams } = params;
60
66
  const rawTx = txPrebuild.txHex;
61
67
  if (!rawTx) {
62
68
  throw new Error('missing required tx prebuild property txHex');
63
69
  }
64
70
  const txBuilder = new lib_1.TransactionBuilderFactory(coinConfig).from(rawTx);
65
71
  const transaction = txBuilder.transaction;
72
+ const explainedTx = transaction.explainTransaction();
66
73
  switch (transaction.type) {
67
- case sdk_core_1.TransactionType.WalletInitialization: {
68
- // there is no input for this type of transaction, so always return true
74
+ case sdk_core_1.TransactionType.WalletInitialization:
75
+ case sdk_core_1.TransactionType.TransferAccept:
76
+ case sdk_core_1.TransactionType.TransferReject:
77
+ case sdk_core_1.TransactionType.TransferAcknowledge:
78
+ case sdk_core_1.TransactionType.TransferOfferWithdrawn:
79
+ case sdk_core_1.TransactionType.CosignDelegationAccept:
80
+ case sdk_core_1.TransactionType.CosignDelegationProposal:
81
+ case sdk_core_1.TransactionType.AllocationAllocate:
82
+ case sdk_core_1.TransactionType.AllocationRequest:
83
+ // There is no recipient info to verify for these transaction types, so always return true.
84
+ return true;
85
+ case sdk_core_1.TransactionType.CantonCommand:
86
+ return this.verifyCantonCommandTransaction(transaction, txParams.cantonCommandParams);
87
+ case sdk_core_1.TransactionType.OneStepPreApproval:
88
+ // Canton is always a TSS wallet. The SDK's buildTokenEnablements passes enableTokens
89
+ // through unchanged for TSS wallets (no conversion to recipients), so txParams.enableTokens
90
+ // is the only source of user intent here.
91
+ //
92
+ // Receiver validation: the receiver of a OneStepPreApproval is always the wallet's root address.
93
+ // We use enableToken.address if explicitly provided, otherwise fall back to
94
+ // wallet.coinSpecific().rootAddress (the Canton party ID stored at wallet creation time).
95
+ // Token name validation: checked when the token is resolvable from statics.
96
+ if (txParams.type === 'enabletoken' &&
97
+ txParams.enableTokens !== undefined &&
98
+ txParams.enableTokens.length > 0) {
99
+ const txData = transaction.toJson();
100
+ const enableToken = txParams.enableTokens[0];
101
+ const walletRootAddress = params.wallet?.coinSpecific?.()?.rootAddress;
102
+ const expectedReceiver = enableToken.address ?? walletRootAddress;
103
+ if (expectedReceiver) {
104
+ // Strip ?memoId suffix if present in the stored address
105
+ const [expectedReceiverBase] = expectedReceiver.split('?memoId=');
106
+ if (txData.receiver !== expectedReceiverBase) {
107
+ throw new Error(`OneStepPreApproval receiver mismatch: expected '${expectedReceiverBase}', got '${txData.receiver}'`);
108
+ }
109
+ }
110
+ if (txData.token !== undefined && txData.token !== enableToken.name) {
111
+ throw new Error(`OneStepPreApproval token name mismatch: expected '${enableToken.name}', got '${txData.token}'`);
112
+ }
113
+ }
114
+ return true;
115
+ case sdk_core_1.TransactionType.Send:
116
+ if (txParams.recipients !== undefined) {
117
+ const filteredRecipients = txParams.recipients?.map((recipient) => {
118
+ const { address, amount, tokenName } = recipient;
119
+ const [addressPart, memoId] = address.split('?memoId=');
120
+ return {
121
+ address: addressPart,
122
+ amount,
123
+ ...(memoId && { memo: memoId }),
124
+ ...(tokenName && { tokenName }),
125
+ };
126
+ });
127
+ const filteredOutputs = explainedTx.outputs?.map((output) => {
128
+ const { address, amount, tokenName, memo } = output;
129
+ return {
130
+ address,
131
+ amount,
132
+ ...(memo && { memo }),
133
+ ...(tokenName && { tokenName }),
134
+ };
135
+ });
136
+ if (JSON.stringify(filteredRecipients) !== JSON.stringify(filteredOutputs)) {
137
+ throw new Error('Tx outputs do not match with expected txParams recipients');
138
+ }
139
+ }
69
140
  return true;
70
- }
71
141
  default: {
72
142
  throw new Error(`unknown transaction type, ${transaction.type}`);
73
143
  }
74
144
  }
75
145
  }
146
+ verifyCantonCommandTransaction(transaction, userParams) {
147
+ if (!userParams) {
148
+ return true;
149
+ }
150
+ const cantonTx = transaction;
151
+ const rawPrepared = cantonTx.prepareCommand?.preparedTransaction;
152
+ if (!rawPrepared) {
153
+ throw new Error('CantonCommand verifyTransaction: missing preparedTransaction protobuf on tx prebuild');
154
+ }
155
+ const decodedCommand = utils_1.default.extractCantonCommandInfo(rawPrepared);
156
+ const userCommand = userParams.command;
157
+ // Input shape is enforced by mpcUtils at build time; here we resolve which branch is present.
158
+ const hasCreate = 'CreateCommand' in userCommand && utils_1.default.isPlainObject(userCommand.CreateCommand);
159
+ const hasExercise = 'ExerciseCommand' in userCommand && utils_1.default.isPlainObject(userCommand.ExerciseCommand);
160
+ if (!hasCreate && !hasExercise) {
161
+ throw new Error(`CantonCommand verifyTransaction: command must contain a CreateCommand or ExerciseCommand wrapper`);
162
+ }
163
+ if (hasCreate && hasExercise) {
164
+ throw new Error(`CantonCommand verifyTransaction: command must contain exactly one of CreateCommand or ExerciseCommand, not both`);
165
+ }
166
+ const userKind = hasCreate ? 'CreateCommand' : 'ExerciseCommand';
167
+ if (decodedCommand.kind !== userKind) {
168
+ throw new Error(`CantonCommand verifyTransaction: command kind mismatch — expected ${userKind}, got ${decodedCommand.kind}`);
169
+ }
170
+ const userInner = userKind === 'CreateCommand'
171
+ ? userCommand.CreateCommand
172
+ : userCommand.ExerciseCommand;
173
+ if (!userInner?.templateId) {
174
+ throw new Error(`CantonCommand verifyTransaction: ${userKind}.templateId must be a non-empty string`);
175
+ }
176
+ // templateId (moduleName + entityName; package id is mutable, so ignored)
177
+ const parsed = utils_1.default.parseCantonTemplateId(userInner.templateId);
178
+ if (!parsed) {
179
+ throw new Error(`CantonCommand verifyTransaction: invalid user templateId '${userInner.templateId}' — expected format 'Pkg:Module:Entity'`);
180
+ }
181
+ if (decodedCommand.templateId.moduleName !== parsed.moduleName ||
182
+ decodedCommand.templateId.entityName !== parsed.entityName) {
183
+ throw new Error(`CantonCommand verifyTransaction: templateId mismatch — expected '${parsed.moduleName}:${parsed.entityName}', got '${decodedCommand.templateId.moduleName}:${decodedCommand.templateId.entityName}'`);
184
+ }
185
+ // Build the inject-as skip set once for use across the contractId and argument checks
186
+ const skipPaths = utils_1.default.normalizeInjectAs(userParams.resolveContracts);
187
+ // metadata.submitterInfo.actAs must contain exactly the same parties as the user's actAs
188
+ if (!Array.isArray(userParams.actAs) || userParams.actAs.length === 0) {
189
+ throw new Error(`CantonCommand verifyTransaction: actAs must be a non-empty array of party IDs`);
190
+ }
191
+ if (!userParams.actAs.every((p) => typeof p === 'string' && p.trim() !== '')) {
192
+ throw new Error(`CantonCommand verifyTransaction: all actAs entries must be non-empty strings`);
193
+ }
194
+ const submitterActAs = cantonTx.cantonCommandActAsParties ?? [];
195
+ if (!utils_1.default.sameElements(submitterActAs, userParams.actAs)) {
196
+ throw new Error(`CantonCommand verifyTransaction: submitterInfo.actAs [${submitterActAs.join(', ')}] does not match user actAs [${userParams.actAs.join(', ')}]`);
197
+ }
198
+ if (userKind === 'ExerciseCommand') {
199
+ const exerciseInner = userInner;
200
+ // choice id
201
+ if (decodedCommand.choice !== exerciseInner.choice) {
202
+ throw new Error(`CantonCommand verifyTransaction: choice mismatch — expected '${exerciseInner.choice}', got '${decodedCommand.choice ?? ''}'`);
203
+ }
204
+ // every on-chain actingParty must be in the user's actAs (prevents privilege escalation)
205
+ const onChainActors = decodedCommand.actingParties ?? [];
206
+ for (const actor of onChainActors) {
207
+ if (!userParams.actAs.includes(actor)) {
208
+ throw new Error(`CantonCommand verifyTransaction: unauthorized acting party '${actor}' on root exercise (not in user actAs)`);
209
+ }
210
+ }
211
+ // contractId — skip when absent/empty or when IMS will inject it via resolveContracts
212
+ if (exerciseInner.contractId !== undefined &&
213
+ exerciseInner.contractId !== '' &&
214
+ !skipPaths.has('ExerciseCommand.contractId')) {
215
+ if (decodedCommand.contractId !== exerciseInner.contractId) {
216
+ throw new Error(`CantonCommand verifyTransaction: contractId mismatch — expected '${exerciseInner.contractId}', got '${decodedCommand.contractId ?? ''}'`);
217
+ }
218
+ }
219
+ // deep argument compare
220
+ const argumentSkipPaths = this.relativeSkipPaths(skipPaths, 'ExerciseCommand.choiceArgument.');
221
+ utils_1.default.assertDeepCantonMatch(exerciseInner.choiceArgument, decodedCommand.argument, argumentSkipPaths);
222
+ }
223
+ else {
224
+ const createInner = userInner;
225
+ // deep argument compare
226
+ const argumentSkipPaths = this.relativeSkipPaths(skipPaths, 'CreateCommand.createArguments.');
227
+ utils_1.default.assertDeepCantonMatch(createInner.createArguments, decodedCommand.argument, argumentSkipPaths);
228
+ }
229
+ return true;
230
+ }
231
+ relativeSkipPaths(skipPaths, prefix) {
232
+ const out = new Set();
233
+ for (const p of skipPaths) {
234
+ if (p.startsWith(prefix)) {
235
+ const stripped = p.slice(prefix.length);
236
+ if (stripped)
237
+ out.add(stripped);
238
+ }
239
+ }
240
+ return out;
241
+ }
76
242
  /** @inheritDoc */
77
- isWalletAddress(params) {
78
- throw new Error('Method not implemented.');
243
+ async isWalletAddress(params) {
244
+ // TODO: refactor this and use the `verifyEddsaMemoBasedWalletAddress` once published from sdk-core
245
+ // https://bitgoinc.atlassian.net/browse/COIN-6347
246
+ const { keychains, address: newAddress, index } = params;
247
+ const [addressPart, memoId] = newAddress.split('?memoId=');
248
+ if (!this.isValidAddress(addressPart)) {
249
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${newAddress}`);
250
+ }
251
+ if (memoId && memoId !== `${index}`) {
252
+ throw new sdk_core_1.InvalidAddressError(`invalid memoId index: ${memoId}`);
253
+ }
254
+ const commonKeychain = (0, sdk_core_1.extractCommonKeychain)(keychains);
255
+ const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
256
+ const derivationPath = 'm/0';
257
+ const derivedPublicKey = MPC.deriveUnhardened(commonKeychain, derivationPath).slice(0, 64);
258
+ const publicKeyBase64 = Buffer.from(derivedPublicKey, 'hex').toString('base64');
259
+ const rootAddressFingerprint = utils_1.default.getAddressFromPublicKey(publicKeyBase64);
260
+ const rootAddress = `${rootAddressFingerprint.slice(0, 5)}::${rootAddressFingerprint}`;
261
+ return addressPart === rootAddress;
79
262
  }
80
263
  /** @inheritDoc */
81
264
  parseTransaction(params) {
@@ -94,6 +277,20 @@ class Canton extends sdk_core_1.BaseCoin {
94
277
  };
95
278
  }
96
279
  /** @inheritDoc */
280
+ explainTransaction(params) {
281
+ const factory = this.getBuilder();
282
+ let rebuiltTransaction;
283
+ const txRaw = params.txHex;
284
+ try {
285
+ const txBuilder = factory.from(txRaw);
286
+ rebuiltTransaction = txBuilder.transaction;
287
+ }
288
+ catch (e) {
289
+ throw new Error('Invalid transaction');
290
+ }
291
+ return rebuiltTransaction.explainTransaction();
292
+ }
293
+ /** @inheritDoc */
97
294
  isValidPub(pub) {
98
295
  return utils_1.default.isValidPublicKey(pub);
99
296
  }
@@ -104,6 +301,17 @@ class Canton extends sdk_core_1.BaseCoin {
104
301
  return utils_1.default.isValidAddress(address);
105
302
  }
106
303
  /** @inheritDoc */
304
+ getTokenEnablementConfig() {
305
+ return {
306
+ requiresTokenEnablement: true,
307
+ supportsMultipleTokenEnablements: false,
308
+ };
309
+ }
310
+ getAddressFromPublicKey(publicKeyHex) {
311
+ const publicKeyBase64 = Buffer.from(publicKeyHex, 'hex').toString('base64');
312
+ return utils_1.default.getAddressFromPublicKey(publicKeyBase64);
313
+ }
314
+ /** @inheritDoc */
107
315
  signTransaction(params) {
108
316
  throw new Error('Method not implemented.');
109
317
  }
@@ -114,6 +322,21 @@ class Canton extends sdk_core_1.BaseCoin {
114
322
  }
115
323
  (0, sdk_lib_mpc_1.auditEddsaPrivateKey)(prv, publicKey ?? '');
116
324
  }
325
+ /** @inheritDoc */
326
+ setCoinSpecificFieldsInIntent(intent, params) {
327
+ if (params.txRequestId) {
328
+ intent.txRequestId = params.txRequestId;
329
+ }
330
+ if (params.transferOfferId) {
331
+ intent.transferOfferId = params.transferOfferId;
332
+ }
333
+ if (params.unspents) {
334
+ intent.unspents = params.unspents;
335
+ }
336
+ if (params.cantonCommandParams) {
337
+ intent.cantonCommandParams = params.cantonCommandParams;
338
+ }
339
+ }
117
340
  }
118
341
  exports.Canton = Canton;
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbnRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFlOEI7QUFDOUIseURBQStEO0FBQy9ELGlEQUF5RTtBQUN6RSwrQkFBa0Q7QUFDbEQsMkNBQXlEO0FBQ3pELHdEQUFnQztBQUVoQyxNQUFhLE1BQU8sU0FBUSxtQkFBUTtJQUdsQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGtCQUFrQjtJQUNYLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1gsUUFBUTtRQUNiLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxTQUFTO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNYLFdBQVc7UUFDaEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLHdCQUFhLENBQUMsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsdUNBQXVDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLDREQUE0RDtRQUM1RCxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixLQUFLLDBCQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyx3RUFBd0U7Z0JBQ3hFLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGVBQWUsQ0FBQyxNQUErQjtRQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxNQUErQjtRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixlQUFlLENBQUMsSUFBYTtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQWEsRUFBRSxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QiwyREFBMkQ7UUFDM0QsdUVBQXVFO1FBQ3ZFLE9BQU8sZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGVBQWUsQ0FBQyxNQUE4QjtRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUEyQjtRQUN6RSxJQUFJLFlBQVksS0FBSyx3QkFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBQSxrQ0FBb0IsRUFBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQTdIRCx3QkE2SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgS2V5UGFpcixcbiAgTVBDQWxnb3JpdGhtLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBDYW50b25LZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ2FudG9uIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBDYW50b24oYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiAxZTEwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdjYW50b24nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnQ2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy50c3M7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICByZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VkZHNhJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKTtcbiAgICAvLyBleHRyYWN0IGB0eFBhcmFtc2Agd2hlbiB2ZXJpZnlpbmcgb3RoZXIgdHJhbnNhY3Rpb24gdHlwZXNcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFyYXdUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpLmZyb20ocmF3VHgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uO1xuICAgIHN3aXRjaCAodHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246IHtcbiAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW5wdXQgZm9yIHRoaXMgdHlwZSBvZiB0cmFuc2FjdGlvbiwgc28gYWx3YXlzIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHJhbnNhY3Rpb24gdHlwZSwgJHt0cmFuc2FjdGlvbi50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgQ2FudG9uS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgQ2FudG9uS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBjYW50b24gYWRkcmVzc2VzIGFyZSBvZiB0aGUgZm9ybSwgcGFydHlIaW50OjpmaW5nZXJwcmludFxuICAgIC8vIHdoZXJlIHBhcnR5SGludCBpcyBvZiBsZW5ndGggNSBhbmQgZmluZ2VycHJpbnQgaXMgNjggY2hhcmFjdGVycyBsb25nXG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cbn1cbiJdfQ==
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbnRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREE0QjhCO0FBQzlCLHlEQUErRDtBQUMvRCxpREFBeUU7QUFDekUsK0JBQWtEO0FBQ2xELDJDQUF5RDtBQUd6RCx3REFBZ0M7QUFjaEMsTUFBYSxNQUFPLFNBQVEsbUJBQVE7SUFHbEMsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGtCQUFrQjtJQUNYLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1gsUUFBUTtRQUNiLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxTQUFTO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNYLFdBQVc7UUFDaEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHNC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QzNCLE1BQU0sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXpaRCx3QkF5WkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgQmFzZUNvaW4sXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgQml0R29CYXNlLFxuICBDYW50b25Db21tYW5kLFxuICBDYW50b25Db21tYW5kUGFyYW1zLFxuICBDYW50b25DcmVhdGVDb21tYW5kLFxuICBDYW50b25FeGVyY2lzZUNvbW1hbmQsXG4gIEVERFNBTWV0aG9kcyxcbiAgZXh0cmFjdENvbW1vbktleWNoYWluLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRva2VuRW5hYmxlbWVudENvbmZpZyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHJhbnNhY3Rpb25QYXJhbXMsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBDYW50b25LZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgeyBDYW50b25Db21tYW5kS2luZCwgVHhEYXRhIH0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL2xpYi90cmFuc2FjdGlvbi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIHR5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhIZXg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYW50b25UcmFuc2FjdGlvblBhcmFtcyBleHRlbmRzIFRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgY2FudG9uQ29tbWFuZFBhcmFtcz86IENhbnRvbkNvbW1hbmRQYXJhbXM7XG59XG5cbmV4cG9ydCBjbGFzcyBDYW50b24gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IENhbnRvbihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMWUxMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2NhbnRvbic7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldEZhbWlseSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NhbnRvbic7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy50c3M7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICByZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VkZHNhJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKTtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0eFByZWJ1aWxkLnR4SGV4O1xuICAgIGlmICghcmF3VHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKS5mcm9tKHJhd1R4KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHR4QnVpbGRlci50cmFuc2FjdGlvbjtcbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIHN3aXRjaCAodHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlckFjY2VwdDpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyUmVqZWN0OlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJBY2tub3dsZWRnZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyT2ZmZXJXaXRoZHJhd246XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db3NpZ25EZWxlZ2F0aW9uQWNjZXB0OlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ29zaWduRGVsZWdhdGlvblByb3Bvc2FsOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWxsb2NhdGlvbkFsbG9jYXRlOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWxsb2NhdGlvblJlcXVlc3Q6XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIHJlY2lwaWVudCBpbmZvIHRvIHZlcmlmeSBmb3IgdGhlc2UgdHJhbnNhY3Rpb24gdHlwZXMsIHNvIGFsd2F5cyByZXR1cm4gdHJ1ZS5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DYW50b25Db21tYW5kOlxuICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlDYW50b25Db21tYW5kVHJhbnNhY3Rpb24oXG4gICAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgICAgKHR4UGFyYW1zIGFzIENhbnRvblRyYW5zYWN0aW9uUGFyYW1zKS5jYW50b25Db21tYW5kUGFyYW1zXG4gICAgICAgICk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5PbmVTdGVwUHJlQXBwcm92YWw6XG4gICAgICAgIC8vIENhbnRvbiBpcyBhbHdheXMgYSBUU1Mgd2FsbGV0LiBUaGUgU0RLJ3MgYnVpbGRUb2tlbkVuYWJsZW1lbnRzIHBhc3NlcyBlbmFibGVUb2tlbnNcbiAgICAgICAgLy8gdGhyb3VnaCB1bmNoYW5nZWQgZm9yIFRTUyB3YWxsZXRzIChubyBjb252ZXJzaW9uIHRvIHJlY2lwaWVudHMpLCBzbyB0eFBhcmFtcy5lbmFibGVUb2tlbnNcbiAgICAgICAgLy8gaXMgdGhlIG9ubHkgc291cmNlIG9mIHVzZXIgaW50ZW50IGhlcmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJlY2VpdmVyIHZhbGlkYXRpb246IHRoZSByZWNlaXZlciBvZiBhIE9uZVN0ZXBQcmVBcHByb3ZhbCBpcyBhbHdheXMgdGhlIHdhbGxldCdzIHJvb3QgYWRkcmVzcy5cbiAgICAgICAgLy8gV2UgdXNlIGVuYWJsZVRva2VuLmFkZHJlc3MgaWYgZXhwbGljaXRseSBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyB3YWxsZXQuY29pblNwZWNpZmljKCkucm9vdEFkZHJlc3MgKHRoZSBDYW50b24gcGFydHkgSUQgc3RvcmVkIGF0IHdhbGxldCBjcmVhdGlvbiB0aW1lKS5cbiAgICAgICAgLy8gVG9rZW4gbmFtZSB2YWxpZGF0aW9uOiBjaGVja2VkIHdoZW4gdGhlIHRva2VuIGlzIHJlc29sdmFibGUgZnJvbSBzdGF0aWNzLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJyAmJlxuICAgICAgICAgIHR4UGFyYW1zLmVuYWJsZVRva2VucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdHhQYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCkgYXMgVHhEYXRhO1xuICAgICAgICAgIGNvbnN0IGVuYWJsZVRva2VuID0gdHhQYXJhbXMuZW5hYmxlVG9rZW5zWzBdO1xuICAgICAgICAgIGNvbnN0IHdhbGxldFJvb3RBZGRyZXNzID0gcGFyYW1zLndhbGxldD8uY29pblNwZWNpZmljPy4oKT8ucm9vdEFkZHJlc3M7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWRSZWNlaXZlciA9IGVuYWJsZVRva2VuLmFkZHJlc3MgPz8gd2FsbGV0Um9vdEFkZHJlc3M7XG4gICAgICAgICAgaWYgKGV4cGVjdGVkUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIC8vIFN0cmlwID9tZW1vSWQgc3VmZml4IGlmIHByZXNlbnQgaW4gdGhlIHN0b3JlZCBhZGRyZXNzXG4gICAgICAgICAgICBjb25zdCBbZXhwZWN0ZWRSZWNlaXZlckJhc2VdID0gZXhwZWN0ZWRSZWNlaXZlci5zcGxpdCgnP21lbW9JZD0nKTtcbiAgICAgICAgICAgIGlmICh0eERhdGEucmVjZWl2ZXIgIT09IGV4cGVjdGVkUmVjZWl2ZXJCYXNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgT25lU3RlcFByZUFwcHJvdmFsIHJlY2VpdmVyIG1pc21hdGNoOiBleHBlY3RlZCAnJHtleHBlY3RlZFJlY2VpdmVyQmFzZX0nLCBnb3QgJyR7dHhEYXRhLnJlY2VpdmVyfSdgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eERhdGEudG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0eERhdGEudG9rZW4gIT09IGVuYWJsZVRva2VuLm5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYE9uZVN0ZXBQcmVBcHByb3ZhbCB0b2tlbiBuYW1lIG1pc21hdGNoOiBleHBlY3RlZCAnJHtlbmFibGVUb2tlbi5uYW1lfScsIGdvdCAnJHt0eERhdGEudG9rZW59J2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFkZHJlc3MsIGFtb3VudCwgdG9rZW5OYW1lIH0gPSByZWNpcGllbnQ7XG4gICAgICAgICAgICBjb25zdCBbYWRkcmVzc1BhcnQsIG1lbW9JZF0gPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogYWRkcmVzc1BhcnQsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgLi4uKG1lbW9JZCAmJiB7IG1lbW86IG1lbW9JZCB9KSxcbiAgICAgICAgICAgICAgLi4uKHRva2VuTmFtZSAmJiB7IHRva2VuTmFtZSB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gZXhwbGFpbmVkVHgub3V0cHV0cz8ubWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWUsIG1lbW8gfSA9IG91dHB1dDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgLi4uKG1lbW8gJiYgeyBtZW1vIH0pLFxuICAgICAgICAgICAgICAuLi4odG9rZW5OYW1lICYmIHsgdG9rZW5OYW1lIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWRSZWNpcGllbnRzKSAhPT0gSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWRPdXRwdXRzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biB0cmFuc2FjdGlvbiB0eXBlLCAke3RyYW5zYWN0aW9uLnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlDYW50b25Db21tYW5kVHJhbnNhY3Rpb24oXG4gICAgdHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbixcbiAgICB1c2VyUGFyYW1zOiBDYW50b25Db21tYW5kUGFyYW1zIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlclBhcmFtcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudG9uVHggPSB0cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbjtcbiAgICBjb25zdCByYXdQcmVwYXJlZCA9IGNhbnRvblR4LnByZXBhcmVDb21tYW5kPy5wcmVwYXJlZFRyYW5zYWN0aW9uO1xuICAgIGlmICghcmF3UHJlcGFyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogbWlzc2luZyBwcmVwYXJlZFRyYW5zYWN0aW9uIHByb3RvYnVmIG9uIHR4IHByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb2RlZENvbW1hbmQgPSB1dGlscy5leHRyYWN0Q2FudG9uQ29tbWFuZEluZm8ocmF3UHJlcGFyZWQpO1xuICAgIGNvbnN0IHVzZXJDb21tYW5kID0gdXNlclBhcmFtcy5jb21tYW5kIGFzIFBhcnRpYWw8Q2FudG9uQ29tbWFuZD47XG5cbiAgICAvLyBJbnB1dCBzaGFwZSBpcyBlbmZvcmNlZCBieSBtcGNVdGlscyBhdCBidWlsZCB0aW1lOyBoZXJlIHdlIHJlc29sdmUgd2hpY2ggYnJhbmNoIGlzIHByZXNlbnQuXG4gICAgY29uc3QgaGFzQ3JlYXRlID0gJ0NyZWF0ZUNvbW1hbmQnIGluIHVzZXJDb21tYW5kICYmIHV0aWxzLmlzUGxhaW5PYmplY3QodXNlckNvbW1hbmQuQ3JlYXRlQ29tbWFuZCk7XG4gICAgY29uc3QgaGFzRXhlcmNpc2UgPSAnRXhlcmNpc2VDb21tYW5kJyBpbiB1c2VyQ29tbWFuZCAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHVzZXJDb21tYW5kLkV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgaWYgKCFoYXNDcmVhdGUgJiYgIWhhc0V4ZXJjaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBjb21tYW5kIG11c3QgY29udGFpbiBhIENyZWF0ZUNvbW1hbmQgb3IgRXhlcmNpc2VDb21tYW5kIHdyYXBwZXJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaGFzQ3JlYXRlICYmIGhhc0V4ZXJjaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBjb21tYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBvZiBDcmVhdGVDb21tYW5kIG9yIEV4ZXJjaXNlQ29tbWFuZCwgbm90IGJvdGhgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB1c2VyS2luZDogQ2FudG9uQ29tbWFuZEtpbmQgPSBoYXNDcmVhdGUgPyAnQ3JlYXRlQ29tbWFuZCcgOiAnRXhlcmNpc2VDb21tYW5kJztcbiAgICBpZiAoZGVjb2RlZENvbW1hbmQua2luZCAhPT0gdXNlcktpbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNvbW1hbmQga2luZCBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHt1c2VyS2luZH0sIGdvdCAke2RlY29kZWRDb21tYW5kLmtpbmR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySW5uZXIgPVxuICAgICAgdXNlcktpbmQgPT09ICdDcmVhdGVDb21tYW5kJ1xuICAgICAgICA/ICh1c2VyQ29tbWFuZCBhcyBDYW50b25DcmVhdGVDb21tYW5kKS5DcmVhdGVDb21tYW5kXG4gICAgICAgIDogKHVzZXJDb21tYW5kIGFzIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCkuRXhlcmNpc2VDb21tYW5kO1xuXG4gICAgaWYgKCF1c2VySW5uZXI/LnRlbXBsYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogJHt1c2VyS2luZH0udGVtcGxhdGVJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICAgIH1cblxuICAgIC8vIHRlbXBsYXRlSWQgKG1vZHVsZU5hbWUgKyBlbnRpdHlOYW1lOyBwYWNrYWdlIGlkIGlzIG11dGFibGUsIHNvIGlnbm9yZWQpXG4gICAgY29uc3QgcGFyc2VkID0gdXRpbHMucGFyc2VDYW50b25UZW1wbGF0ZUlkKHVzZXJJbm5lci50ZW1wbGF0ZUlkKTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogaW52YWxpZCB1c2VyIHRlbXBsYXRlSWQgJyR7dXNlcklubmVyLnRlbXBsYXRlSWR9JyDigJQgZXhwZWN0ZWQgZm9ybWF0ICdQa2c6TW9kdWxlOkVudGl0eSdgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZWNvZGVkQ29tbWFuZC50ZW1wbGF0ZUlkLm1vZHVsZU5hbWUgIT09IHBhcnNlZC5tb2R1bGVOYW1lIHx8XG4gICAgICBkZWNvZGVkQ29tbWFuZC50ZW1wbGF0ZUlkLmVudGl0eU5hbWUgIT09IHBhcnNlZC5lbnRpdHlOYW1lXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiB0ZW1wbGF0ZUlkIG1pc21hdGNoIOKAlCBleHBlY3RlZCAnJHtwYXJzZWQubW9kdWxlTmFtZX06JHtwYXJzZWQuZW50aXR5TmFtZX0nLCBnb3QgJyR7ZGVjb2RlZENvbW1hbmQudGVtcGxhdGVJZC5tb2R1bGVOYW1lfToke2RlY29kZWRDb21tYW5kLnRlbXBsYXRlSWQuZW50aXR5TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgaW5qZWN0LWFzIHNraXAgc2V0IG9uY2UgZm9yIHVzZSBhY3Jvc3MgdGhlIGNvbnRyYWN0SWQgYW5kIGFyZ3VtZW50IGNoZWNrc1xuICAgIGNvbnN0IHNraXBQYXRocyA9IHV0aWxzLm5vcm1hbGl6ZUluamVjdEFzKHVzZXJQYXJhbXMucmVzb2x2ZUNvbnRyYWN0cyk7XG5cbiAgICAvLyBtZXRhZGF0YS5zdWJtaXR0ZXJJbmZvLmFjdEFzIG11c3QgY29udGFpbiBleGFjdGx5IHRoZSBzYW1lIHBhcnRpZXMgYXMgdGhlIHVzZXIncyBhY3RBc1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1c2VyUGFyYW1zLmFjdEFzKSB8fCB1c2VyUGFyYW1zLmFjdEFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBhY3RBcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIHBhcnR5IElEc2ApO1xuICAgIH1cbiAgICBpZiAoIXVzZXJQYXJhbXMuYWN0QXMuZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJyAmJiBwLnRyaW0oKSAhPT0gJycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGFsbCBhY3RBcyBlbnRyaWVzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3NgKTtcbiAgICB9XG4gICAgY29uc3Qgc3VibWl0dGVyQWN0QXMgPSBjYW50b25UeC5jYW50b25Db21tYW5kQWN0QXNQYXJ0aWVzID8/IFtdO1xuICAgIGlmICghdXRpbHMuc2FtZUVsZW1lbnRzKHN1Ym1pdHRlckFjdEFzLCB1c2VyUGFyYW1zLmFjdEFzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogc3VibWl0dGVySW5mby5hY3RBcyBbJHtzdWJtaXR0ZXJBY3RBcy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX1dIGRvZXMgbm90IG1hdGNoIHVzZXIgYWN0QXMgWyR7dXNlclBhcmFtcy5hY3RBcy5qb2luKCcsICcpfV1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1c2VyS2luZCA9PT0gJ0V4ZXJjaXNlQ29tbWFuZCcpIHtcbiAgICAgIGNvbnN0IGV4ZXJjaXNlSW5uZXIgPSB1c2VySW5uZXIgYXMgQ2FudG9uRXhlcmNpc2VDb21tYW5kWydFeGVyY2lzZUNvbW1hbmQnXTtcblxuICAgICAgLy8gY2hvaWNlIGlkXG4gICAgICBpZiAoZGVjb2RlZENvbW1hbmQuY2hvaWNlICE9PSBleGVyY2lzZUlubmVyLmNob2ljZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNob2ljZSBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJyR7ZXhlcmNpc2VJbm5lci5jaG9pY2V9JywgZ290ICcke1xuICAgICAgICAgICAgZGVjb2RlZENvbW1hbmQuY2hvaWNlID8/ICcnXG4gICAgICAgICAgfSdgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZXJ5IG9uLWNoYWluIGFjdGluZ1BhcnR5IG11c3QgYmUgaW4gdGhlIHVzZXIncyBhY3RBcyAocHJldmVudHMgcHJpdmlsZWdlIGVzY2FsYXRpb24pXG4gICAgICBjb25zdCBvbkNoYWluQWN0b3JzID0gZGVjb2RlZENvbW1hbmQuYWN0aW5nUGFydGllcyA/PyBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0b3Igb2Ygb25DaGFpbkFjdG9ycykge1xuICAgICAgICBpZiAoIXVzZXJQYXJhbXMuYWN0QXMuaW5jbHVkZXMoYWN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IHVuYXV0aG9yaXplZCBhY3RpbmcgcGFydHkgJyR7YWN0b3J9JyBvbiByb290IGV4ZXJjaXNlIChub3QgaW4gdXNlciBhY3RBcylgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb250cmFjdElkIOKAlCBza2lwIHdoZW4gYWJzZW50L2VtcHR5IG9yIHdoZW4gSU1TIHdpbGwgaW5qZWN0IGl0IHZpYSByZXNvbHZlQ29udHJhY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGV4ZXJjaXNlSW5uZXIuY29udHJhY3RJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGV4ZXJjaXNlSW5uZXIuY29udHJhY3RJZCAhPT0gJycgJiZcbiAgICAgICAgIXNraXBQYXRocy5oYXMoJ0V4ZXJjaXNlQ29tbWFuZC5jb250cmFjdElkJylcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVjb2RlZENvbW1hbmQuY29udHJhY3RJZCAhPT0gZXhlcmNpc2VJbm5lci5jb250cmFjdElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNvbnRyYWN0SWQgbWlzbWF0Y2gg4oCUIGV4cGVjdGVkICcke2V4ZXJjaXNlSW5uZXIuY29udHJhY3RJZH0nLCBnb3QgJyR7XG4gICAgICAgICAgICAgIGRlY29kZWRDb21tYW5kLmNvbnRyYWN0SWQgPz8gJydcbiAgICAgICAgICAgIH0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGVlcCBhcmd1bWVudCBjb21wYXJlXG4gICAgICBjb25zdCBhcmd1bWVudFNraXBQYXRocyA9IHRoaXMucmVsYXRpdmVTa2lwUGF0aHMoc2tpcFBhdGhzLCAnRXhlcmNpc2VDb21tYW5kLmNob2ljZUFyZ3VtZW50LicpO1xuICAgICAgdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKGV4ZXJjaXNlSW5uZXIuY2hvaWNlQXJndW1lbnQsIGRlY29kZWRDb21tYW5kLmFyZ3VtZW50LCBhcmd1bWVudFNraXBQYXRocyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNyZWF0ZUlubmVyID0gdXNlcklubmVyIGFzIENhbnRvbkNyZWF0ZUNvbW1hbmRbJ0NyZWF0ZUNvbW1hbmQnXTtcblxuICAgICAgLy8gZGVlcCBhcmd1bWVudCBjb21wYXJlXG4gICAgICBjb25zdCBhcmd1bWVudFNraXBQYXRocyA9IHRoaXMucmVsYXRpdmVTa2lwUGF0aHMoc2tpcFBhdGhzLCAnQ3JlYXRlQ29tbWFuZC5jcmVhdGVBcmd1bWVudHMuJyk7XG4gICAgICB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goY3JlYXRlSW5uZXIuY3JlYXRlQXJndW1lbnRzLCBkZWNvZGVkQ29tbWFuZC5hcmd1bWVudCwgYXJndW1lbnRTa2lwUGF0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxhdGl2ZVNraXBQYXRocyhza2lwUGF0aHM6IFNldDxzdHJpbmc+LCBwcmVmaXg6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2Ygc2tpcFBhdGhzKSB7XG4gICAgICBpZiAocC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgY29uc3Qgc3RyaXBwZWQgPSBwLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoc3RyaXBwZWQpIG91dC5hZGQoc3RyaXBwZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBhbmQgdXNlIHRoZSBgdmVyaWZ5RWRkc2FNZW1vQmFzZWRXYWxsZXRBZGRyZXNzYCBvbmNlIHB1Ymxpc2hlZCBmcm9tIHNkay1jb3JlXG4gICAgLy8gaHR0cHM6Ly9iaXRnb2luYy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9DT0lOLTYzNDdcbiAgICBjb25zdCB7IGtleWNoYWlucywgYWRkcmVzczogbmV3QWRkcmVzcywgaW5kZXggfSA9IHBhcmFtcztcbiAgICBjb25zdCBbYWRkcmVzc1BhcnQsIG1lbW9JZF0gPSBuZXdBZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzUGFydCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7bmV3QWRkcmVzc31gKTtcbiAgICB9XG4gICAgaWYgKG1lbW9JZCAmJiBtZW1vSWQgIT09IGAke2luZGV4fWApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIG1lbW9JZCBpbmRleDogJHttZW1vSWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyk7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9ICdtLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBwdWJsaWNLZXlCYXNlNjQgPSBCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzRmluZ2VycHJpbnQgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXlCYXNlNjQpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gYCR7cm9vdEFkZHJlc3NGaW5nZXJwcmludC5zbGljZSgwLCA1KX06OiR7cm9vdEFkZHJlc3NGaW5nZXJwcmludH1gO1xuICAgIHJldHVybiBhZGRyZXNzUGFydCA9PT0gcm9vdEFkZHJlc3M7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IENhbnRvbktleVBhaXIoeyBzZWVkIH0pIDogbmV3IENhbnRvbktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmVidWlsdFRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb247XG4gICAgY29uc3QgdHhSYXcgPSBwYXJhbXMudHhIZXg7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eFJhdyk7XG4gICAgICByZWJ1aWx0VHJhbnNhY3Rpb24gPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gY2FudG9uIGFkZHJlc3NlcyBhcmUgb2YgdGhlIGZvcm0sIHBhcnR5SGludDo6ZmluZ2VycHJpbnRcbiAgICAvLyB3aGVyZSBwYXJ0eUhpbnQgaXMgb2YgbGVuZ3RoIDUgYW5kIGZpbmdlcnByaW50IGlzIDY4IGNoYXJhY3RlcnMgbG9uZ1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleUhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwdWJsaWNLZXlCYXNlNjQgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXlIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleUJhc2U2NCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICBpbnRlbnQudHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHJhbnNmZXJPZmZlcklkKSB7XG4gICAgICBpbnRlbnQudHJhbnNmZXJPZmZlcklkID0gcGFyYW1zLnRyYW5zZmVyT2ZmZXJJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy51bnNwZW50cykge1xuICAgICAgaW50ZW50LnVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmNhbnRvbkNvbW1hbmRQYXJhbXMpIHtcbiAgICAgIGludGVudC5jYW50b25Db21tYW5kUGFyYW1zID0gcGFyYW1zLmNhbnRvbkNvbW1hbmRQYXJhbXM7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { BitGoBase, CoinConstructor, NamedCoinConstructor } from '@bitgo-beta/sdk-core';
2
+ import { CantonTokenConfig } from '@bitgo-beta/statics';
3
+ import { Canton } from './canton';
4
+ export declare class CantonToken extends Canton {
5
+ readonly tokenConfig: CantonTokenConfig;
6
+ constructor(bitgo: BitGoBase, tokenConfig: CantonTokenConfig);
7
+ static createTokenConstructor(config: CantonTokenConfig): CoinConstructor;
8
+ static createTokenConstructors(tokenConfig?: CantonTokenConfig[]): NamedCoinConstructor[];
9
+ get name(): string;
10
+ get coin(): string;
11
+ get baseUrl(): string;
12
+ get contractAddress(): string;
13
+ get decimalPlaces(): number;
14
+ getChain(): string;
15
+ getBaseChain(): string;
16
+ getFullName(): string;
17
+ getBaseFactor(): number;
18
+ }
19
+ //# sourceMappingURL=cantonToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cantonToken.d.ts","sourceRoot":"","sources":["../../src/cantonToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAS,iBAAiB,EAAuB,MAAM,qBAAqB,CAAC;AAEpF,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,WAAY,SAAQ,MAAM;IACrC,SAAgB,WAAW,EAAE,iBAAiB,CAAC;gBAEnC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB;IAM5D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe;IAIzE,MAAM,CAAC,uBAAuB,CAC5B,WAAW,GAAE,iBAAiB,EAAuE,GACpG,oBAAoB,EAAE;IASzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CantonToken = void 0;
4
+ const statics_1 = require("@bitgo-beta/statics");
5
+ const canton_1 = require("./canton");
6
+ class CantonToken extends canton_1.Canton {
7
+ constructor(bitgo, tokenConfig) {
8
+ const staticsCoin = tokenConfig.network === statics_1.NetworkType.MAINNET ? statics_1.coins.get('canton') : statics_1.coins.get('tcanton');
9
+ super(bitgo, staticsCoin);
10
+ this.tokenConfig = tokenConfig;
11
+ }
12
+ static createTokenConstructor(config) {
13
+ return (bitgo) => new CantonToken(bitgo, config);
14
+ }
15
+ static createTokenConstructors(tokenConfig = [...statics_1.tokens.bitcoin.canton.tokens, ...statics_1.tokens.testnet.canton.tokens]) {
16
+ const tokensCtors = [];
17
+ for (const token of tokenConfig) {
18
+ const tokenConstructor = CantonToken.createTokenConstructor(token);
19
+ tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
20
+ }
21
+ return tokensCtors;
22
+ }
23
+ get name() {
24
+ return this.tokenConfig.name;
25
+ }
26
+ get coin() {
27
+ return this.tokenConfig.coin;
28
+ }
29
+ get baseUrl() {
30
+ return this.tokenConfig.baseUrl;
31
+ }
32
+ get contractAddress() {
33
+ return this.tokenConfig.contractAddress;
34
+ }
35
+ get decimalPlaces() {
36
+ return this.tokenConfig.decimalPlaces;
37
+ }
38
+ getChain() {
39
+ return this.tokenConfig.type;
40
+ }
41
+ getBaseChain() {
42
+ return this.coin;
43
+ }
44
+ getFullName() {
45
+ return 'Canton Token';
46
+ }
47
+ getBaseFactor() {
48
+ return Math.pow(10, this.tokenConfig.decimalPlaces);
49
+ }
50
+ }
51
+ exports.CantonToken = CantonToken;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FudG9uVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQW9GO0FBRXBGLHFDQUFrQztBQUVsQyxNQUFhLFdBQVksU0FBUSxlQUFNO0lBR3JDLFlBQVksS0FBZ0IsRUFBRSxXQUE4QjtRQUMxRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUF5QjtRQUNyRCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGNBQW1DLENBQUMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUVyRyxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUEzREQsa0NBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE5hbWVkQ29pbkNvbnN0cnVjdG9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIENhbnRvblRva2VuQ29uZmlnLCBOZXR3b3JrVHlwZSwgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmltcG9ydCB7IENhbnRvbiB9IGZyb20gJy4vY2FudG9uJztcblxuZXhwb3J0IGNsYXNzIENhbnRvblRva2VuIGV4dGVuZHMgQ2FudG9uIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBDYW50b25Ub2tlbkNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogQ2FudG9uVG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IHRva2VuQ29uZmlnLm5ldHdvcmsgPT09IE5ldHdvcmtUeXBlLk1BSU5ORVQgPyBjb2lucy5nZXQoJ2NhbnRvbicpIDogY29pbnMuZ2V0KCd0Y2FudG9uJyk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcihjb25maWc6IENhbnRvblRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBDYW50b25Ub2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZzogQ2FudG9uVG9rZW5Db25maWdbXSA9IFsuLi50b2tlbnMuYml0Y29pbi5jYW50b24udG9rZW5zLCAuLi50b2tlbnMudGVzdG5ldC5jYW50b24udG9rZW5zXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWcpIHtcbiAgICAgIGNvbnN0IHRva2VuQ29uc3RydWN0b3IgPSBDYW50b25Ub2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNDdG9ycztcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcubmFtZTtcbiAgfVxuXG4gIGdldCBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuY29pbjtcbiAgfVxuXG4gIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuYmFzZVVybDtcbiAgfVxuXG4gIGdldCBjb250cmFjdEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRCYXNlQ2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2luO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NhbnRvbiBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG59XG4iXX0=
@@ -2,4 +2,5 @@ export * from './lib';
2
2
  export * from './canton';
3
3
  export * from './tcanton';
4
4
  export * from './register';
5
+ export * from './cantonToken';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
package/dist/src/index.js CHANGED
@@ -18,4 +18,5 @@ __exportStar(require("./lib"), exports);
18
18
  __exportStar(require("./canton"), exports);
19
19
  __exportStar(require("./tcanton"), exports);
20
20
  __exportStar(require("./register"), exports);
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0QiwyQ0FBeUI7QUFDekIsNENBQTBCO0FBQzFCLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliJztcbmV4cG9ydCAqIGZyb20gJy4vY2FudG9uJztcbmV4cG9ydCAqIGZyb20gJy4vdGNhbnRvbic7XG5leHBvcnQgKiBmcm9tICcuL3JlZ2lzdGVyJztcbiJdfQ==
21
+ __exportStar(require("./cantonToken"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0QiwyQ0FBeUI7QUFDekIsNENBQTBCO0FBQzFCLDZDQUEyQjtBQUMzQixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYic7XG5leHBvcnQgKiBmcm9tICcuL2NhbnRvbic7XG5leHBvcnQgKiBmcm9tICcuL3RjYW50b24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdpc3Rlcic7XG5leHBvcnQgKiBmcm9tICcuL2NhbnRvblRva2VuJztcbiJdfQ==