@wormhole-foundation/sdk-evm
Version:
SDK for EVM chains, used in conjunction with @wormhole-foundation/sdk
146 lines • 6.37 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EvmPlatform = void 0;
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
const ethers_1 = require("ethers");
const ethers_contracts = __importStar(require("./ethers-contracts/index.js"));
const address_js_1 = require("./address.js");
const chain_js_1 = require("./chain.js");
const types_js_1 = require("./types.js");
/**
* @category EVM
*/
class EvmPlatform extends sdk_connect_1.PlatformContext {
static _platform = types_js_1._platform;
_providers = {};
constructor(network, _config) {
super(network, _config ?? (0, sdk_connect_1.networkPlatformConfigs)(network, EvmPlatform._platform));
}
getRpc(chain) {
const cachedProvider = this._providers[chain];
if (cachedProvider) {
return cachedProvider;
}
if (chain in this.config && this.config[chain].rpc) {
const provider = new ethers_1.JsonRpcProvider(this.config[chain].rpc, sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(this.network, chain), {
staticNetwork: true,
});
this._providers[chain] = provider;
return provider;
}
else {
throw new Error('No configuration available for chain: ' + chain);
}
}
getChain(chain, rpc) {
if (chain in this.config)
return new chain_js_1.EvmChain(chain, this, rpc);
throw new Error('No configuration available for chain: ' + chain);
}
static nativeTokenId(network, chain) {
if (!EvmPlatform.isSupportedChain(chain))
throw new Error(`invalid chain for EVM: ${chain}`);
return sdk_connect_1.Wormhole.tokenId(chain, address_js_1.EvmZeroAddress);
}
static isNativeTokenId(network, chain, tokenId) {
if (!EvmPlatform.isSupportedChain(chain))
return false;
if (tokenId.chain !== chain)
return false;
return tokenId.address.toString() === address_js_1.EvmZeroAddress;
}
static isSupportedChain(chain) {
const platform = (0, sdk_connect_1.chainToPlatform)(chain);
return platform === EvmPlatform._platform;
}
static async getDecimals(chain, rpc, token) {
if ((0, sdk_connect_1.isNative)(token))
return sdk_connect_1.decimals.nativeDecimals(EvmPlatform._platform);
const tokenContract = EvmPlatform.getTokenImplementation(rpc, new address_js_1.EvmAddress(token).toString());
return Number(await tokenContract.decimals());
}
static async getBalance(chain, rpc, walletAddr, token) {
if ((0, sdk_connect_1.isNative)(token))
return rpc.getBalance(walletAddr);
const tokenImpl = EvmPlatform.getTokenImplementation(rpc, new address_js_1.EvmAddress(token).toString());
return tokenImpl.balanceOf(walletAddr);
}
static async getBalances(chain, rpc, walletAddr, tokens) {
const balancesArr = await Promise.all(tokens.map(async (token) => {
const balance = await this.getBalance(chain, rpc, walletAddr, token);
const address = (0, sdk_connect_1.isNative)(token)
? 'native'
: new address_js_1.EvmAddress(token).toString();
return { [address]: balance };
}));
return balancesArr.reduce((obj, item) => Object.assign(obj, item), {});
}
static async sendWait(chain, rpc, stxns) {
const txhashes = [];
for (const stxn of stxns) {
const txRes = await rpc.broadcastTransaction(stxn);
txhashes.push(txRes.hash);
if (chain === 'Celo') {
console.error('TODO: override celo block fetching');
continue;
}
// Wait for confirmation
const txReceipt = await txRes.wait();
if (txReceipt === null)
throw new Error('Received null TxReceipt');
}
return txhashes;
}
static async getLatestBlock(rpc) {
return await rpc.getBlockNumber();
}
static async getLatestFinalizedBlock(rpc) {
const block = await rpc.getBlock('finalized');
if (!block)
throw new Error('Could not get finalized block');
return block?.number;
}
// Look up the Wormhole Canonical Network and Chain from the EVM chainId
static chainFromChainId(eip155ChainId) {
const networkChainPair = sdk_connect_1.nativeChainIds.platformNativeChainIdToNetworkChain(EvmPlatform._platform, BigInt(eip155ChainId));
if (networkChainPair === undefined)
throw new Error(`Unknown EVM chainId ${eip155ChainId}`);
const [network, chain] = networkChainPair;
return [network, chain];
}
static async chainFromRpc(rpc) {
const { chainId } = await rpc.getNetwork();
return EvmPlatform.chainFromChainId(sdk_connect_1.encoding.bignum.encode(chainId, true));
}
static getTokenImplementation(connection, address) {
const ti = ethers_contracts.TokenImplementation__factory.connect(address, connection);
if (!ti)
throw new Error(`No token implementation available for: ${address}`);
return ti;
}
}
exports.EvmPlatform = EvmPlatform;
//# sourceMappingURL=platform.js.map
;