@wormhole-foundation/sdk-sui-tokenbridge
Version:
SDK for Sui chains, used in conjunction with @wormhole-foundation/sdk
64 lines • 2.77 kB
JavaScript
import { getFieldsFromObjectResponse, getObjectFields, getPackageIdFromType, getTableKeyType, isMoveStructObject, isValidSuiType, trimSuiType, } from "@wormhole-foundation/sdk-sui";
export const getTokenFromTokenRegistry = async (provider, tokenBridgeStateObjectId, tokenType) => {
if (!isValidSuiType(tokenType)) {
throw new Error(`Invalid Sui type: ${tokenType}`);
}
const tokenBridgeStateFields = await getObjectFields(provider, tokenBridgeStateObjectId);
if (!tokenBridgeStateFields) {
throw new Error(`Unable to fetch object fields from token bridge state. Object ID: ${tokenBridgeStateObjectId}`);
}
const tokenRegistryObjectId = tokenBridgeStateFields["token_registry"].fields?.id?.id;
if (!tokenRegistryObjectId) {
throw new Error("Unable to fetch token registry object ID");
}
const tokenRegistryPackageId = getPackageIdFromType(tokenBridgeStateFields["token_registry"]?.type);
if (!tokenRegistryPackageId) {
throw new Error("Unable to fetch token registry package ID");
}
return provider.getDynamicFieldObject({
parentId: tokenRegistryObjectId,
name: {
type: `${tokenRegistryPackageId}::token_registry::Key<${tokenType}>`,
value: {
dummy_field: false,
},
},
});
};
export const getTokenCoinType = async (provider, tokenBridgeStateObjectId, tokenAddress, tokenChain) => {
const tokenBridgeStateFields = await getObjectFields(provider, tokenBridgeStateObjectId);
if (!tokenBridgeStateFields)
throw new Error("Unable to fetch object fields from token bridge state");
const coinTypes = tokenBridgeStateFields["token_registry"]?.fields?.coin_types;
const coinTypesObjectId = coinTypes?.fields?.id?.id;
if (!coinTypesObjectId) {
throw new Error("Unable to fetch coin types");
}
const keyType = getTableKeyType(coinTypes?.type);
if (!keyType) {
throw new Error("Unable to get key type");
}
const response = await provider.getDynamicFieldObject({
parentId: coinTypesObjectId,
name: {
type: keyType,
value: {
addr: [...tokenAddress],
chain: tokenChain,
},
},
});
if (response.error) {
if (response.error.code === "dynamicFieldNotFound") {
return null;
}
throw new Error(`Unexpected getDynamicFieldObject response ${response.error}`);
}
const fields = getFieldsFromObjectResponse(response);
if (!fields)
return null;
if (!isMoveStructObject(fields))
throw new Error("What?");
return "value" in fields ? trimSuiType(fields["value"]) : null;
};
//# sourceMappingURL=utils.js.map