chaingate
Version:
Multi-chain cryptocurrency SDK for TypeScript — unified API for Bitcoin, Ethereum, Litecoin, Dogecoin, Bitcoin Cash, Polygon, Arbitrum, and any EVM-compatible chain. Create wallets, query balances, send transactions, and manage tokens and NFTs across UTXO
86 lines (85 loc) • 3.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EvmRpcConnector = void 0;
const BaseEvmConnector_1 = require("../EvmConnector/BaseEvmConnector");
const decimal_js_1 = __importDefault(require("decimal.js"));
const EvmRpcTransaction_1 = require("./EvmRpcTransaction");
const abiEncode_1 = require("../../utils/abiEncode");
/**
* Connector for any EVM-compatible network via a direct JSON-RPC connection.
*
* Supported operations: `address()`, `addressBalance()`, `transfer()`,
* `transferToken()`, `transferNft()`, `transferErc1155()`, `callContract()`.
* For transaction history, token-balance discovery, and fiat conversion use
* {@link EvmConnector} instead.
*
* @example
* ```ts
* const cg = new ChainGate();
* const network = cg.networks.evmRpc({
* rpcUrl: 'https://bsc-dataseed.binance.org',
* chainId: 56,
* name: 'BNB Smart Chain',
* symbol: 'BNB',
* });
*
* const conn = cg.connect(network, wallet);
* const addr = await conn.address();
* const balance = await conn.addressBalance();
* const tx = await conn.transfer(network.amount('0.1'), '0x...');
* const broadcasted = await tx.signAndBroadcast();
* ```
*/
class EvmRpcConnector extends BaseEvmConnector_1.BaseEvmConnector {
/** @internal */
constructor(wallet, explorer, network) {
super(wallet, explorer, network);
}
createTransaction(params) {
return EvmRpcTransaction_1.EvmRpcTransaction.create({ explorer: this.explorer, ...params });
}
/**
* Returns the native coin balance for this wallet's address.
*
* The returned `Amount` uses the network's decimals and native token metadata.
* Fiat conversion is not supported here — use {@link EvmConnector} when needed.
*/
async addressBalance(options) {
const addr = await this.address(options);
const balanceWei = await this.explorer.getBalance(addr);
const balance = this.network.amountFromSmallestUnit(balanceWei);
return { address: addr, balance };
}
/**
* Creates an ERC-20 token transfer transaction.
*
* Token decimals are resolved automatically.
*
* @param contractAddress - Token contract address (with `0x` prefix).
* @param amount - Amount of tokens in human-readable units.
* @param toAddress - Recipient address.
*
* @throws {@link UnsupportedOperationError} if the wallet is view-only.
*/
async transferToken(contractAddress, amount, toAddress, options) {
const { index = 0, derivationPath } = options ?? {};
const [fromAddress, decimals] = await Promise.all([
this.address(options),
this.explorer.getTokenDecimals(contractAddress),
]);
const getPrivateKey = this.createPrivateKeyGetter(index, derivationPath);
const rawAmount = BigInt(new decimal_js_1.default(amount.toString()).mul(new decimal_js_1.default(10).pow(decimals)).toFixed(0));
const data = (0, abiEncode_1.encodeErc20Transfer)(toAddress, rawAmount);
return this.createTransaction({
fromAddress,
toAddress: contractAddress,
valueWei: 0n,
data,
getPrivateKey,
});
}
}
exports.EvmRpcConnector = EvmRpcConnector;