wormhole/sdk/mainnet_consts.go

158 lines
6.6 KiB
Go

package sdk
import (
"encoding/hex"
"fmt"
"github.com/wormhole-foundation/wormhole/sdk/vaa"
)
// PublicRPCEndpoints is a list of known public RPC endpoints for mainnet, operated by
// Wormhole guardian nodes.
//
// This list is duplicated a couple times across the codebase - make to to update all copies!
var PublicRPCEndpoints = []string{
"https://wormhole-v2-mainnet-api.certus.one",
"https://wormhole.inotel.ro",
"https://wormhole-v2-mainnet-api.mcf.rocks",
"https://wormhole-v2-mainnet-api.chainlayer.network",
"https://wormhole-v2-mainnet-api.staking.fund",
"https://wormhole-v2-mainnet.01node.com",
}
type (
EmitterType uint8
)
const (
EmitterTypeUnset EmitterType = 0
EmitterCoreBridge EmitterType = 1
EmitterTokenBridge EmitterType = 2
EmitterNFTBridge EmitterType = 3
)
func (et EmitterType) String() string {
switch et {
case EmitterTypeUnset:
return "unset"
case EmitterCoreBridge:
return "Core"
case EmitterTokenBridge:
return "TokenBridge"
case EmitterNFTBridge:
return "NFTBridge"
default:
return fmt.Sprintf("unknown emitter type: %d", et)
}
}
type EmitterInfo struct {
ChainID vaa.ChainID
Emitter string
BridgeType EmitterType
}
// KnownEmitters is a list of well-known mainnet emitters we want to take into account
// when iterating over all emitters - like for finding and repairing missing messages.
//
// Wormhole is not permissioned - anyone can use it. Adding contracts to this list is
// entirely optional and at the core team's discretion.
var KnownEmitters = buildKnownEmitters(knownTokenbridgeEmitters, knownNFTBridgeEmitters)
func buildKnownEmitters(tokenEmitters, nftEmitters map[vaa.ChainID]string) []EmitterInfo {
out := make([]EmitterInfo, 0, len(knownTokenbridgeEmitters)+len(knownNFTBridgeEmitters))
for id, emitter := range tokenEmitters {
out = append(out, EmitterInfo{
ChainID: id,
Emitter: emitter,
BridgeType: EmitterTokenBridge,
})
}
for id, emitter := range nftEmitters {
out = append(out, EmitterInfo{
ChainID: id,
Emitter: emitter,
BridgeType: EmitterNFTBridge,
})
}
return out
}
func buildEmitterMap(hexmap map[vaa.ChainID]string) map[vaa.ChainID][]byte {
out := make(map[vaa.ChainID][]byte)
for id, emitter := range hexmap {
e, err := hex.DecodeString(emitter)
if err != nil {
panic(fmt.Sprintf("Failed to decode emitter address %v: %v", emitter, err))
}
out[id] = e
}
return out
}
// KnownTokenbridgeEmitters is a list of well-known mainnet emitters for the tokenbridge.
var KnownTokenbridgeEmitters = buildEmitterMap(knownTokenbridgeEmitters)
var knownTokenbridgeEmitters = map[vaa.ChainID]string{
vaa.ChainIDSolana: "ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5",
vaa.ChainIDEthereum: "0000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585",
vaa.ChainIDTerra: "0000000000000000000000007cf7b764e38a0a5e967972c1df77d432510564e2",
vaa.ChainIDTerra2: "a463ad028fb79679cfc8ce1efba35ac0e77b35080a1abe9bebe83461f176b0a3",
vaa.ChainIDBSC: "000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7",
vaa.ChainIDPolygon: "0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde",
vaa.ChainIDAvalanche: "0000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052",
vaa.ChainIDOasis: "0000000000000000000000005848c791e09901b40a9ef749f2a6735b418d7564",
vaa.ChainIDAlgorand: "67e93fa6c8ac5c819990aa7340c0c16b508abb1178be9b30d024b8ac25193d45",
vaa.ChainIDAptos: "0000000000000000000000000000000000000000000000000000000000000001",
vaa.ChainIDAurora: "00000000000000000000000051b5123a7b0F9b2bA265f9c4C8de7D78D52f510F",
vaa.ChainIDFantom: "0000000000000000000000007C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2",
vaa.ChainIDKarura: "000000000000000000000000ae9d7fe007b3327AA64A32824Aaac52C42a6E624",
vaa.ChainIDAcala: "000000000000000000000000ae9d7fe007b3327AA64A32824Aaac52C42a6E624",
vaa.ChainIDKlaytn: "0000000000000000000000005b08ac39EAED75c0439FC750d9FE7E1F9dD0193F",
vaa.ChainIDCelo: "000000000000000000000000796Dff6D74F3E27060B71255Fe517BFb23C93eed",
vaa.ChainIDNear: "148410499d3fcda4dcfd68a1ebfcdddda16ab28326448d4aae4d2f0465cdfcb7",
vaa.ChainIDMoonbeam: "000000000000000000000000B1731c586ca89a23809861c6103F0b96B3F57D92",
vaa.ChainIDArbitrum: "0000000000000000000000000b2402144Bb366A632D14B83F244D2e0e21bD39c",
vaa.ChainIDOptimism: "0000000000000000000000001D68124e65faFC907325e3EDbF8c4d84499DAa8b",
vaa.ChainIDXpla: "8f9cf727175353b17a5f574270e370776123d90fd74956ae4277962b4fdee24c",
vaa.ChainIDInjective: "00000000000000000000000045dbea4617971d93188eda21530bc6503d153313",
}
// KnownNFTBridgeEmitters is a list of well-known mainnet emitters for the NFT bridge.
var KnownNFTBridgeEmitters = buildEmitterMap(knownNFTBridgeEmitters)
var knownNFTBridgeEmitters = map[vaa.ChainID]string{
vaa.ChainIDSolana: "0def15a24423e1edd1a5ab16f557b9060303ddbab8c803d2ee48f4b78a1cfd6b",
vaa.ChainIDEthereum: "0000000000000000000000006ffd7ede62328b3af38fcd61461bbfc52f5651fe",
vaa.ChainIDBSC: "0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde",
vaa.ChainIDPolygon: "00000000000000000000000090bbd86a6fe93d3bc3ed6335935447e75fab7fcf",
vaa.ChainIDAvalanche: "000000000000000000000000f7b6737ca9c4e08ae573f75a97b73d7a813f5de5",
vaa.ChainIDOasis: "00000000000000000000000004952d522ff217f40b5ef3cbf659eca7b952a6c1",
vaa.ChainIDAurora: "0000000000000000000000006dcC0484472523ed9Cdc017F711Bcbf909789284",
vaa.ChainIDFantom: "000000000000000000000000A9c7119aBDa80d4a4E0C06C8F4d8cF5893234535",
vaa.ChainIDKarura: "000000000000000000000000b91e3638F82A1fACb28690b37e3aAE45d2c33808",
vaa.ChainIDAcala: "000000000000000000000000b91e3638F82A1fACb28690b37e3aAE45d2c33808",
vaa.ChainIDKlaytn: "0000000000000000000000003c3c561757BAa0b78c5C025CdEAa4ee24C1dFfEf",
vaa.ChainIDCelo: "000000000000000000000000A6A377d75ca5c9052c9a77ED1e865Cc25Bd97bf3",
vaa.ChainIDMoonbeam: "000000000000000000000000453cfBe096C0f8D763E8C5F24B441097d577bdE2",
vaa.ChainIDArbitrum: "0000000000000000000000003dD14D553cFD986EAC8e3bddF629d82073e188c8",
vaa.ChainIDOptimism: "000000000000000000000000fE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585",
vaa.ChainIDAptos: "0000000000000000000000000000000000000000000000000000000000000005",
}
func GetEmitterAddressForChain(chainID vaa.ChainID, emitterType EmitterType) (vaa.Address, error) {
for _, emitter := range KnownEmitters {
if emitter.ChainID == chainID && emitter.BridgeType == emitterType {
emitterAddr, err := vaa.StringToAddress(emitter.Emitter)
if err != nil {
return vaa.Address{}, err
}
return emitterAddr, nil
}
}
return vaa.Address{}, fmt.Errorf("lookup failed")
}