@@ -19,29 +19,54 @@ type msgServer struct {
1919
2020// CreateSyntheticToken ...
2121func (ms msgServer ) CreateSyntheticToken (ctx context.Context , msg * types.MsgCreateSyntheticToken ) (* types.MsgCreateSyntheticTokenResponse , error ) {
22+ return ms .internalCreateSyntheticToken (ctx , msg .Owner , msg .OriginMailbox , "" )
23+ }
24+
25+ // CreateNativeSyntheticToken is an authority gated version of
26+ // CreateSyntheticToken that allows the module authority to specify a native
27+ // (custom) origin denom for the synthetic token.
28+ func (ms msgServer ) CreateNativeSyntheticToken (ctx context.Context , msg * types.MsgCreateNativeSyntheticToken ) (* types.MsgCreateSyntheticTokenResponse , error ) {
29+ if msg .Owner != ms .k .authority {
30+ return nil , fmt .Errorf ("invalid authority: expected %s, got %s" , ms .k .authority , msg .Owner )
31+ }
32+
33+ if ms .k .bankKeeper .HasSupply (ctx , msg .OriginDenom ) {
34+ return nil , fmt .Errorf ("denom %s already exists" , msg .OriginDenom )
35+ }
36+
37+ return ms .internalCreateSyntheticToken (ctx , msg .Owner , msg .OriginMailbox , msg .OriginDenom )
38+ }
39+
40+ // internalCreateSyntheticToken handles the internal logic for creating a synthetic token.
41+ func (ms msgServer ) internalCreateSyntheticToken (ctx context.Context , owner string , originMailbox util.HexAddress , originDenom string ) (* types.MsgCreateSyntheticTokenResponse , error ) {
2242 if ! slices .Contains (ms .k .enabledTokens , int32 (types .HYP_TOKEN_TYPE_SYNTHETIC )) {
2343 return nil , fmt .Errorf ("module disabled synthetic tokens" )
2444 }
2545
26- has , err := ms .k .coreKeeper .MailboxIdExists (ctx , msg . OriginMailbox )
46+ has , err := ms .k .coreKeeper .MailboxIdExists (ctx , originMailbox )
2747 if err != nil {
2848 return nil , err
2949 }
3050 if ! has {
31- return nil , fmt .Errorf ("failed to find mailbox with id: %s" , msg . OriginMailbox .String ())
51+ return nil , fmt .Errorf ("failed to find mailbox with id: %s" , originMailbox .String ())
3252 }
3353
3454 tokenId , err := ms .k .coreKeeper .AppRouter ().GetNextSequence (ctx , uint8 (types .HYP_TOKEN_TYPE_SYNTHETIC ))
3555 if err != nil {
3656 return nil , err
3757 }
3858
59+ // If the originDenom is left empty, we populate it as a non-native denom.
60+ if originDenom == "" {
61+ originDenom = fmt .Sprintf ("hyperlane/%s" , tokenId .String ())
62+ }
63+
3964 newToken := types.HypToken {
4065 Id : tokenId ,
41- Owner : msg . Owner ,
66+ Owner : owner ,
4267 TokenType : types .HYP_TOKEN_TYPE_SYNTHETIC ,
43- OriginMailbox : msg . OriginMailbox ,
44- OriginDenom : fmt . Sprintf ( "hyperlane/%s" , tokenId . String ()) ,
68+ OriginMailbox : originMailbox ,
69+ OriginDenom : originDenom ,
4570 }
4671
4772 if err = ms .k .HypTokens .Set (ctx , tokenId .GetInternalId (), newToken ); err != nil {
0 commit comments