@xlink-network/xlink-sdk
Version:
188 lines (186 loc) • 6.63 kB
JavaScript
import {
BridgeConfigAbi
} from "./chunk-NZDFZ5GI.mjs";
import {
EVMEndpointContract,
evmContractAddresses
} from "./chunk-RHGELTWO.mjs";
import {
KnownChainId,
KnownTokenId,
_allKnownEVMTokens
} from "./chunk-GZDQGY7B.mjs";
import {
BigNumber
} from "./chunk-KHTJNOQE.mjs";
// src/evmUtils/xlinkContractHelpers.ts
import { isAddress, zeroAddress } from "viem";
import { readContract } from "viem/actions";
var CONTRACT_COMMON_NUMBER_SCALE = 18;
var numberFromSolidityContractNumber = (num, decimals) => {
return BigNumber.leftMoveDecimals(
decimals ?? CONTRACT_COMMON_NUMBER_SCALE,
num
);
};
var numberToSolidityContractNumber = (num, decimals) => {
return BigNumber.toBigInt(
{},
BigNumber.rightMoveDecimals(decimals ?? CONTRACT_COMMON_NUMBER_SCALE, num)
);
};
async function getEVMContractCallInfo(sdkContext, chainId) {
const addresses = await getAllAddresses(sdkContext, chainId);
if (addresses == null) return;
const bridgeEndpointContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.BridgeEndpoint] ?? addresses.localAddresses[EVMEndpointContract.BridgeEndpoint];
if (bridgeEndpointContractAddress == null) return;
const nativeBridgeEndpointContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.NativeBridgeEndpoint] ?? addresses.localAddresses[EVMEndpointContract.NativeBridgeEndpoint];
const registryContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.Registry] ?? addresses.localAddresses[EVMEndpointContract.Registry];
const timeLockContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.TimeLock] ?? addresses.localAddresses[EVMEndpointContract.TimeLock];
return {
client: addresses.client,
bridgeEndpointContractAddress,
nativeBridgeEndpointContractAddress,
registryContractAddress,
timeLockContractAddress
};
}
async function getEVMTokenContractInfo(sdkContext, chainId, tokenId) {
const addresses = await getAllAddresses(sdkContext, chainId);
if (addresses == null) return;
const tokenContractAddress = addresses.onChainAddresses?.[tokenId] ?? addresses.localAddresses[tokenId];
if (tokenContractAddress == null) return;
return {
client: addresses.client,
tokenContractAddress
};
}
async function getEVMToken(sdkContext, chain, tokenAddress) {
const addresses = await getAllAddresses(sdkContext, chain);
if (addresses == null) return;
tokenAddress = tokenAddress.toLowerCase();
return Object.values(_allKnownEVMTokens).find(
(token) => (addresses.onChainAddresses?.[token] ?? addresses.localAddresses?.[token])?.toLowerCase() === tokenAddress
);
}
async function getAllAddresses(sdkContext, chainId) {
const client = sdkContext.evm.viemClients[chainId];
const localAddresses = evmContractAddresses[chainId];
const configContractAddress = localAddresses[EVMEndpointContract.BridgeConfig];
if (client == null) return;
let onChainAddresses;
if (configContractAddress != null) {
onChainAddresses = await getOnChainConfigs(
sdkContext,
chainId,
configContractAddress
);
}
return {
client,
onChainAddresses,
localAddresses
};
}
var getOnChainConfigs = async (sdkContext, chain, configContractAddress) => {
const cache = sdkContext.evm.onChainConfigCache;
const cacheKey = `${chain}:${configContractAddress}`;
if (cache != null) {
const cachedPromise = cache.get(cacheKey);
if (cachedPromise != null) return cachedPromise;
}
const client = sdkContext.evm.viemClients[chain];
if (client == null) return;
const promise = _getOnChainConfigsImpl(
client,
chain,
configContractAddress
).catch((err) => {
queueMicrotask(() => {
if (cache != null && promise === cache.get(cacheKey)) {
cache.delete(cacheKey);
}
});
throw err;
});
if (cache != null) {
cache.set(cacheKey, promise);
}
return promise;
};
var _getOnChainConfigsImpl = async (client, chain, configContractAddress) => {
const configs = await readContract(client, {
abi: BridgeConfigAbi,
address: configContractAddress,
functionName: "getConfigs",
args: [
[
"ENDPOINT" /* ENDPOINT */,
"REGISTRY" /* REGISTRY */,
"TIMELOCK" /* TIMELOCK */,
"TOKEN_ABTC" /* TOKEN_ABTC */,
"TOKEN_ALEX" /* TOKEN_ALEX */,
"TOKEN_ATALEX" /* TOKEN_ATALEX */,
"TOKEN_LISTX" /* TOKEN_LISTX */,
"TOKEN_USDT" /* TOKEN_USDT */,
"TOKEN_BTC" /* TOKEN_BTC */,
"TOKEN_LUNR" /* TOKEN_LUNR */,
"TOKEN_SKO" /* TOKEN_SKO */,
"TOKEN_SUSDT" /* TOKEN_SUSDT */,
"TOKEN_UBTC" /* TOKEN_UBTC */,
"TOKEN_WUBTC" /* TOKEN_WUBTC */,
"TOKEN_DB20" /* TOKEN_DB20 */,
"TOKEN_DOG" /* TOKEN_DOG */,
"ENDPOINT_NATIVE" /* ENDPOINT_NATIVE */
]
]
}).catch((err) => {
console.groupCollapsed(
`Failed to read on-chain configs from ${configContractAddress} (${chain})`
);
console.debug(err);
console.groupEnd();
return null;
});
if (configs == null) {
return {};
}
const EVMToken = KnownTokenId.EVM;
return {
[EVMEndpointContract.BridgeEndpoint]: maybeAddress(configs[0]),
[EVMEndpointContract.Registry]: maybeAddress(configs[1]),
[EVMEndpointContract.TimeLock]: maybeAddress(configs[2]),
[EVMToken.aBTC]: maybeAddress(configs[3]),
[EVMToken.ALEX]: maybeAddress(configs[4]),
[EVMToken.vLiALEX]: maybeAddress(configs[5]),
[EVMToken.vLiSTX]: maybeAddress(configs[6]),
// prettier-ignore
[chain === KnownChainId.EVM.Base ? EVMToken.USDC : EVMToken.USDT]: maybeAddress(configs[7]),
// prettier-ignore
[chain === KnownChainId.EVM.BSC ? EVMToken.BTCB : chain === KnownChainId.EVM.Base ? EVMToken.cbBTC : EVMToken.WBTC]: maybeAddress(configs[8]),
[EVMToken.LUNR]: maybeAddress(configs[9]),
[EVMToken.SKO]: maybeAddress(configs[10]),
[EVMToken.sUSDT]: maybeAddress(configs[11]),
[EVMToken.uBTC]: maybeAddress(configs[12]),
[EVMToken.wuBTC]: maybeAddress(configs[13]),
[EVMToken.DB20]: maybeAddress(configs[14]),
[EVMToken.DOG]: maybeAddress(configs[15]),
[EVMEndpointContract.NativeBridgeEndpoint]: maybeAddress(configs[16])
};
};
function maybeAddress(value) {
if (value == null) return void 0;
if (value === "") return void 0;
if (!isAddress(value)) return void 0;
if (value === zeroAddress) return void 0;
return value;
}
export {
numberFromSolidityContractNumber,
numberToSolidityContractNumber,
getEVMContractCallInfo,
getEVMTokenContractInfo,
getEVMToken,
getAllAddresses
};
//# sourceMappingURL=chunk-UJDCORME.mjs.map