@stable-io/cctp-sdk-definitions
Version:
Definitions for the CCTP SDK
184 lines • 7.93 kB
JavaScript
// Copyright (c) 2025 Stable Technologies Inc
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
import { constMap, deepReadonly, zip } from "@stable-io/map-utils";
//TODO all the same for now - should we dedup?
export const contractEntries = [[
"Mainnet", [[
"Ethereum", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Avalanche", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Arbitrum", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Optimism", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Polygon", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Unichain", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Base", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Linea", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Sonic", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Codex", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
], [
"Worldchain", [
["messageTransmitter", "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"],
["tokenMessenger", "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"],
]
],
]
], [
"Testnet", [[
"Ethereum", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Avalanche", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Arbitrum", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Optimism", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Polygon", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Unichain", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Base", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Linea", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Sonic", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Codex", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
], [
"Worldchain", [
["messageTransmitter", "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"],
["tokenMessenger", "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"],
]
],
]
],
];
export const contractAddressOf = constMap(contractEntries);
export const supportedDomains = constMap(contractEntries, [0, 1]);
export const isSupportedDomain = (network) => (domain) => supportedDomains(network).includes(domain);
export const fastDomains = ["Avalanche"];
export const isFastDomain = (domain) => fastDomains.includes(domain);
// See https://developers.circle.com/stablecoins/required-block-confirmations
// TODO: review numbers and add slow transfer numbers
export const attestationTimeEstimates = {
Mainnet: {
Ethereum: 13.25,
Avalanche: 100, // v2 is not used in avalanche.
Arbitrum: 4.71,
Base: 4.99,
Linea: 1.85, // TODO
Optimism: 3.29,
Unichain: 3.75,
Polygon: 31.59,
Worldchain: 2.22,
Sonic: 3.32,
Codex: 10, // TODO
Sei: 10, // TODO
},
Testnet: {
Ethereum: 16.76,
Avalanche: 8.19,
Arbitrum: 3.18,
Base: 1.43,
Linea: 8, // TODO
Optimism: 0.85,
Unichain: 8, // TODO
Polygon: 9.04,
},
};
export const finalityThresholdEntries = [
[500, "TokenMessengerMin"],
[1000, "Confirmed"],
[2000, "Finalized"],
];
const [finalityThresholdVals, finalityThresholdNames] = deepReadonly(zip(finalityThresholdEntries));
//return the name of the finality threshold which is >= the given threshold
// i.e. 500 -> "TokenMessengerMin", 501 -> "Confirmed", 1001+ -> "Finalized"
export const finalityThresholdNameOf = (finalityThreshold) => {
for (let i = finalityThresholdEntries.length - 2; i >= 0; --i)
if (finalityThreshold > finalityThresholdEntries[i][0])
return finalityThresholdNames[i + 1];
return finalityThresholdNames[0];
};
export const init = (network) => ({
contractAddressOf: contractAddressOf.subMap(network),
supportedDomains,
isSupportedDomain: isSupportedDomain(network),
fastDomains,
isFastDomain,
attestationTimeEstimates: attestationTimeEstimates[network],
finalityThresholdEntries,
finalityThresholdVals,
finalityThresholdNames,
finalityThresholdNameOf,
});
//# sourceMappingURL=constants.js.map