mainnet_consts.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package sdk
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "github.com/wormhole-foundation/wormhole/sdk/vaa"
  6. )
  7. // PublicRPCEndpoints is a list of known public RPC endpoints for mainnet, operated by
  8. // Wormhole guardian nodes.
  9. //
  10. // This list is duplicated a couple times across the codebase - make sure to update all copies!
  11. var PublicRPCEndpoints = []string{
  12. "https://wormhole-v2-mainnet-api.mcf.rocks",
  13. "https://wormhole-v2-mainnet-api.chainlayer.network",
  14. "https://wormhole-v2-mainnet-api.staking.fund",
  15. "https://guardian.mainnet.xlabs.xyz",
  16. }
  17. type (
  18. EmitterType uint8
  19. )
  20. const (
  21. EmitterTypeUnset EmitterType = 0
  22. EmitterCoreBridge EmitterType = 1
  23. EmitterTokenBridge EmitterType = 2
  24. EmitterNFTBridge EmitterType = 3
  25. )
  26. func (et EmitterType) String() string {
  27. switch et {
  28. case EmitterTypeUnset:
  29. return "unset"
  30. case EmitterCoreBridge:
  31. return "Core"
  32. case EmitterTokenBridge:
  33. return "TokenBridge"
  34. case EmitterNFTBridge:
  35. return "NFTBridge"
  36. default:
  37. return fmt.Sprintf("unknown emitter type: %d", et)
  38. }
  39. }
  40. type EmitterInfo struct {
  41. ChainID vaa.ChainID
  42. Emitter string
  43. BridgeType EmitterType
  44. }
  45. // KnownEmitters is a list of well-known mainnet emitters we want to take into account
  46. // when iterating over all emitters - like for finding and repairing missing messages.
  47. //
  48. // Wormhole is not permissioned - anyone can use it. Adding contracts to this list is
  49. // entirely optional and at the core team's discretion.
  50. var KnownEmitters = buildKnownEmitters(knownTokenbridgeEmitters, knownNFTBridgeEmitters)
  51. func buildKnownEmitters(tokenEmitters, nftEmitters map[vaa.ChainID]string) []EmitterInfo {
  52. out := make([]EmitterInfo, 0, len(knownTokenbridgeEmitters)+len(knownNFTBridgeEmitters))
  53. for id, emitter := range tokenEmitters {
  54. out = append(out, EmitterInfo{
  55. ChainID: id,
  56. Emitter: emitter,
  57. BridgeType: EmitterTokenBridge,
  58. })
  59. }
  60. for id, emitter := range nftEmitters {
  61. out = append(out, EmitterInfo{
  62. ChainID: id,
  63. Emitter: emitter,
  64. BridgeType: EmitterNFTBridge,
  65. })
  66. }
  67. return out
  68. }
  69. func buildEmitterMap(hexmap map[vaa.ChainID]string) map[vaa.ChainID][]byte {
  70. out := make(map[vaa.ChainID][]byte)
  71. for id, emitter := range hexmap {
  72. e, err := hex.DecodeString(emitter)
  73. if err != nil {
  74. panic(fmt.Sprintf("Failed to decode emitter address %v: %v", emitter, err))
  75. }
  76. out[id] = e
  77. }
  78. return out
  79. }
  80. // KnownTokenbridgeEmitters is a list of well-known mainnet emitters for the tokenbridge.
  81. var KnownTokenbridgeEmitters = buildEmitterMap(knownTokenbridgeEmitters)
  82. var knownTokenbridgeEmitters = map[vaa.ChainID]string{
  83. vaa.ChainIDSolana: "ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5",
  84. vaa.ChainIDEthereum: "0000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585",
  85. vaa.ChainIDBSC: "000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7",
  86. vaa.ChainIDPolygon: "0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde",
  87. vaa.ChainIDAvalanche: "0000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052",
  88. vaa.ChainIDAlgorand: "67e93fa6c8ac5c819990aa7340c0c16b508abb1178be9b30d024b8ac25193d45",
  89. vaa.ChainIDAptos: "0000000000000000000000000000000000000000000000000000000000000001",
  90. vaa.ChainIDFantom: "0000000000000000000000007C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2",
  91. vaa.ChainIDKlaytn: "0000000000000000000000005b08ac39EAED75c0439FC750d9FE7E1F9dD0193F",
  92. vaa.ChainIDCelo: "000000000000000000000000796Dff6D74F3E27060B71255Fe517BFb23C93eed",
  93. vaa.ChainIDNear: "148410499d3fcda4dcfd68a1ebfcdddda16ab28326448d4aae4d2f0465cdfcb7",
  94. vaa.ChainIDMoonbeam: "000000000000000000000000B1731c586ca89a23809861c6103F0b96B3F57D92",
  95. vaa.ChainIDArbitrum: "0000000000000000000000000b2402144Bb366A632D14B83F244D2e0e21bD39c",
  96. vaa.ChainIDOptimism: "0000000000000000000000001D68124e65faFC907325e3EDbF8c4d84499DAa8b",
  97. vaa.ChainIDBase: "0000000000000000000000008d2de8d2f73F1F4cAB472AC9A881C9b123C79627",
  98. vaa.ChainIDScroll: "00000000000000000000000024850c6f61C438823F01B7A3BF2B89B72174Fa9d",
  99. vaa.ChainIDMantle: "00000000000000000000000024850c6f61C438823F01B7A3BF2B89B72174Fa9d",
  100. vaa.ChainIDXLayer: "0000000000000000000000005537857664B0f9eFe38C9f320F75fEf23234D904",
  101. vaa.ChainIDBerachain: "0000000000000000000000003Ff72741fd67D6AD0668d93B41a09248F4700560",
  102. vaa.ChainIDSeiEVM: "0000000000000000000000003Ff72741fd67D6AD0668d93B41a09248F4700560",
  103. vaa.ChainIDUnichain: "0000000000000000000000003Ff72741fd67D6AD0668d93B41a09248F4700560",
  104. vaa.ChainIDInjective: "00000000000000000000000045dbea4617971d93188eda21530bc6503d153313",
  105. vaa.ChainIDSui: "ccceeb29348f71bdd22ffef43a2a19c1f5b5e17c5cca5411529120182672ade5",
  106. vaa.ChainIDSei: "86c5fd957e2db8389553e1728f9c27964b22a8154091ccba54d75f4b10c61f5e",
  107. vaa.ChainIDWormchain: "aeb534c45c3049d380b9d9b966f9895f53abd4301bfaff407fa09dea8ae7a924",
  108. vaa.ChainIDWorldchain: "000000000000000000000000c309275443519adca74c9136b02A38eF96E3a1f6",
  109. vaa.ChainIDInk: "0000000000000000000000003Ff72741fd67D6AD0668d93B41a09248F4700560",
  110. vaa.ChainIDMezo: "000000000000000000000000F97B81E513f53c7a6B57Bd0b103a6c295b3096C5",
  111. vaa.ChainIDXRPLEVM: "00000000000000000000000047F5195163270345fb4d7B9319Eda8C64C75E278",
  112. vaa.ChainIDLinea: "000000000000000000000000167E0752de62cb76EFc0Fbb165Bd342c6e2Bb251",
  113. vaa.ChainIDFogo: "289e998e357c96dbfd8490b853595e0d48639ede2d1aed4a819edcc00165904c",
  114. vaa.ChainIDMonad: "0000000000000000000000000B2719cdA2F10595369e6673ceA3Ee2EDFa13BA7",
  115. }
  116. // KnownNFTBridgeEmitters is a list of well-known mainnet emitters for the NFT bridge.
  117. var KnownNFTBridgeEmitters = buildEmitterMap(knownNFTBridgeEmitters)
  118. var knownNFTBridgeEmitters = map[vaa.ChainID]string{
  119. vaa.ChainIDSolana: "0def15a24423e1edd1a5ab16f557b9060303ddbab8c803d2ee48f4b78a1cfd6b",
  120. vaa.ChainIDEthereum: "0000000000000000000000006ffd7ede62328b3af38fcd61461bbfc52f5651fe",
  121. vaa.ChainIDBSC: "0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde",
  122. vaa.ChainIDPolygon: "00000000000000000000000090bbd86a6fe93d3bc3ed6335935447e75fab7fcf",
  123. vaa.ChainIDAvalanche: "000000000000000000000000f7b6737ca9c4e08ae573f75a97b73d7a813f5de5",
  124. vaa.ChainIDFantom: "000000000000000000000000A9c7119aBDa80d4a4E0C06C8F4d8cF5893234535",
  125. vaa.ChainIDKlaytn: "0000000000000000000000003c3c561757BAa0b78c5C025CdEAa4ee24C1dFfEf",
  126. vaa.ChainIDCelo: "000000000000000000000000A6A377d75ca5c9052c9a77ED1e865Cc25Bd97bf3",
  127. vaa.ChainIDMoonbeam: "000000000000000000000000453cfBe096C0f8D763E8C5F24B441097d577bdE2",
  128. vaa.ChainIDArbitrum: "0000000000000000000000003dD14D553cFD986EAC8e3bddF629d82073e188c8",
  129. vaa.ChainIDOptimism: "000000000000000000000000fE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585",
  130. vaa.ChainIDBase: "000000000000000000000000DA3adC6621B2677BEf9aD26598e6939CF0D92f88",
  131. vaa.ChainIDAptos: "0000000000000000000000000000000000000000000000000000000000000005",
  132. }
  133. func GetEmitterAddressForChain(chainID vaa.ChainID, emitterType EmitterType) (vaa.Address, error) {
  134. for _, emitter := range KnownEmitters {
  135. if emitter.ChainID == chainID && emitter.BridgeType == emitterType {
  136. emitterAddr, err := vaa.StringToAddress(emitter.Emitter)
  137. if err != nil {
  138. return vaa.Address{}, err
  139. }
  140. return emitterAddr, nil
  141. }
  142. }
  143. return vaa.Address{}, fmt.Errorf("lookup failed")
  144. }
  145. // KnownAutomaticRelayerEmitters is a list of well-known mainnet emitters for the Automatic Relayers.
  146. // It is based on this: https://github.com/wormhole-foundation/wormhole/blob/2c9703670eadc48a7dc8967e81ed2823affcc679/sdk/js/src/relayer/consts.ts#L95
  147. // Note that the format of this is different from the other maps because we don't want to limit it to one per chain.
  148. var KnownAutomaticRelayerEmitters = []struct {
  149. ChainId vaa.ChainID
  150. Addr string
  151. }{
  152. {ChainId: vaa.ChainIDEthereum, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  153. {ChainId: vaa.ChainIDBSC, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  154. {ChainId: vaa.ChainIDPolygon, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  155. {ChainId: vaa.ChainIDAvalanche, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  156. {ChainId: vaa.ChainIDFantom, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  157. {ChainId: vaa.ChainIDKlaytn, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  158. {ChainId: vaa.ChainIDCelo, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  159. {ChainId: vaa.ChainIDMoonbeam, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  160. {ChainId: vaa.ChainIDArbitrum, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  161. {ChainId: vaa.ChainIDOptimism, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  162. {ChainId: vaa.ChainIDBase, Addr: "000000000000000000000000706f82e9bb5b0813501714ab5974216704980e31"},
  163. {ChainId: vaa.ChainIDScroll, Addr: "00000000000000000000000027428DD2d3DD32A4D7f7C497eAaa23130d894911"},
  164. {ChainId: vaa.ChainIDMantle, Addr: "00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911"},
  165. {ChainId: vaa.ChainIDXLayer, Addr: "00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911"},
  166. {ChainId: vaa.ChainIDWorldchain, Addr: "0000000000000000000000001520cc9e779c56dab5866bebfb885c86840c33d3"},
  167. {ChainId: vaa.ChainIDXRPLEVM, Addr: "00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911"},
  168. }
  169. // KnownWrappedNativeAddress is a map of wrapped native addresses by chain ID, e.g. WETH for Ethereum
  170. var KnownWrappedNativeAddress = map[vaa.ChainID]string{
  171. // WETH
  172. vaa.ChainIDEthereum: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
  173. }