@@ -16,17 +16,19 @@ import { ProtocolModule } from "../protocol/ProtocolModule";
1616import { ContractModule } from "./ContractModule" ;
1717import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule" ;
1818import { DispatchContractType } from "./contracts/DispatchSmartContract" ;
19- import {
20- SettlementContractConfig ,
21- SettlementContractProtocolModule ,
22- } from "./contracts/SettlementContractProtocolModule" ;
23- import { SettlementContractType } from "./contracts/SettlementSmartContract" ;
19+ import { BridgingSettlementContractModule } from "./contracts/BridgingSettlementContractModule" ;
2420import { BridgeContractType } from "./contracts/BridgeContract" ;
2521import {
2622 BridgeContractConfig ,
2723 BridgeContractProtocolModule ,
2824} from "./contracts/BridgeContractProtocolModule" ;
29- import { GetContracts } from "./modularity/types" ;
25+ import { GetContracts , InferContractType } from "./modularity/types" ;
26+ import { BridgingSettlementContractType } from "./contracts/settlement/BridgingSettlementContract" ;
27+ import { SettlementContractType } from "./contracts/settlement/SettlementBase" ;
28+ import {
29+ SettlementContractConfig ,
30+ SettlementSmartContractModule ,
31+ } from "./contracts/SettlementSmartContractModule" ;
3032
3133export type SettlementModulesRecord = ModulesRecord <
3234 TypedClass < ContractModule < unknown , unknown > >
@@ -36,6 +38,12 @@ export type MandatorySettlementModulesRecord = {
3638 SettlementContract : TypedClass <
3739 ContractModule < SettlementContractType , SettlementContractConfig >
3840 > ;
41+ } ;
42+
43+ export type BridgingSettlementModulesRecord = {
44+ SettlementContract : TypedClass <
45+ ContractModule < BridgingSettlementContractType , SettlementContractConfig >
46+ > ;
3947 DispatchContract : TypedClass < ContractModule < DispatchContractType , unknown > > ;
4048 BridgeContract : TypedClass <
4149 ContractModule < BridgeContractType , BridgeContractConfig >
@@ -44,8 +52,7 @@ export type MandatorySettlementModulesRecord = {
4452
4553@injectable ( )
4654export class SettlementContractModule <
47- SettlementModules extends SettlementModulesRecord &
48- MandatorySettlementModulesRecord ,
55+ SettlementModules extends SettlementModulesRecord ,
4956 >
5057 extends ModuleContainer < SettlementModules >
5158 implements ProtocolModule < unknown >
@@ -54,10 +61,7 @@ export class SettlementContractModule<
5461 super ( definition ) ;
5562 }
5663
57- public static from <
58- SettlementModules extends SettlementModulesRecord &
59- MandatorySettlementModulesRecord ,
60- > (
64+ public static from < SettlementModules extends SettlementModulesRecord > (
6165 modules : SettlementModules
6266 ) : TypedClass < SettlementContractModule < SettlementModules > > {
6367 return class ScopedSettlementContractModule extends SettlementContractModule < SettlementModules > {
@@ -67,27 +71,18 @@ export class SettlementContractModule<
6771 } ;
6872 }
6973
70- public static mandatoryModules ( ) {
74+ public static settlementOnly ( ) {
7175 return {
72- SettlementContract : SettlementContractProtocolModule ,
73- DispatchContract : DispatchContractProtocolModule ,
74- BridgeContract : BridgeContractProtocolModule ,
76+ SettlementContract : SettlementSmartContractModule ,
7577 } as const ;
7678 }
7779
78- public static fromDefaults ( ) {
79- return SettlementContractModule . from (
80- SettlementContractModule . mandatoryModules ( )
81- ) ;
82- }
83-
84- public static with < AdditionalModules extends SettlementModulesRecord > (
85- additionalModules : AdditionalModules
86- ) {
87- return SettlementContractModule . from ( {
88- ...SettlementContractModule . mandatoryModules ( ) ,
89- ...additionalModules ,
90- } as const ) ;
80+ public static settlementAndBridging ( ) {
81+ return {
82+ SettlementContract : BridgingSettlementContractModule ,
83+ DispatchContract : DispatchContractProtocolModule ,
84+ BridgeContract : BridgeContractProtocolModule ,
85+ } as const ;
9186 }
9287
9388 // ** For protocol module
@@ -116,30 +111,40 @@ export class SettlementContractModule<
116111 return Object . fromEntries ( contracts ) ;
117112 }
118113
119- public createContracts ( addresses : {
120- settlement : PublicKey ;
121- dispatch : PublicKey ;
122- } ) : {
123- settlement : SettlementContractType & SmartContract ;
124- dispatch : DispatchContractType & SmartContract ;
125- } {
126- const { DispatchContract, SettlementContract } = this . getContractClasses ( ) ;
127-
128- const dispatchInstance = new DispatchContract ( addresses . dispatch ) ;
129- const settlementInstance = new SettlementContract ( addresses . settlement ) ;
130-
131- return {
132- dispatch : dispatchInstance ,
133- settlement : settlementInstance ,
134- } ;
135- }
136-
137- public createBridgeContract (
114+ public createContract < ContractName extends StringKeyOf < SettlementModules > > (
115+ contractName : ContractName ,
138116 address : PublicKey ,
139117 tokenId ?: Field
140- ) : BridgeContractType & SmartContract {
141- const { BridgeContract } = this . getContractClasses ( ) ;
118+ ) : InferContractType < SettlementModules [ ContractName ] > {
119+ const module = this . resolve ( contractName ) ;
120+ const ContractClass = module . contractFactory ( ) ;
121+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
122+ return new ContractClass ( address , tokenId ) as InferContractType <
123+ SettlementModules [ ContractName ]
124+ > ;
125+ }
142126
143- return new BridgeContract ( address , tokenId ) ;
127+ public createContracts <
128+ ContractName extends keyof SettlementModules ,
129+ > ( addresses : {
130+ [ Key in ContractName ] : PublicKey ;
131+ } ) : {
132+ [ Key in ContractName ] : SmartContract &
133+ InferContractType < SettlementModules [ Key ] > ;
134+ } {
135+ const classes = this . getContractClasses ( ) ;
136+
137+ const obj : Record < string , SmartContract > = { } ;
138+ // eslint-disable-next-line guard-for-in
139+ for ( const key in addresses ) {
140+ const ContractClass = classes [ key ] ;
141+ obj [ key ] = new ContractClass ( addresses [ key ] ) ;
142+ }
143+
144+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
145+ return obj as {
146+ [ Key in keyof SettlementModules ] : SmartContract &
147+ InferContractType < SettlementModules [ Key ] > ;
148+ } ;
144149 }
145150}
0 commit comments