UNPKG

locklift

Version:

Node JS framework for working with Ever contracts. Inspired by Truffle and Hardhat. Helps you to build, test, run and maintain your smart contracts.

246 lines (245 loc) 10.8 kB
"use strict"; 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Locklift = exports.ConfigState = exports.lockliftChai = exports.InteractionType = exports.TraceType = exports.WalletTypes = exports.convertAmount = exports.getRandomNonce = exports.fromNano = exports.toNano = exports.zeroAddress = exports.Dimension = void 0; const everscale_inpage_provider_1 = require("everscale-inpage-provider"); const nodejs_1 = require("everscale-standalone-client/nodejs"); const chalk_1 = __importDefault(require("chalk")); const keys_1 = require("./internal/keys"); const utils = __importStar(require("./utils")); const utils_1 = require("./utils"); const factory_1 = require("./internal/factory"); const tracing_1 = require("./internal/tracing"); const timeMovement_1 = require("./internal/timeMovement"); const lockliftContext_1 = require("./internal/context/lockliftContext"); require("./chaiPlugin/types"); const utils_2 = require("./plugins/utils"); const utils_3 = require("./internal/giver/utils"); const giver_1 = require("./internal/giver"); const logger_1 = require("./internal/logger"); const transport_1 = require("./internal/tracing/transport"); const locklift_network_1 = require("@broxus/locklift-network"); const network_1 = require("./internal/network"); const forkService_1 = require("./internal/network/forkService"); __exportStar(require("everscale-inpage-provider"), exports); var constants_1 = require("./constants"); Object.defineProperty(exports, "Dimension", { enumerable: true, get: function () { return constants_1.Dimension; } }); Object.defineProperty(exports, "zeroAddress", { enumerable: true, get: function () { return constants_1.zeroAddress; } }); var utils_4 = require("./utils"); Object.defineProperty(exports, "toNano", { enumerable: true, get: function () { return utils_4.toNano; } }); Object.defineProperty(exports, "fromNano", { enumerable: true, get: function () { return utils_4.fromNano; } }); Object.defineProperty(exports, "getRandomNonce", { enumerable: true, get: function () { return utils_4.getRandomNonce; } }); Object.defineProperty(exports, "convertAmount", { enumerable: true, get: function () { return utils_4.convertAmount; } }); var types_1 = require("./types"); Object.defineProperty(exports, "WalletTypes", { enumerable: true, get: function () { return types_1.WalletTypes; } }); var types_2 = require("./internal/tracing/types"); Object.defineProperty(exports, "TraceType", { enumerable: true, get: function () { return types_2.TraceType; } }); Object.defineProperty(exports, "InteractionType", { enumerable: true, get: function () { return types_2.InteractionType; } }); var chaiPlugin_1 = require("./chaiPlugin"); Object.defineProperty(exports, "lockliftChai", { enumerable: true, get: function () { return chaiPlugin_1.lockliftChai; } }); var config_1 = require("./internal/config"); Object.defineProperty(exports, "ConfigState", { enumerable: true, get: function () { return config_1.ConfigState; } }); class Locklift { provider; keystore; clock; transactions; utils = utils; #giver; #factory; #context; #testing; #tracing; #network; constructor(provider, keystore, clock, transactions) { this.provider = provider; this.keystore = keystore; this.clock = clock; this.transactions = transactions; } set tracing(tracing) { this.#tracing = tracing; } get tracing() { if (!this.#tracing) { throw new Error("Testing module not provided"); } return this.#tracing; } set testing(testing) { this.#testing = testing; } get testing() { if (!this.#testing) { throw new Error("Testing module not provided"); } return this.#testing; } set context(context) { this.#context = context; } get context() { if (!this.#context) { throw new Error("Context not provided, need to provide the network name"); } return this.#context; } set factory(factory) { this.#factory = factory; } get factory() { if (!this.#factory) { throw new Error("Factory didn't provided"); } return this.#factory; } set network(network) { this.#network = network; } get network() { if (!this.#network) { throw new Error("Network didn't provided"); } return this.#network; } set giver(giver) { this.#giver = giver; } get giver() { if (!this.#giver) { throw new Error("Giver not initialized, need to provide the network name"); } return this.#giver; } static async setup(config, network) { if (network && !config.networks[network]) { throw new Error(`Network ${network} not found in config`); } const networkConfig = config.networks[network]; let keystore = new nodejs_1.SimpleKeystore(); if (networkConfig) { const giverKeys = (0, utils_3.getGiverKeyPair)(networkConfig.giver); const keys = await keys_1.Keys.generate(networkConfig.keys); keystore = new nodejs_1.SimpleKeystore([...keys].reduce((acc, keyPair, idx) => ({ ...acc, [idx]: keyPair, }), {})); keystore.addKeyPair("giver", giverKeys); } const forkService = networkConfig?.fork && (await forkService_1.ForkService.init({ forkSource: networkConfig.fork.source, forkContractsConfig: networkConfig.fork.contracts, })); const proxyNetwork = new locklift_network_1.LockliftNetwork({ accountFetcher: networkConfig?.fork && forkService?.accountFetcher, networkConfig: networkConfig?.blockchainConfig, }); await proxyNetwork.initialize(); if (!!networkConfig && isProxyConnection(networkConfig?.connection) && networkConfig?.connection?.data?.connectionFactory === undefined) { networkConfig.connection.data.connectionFactory = proxyNetwork.connectionFactory; } const accountsStorage = new nodejs_1.SimpleAccountsStorage(); const clock = new nodejs_1.Clock(); const provider = new everscale_inpage_provider_1.ProviderRpcClient({ provider: nodejs_1.EverscaleStandaloneClient.create({ connection: networkConfig?.connection, keystore, clock, accountsStorage, message: networkConfig?.clientConfig?.message, initInput: networkConfig?.clientConfig?.initInput, }).then((client) => { if (isProxyConnection(networkConfig?.connection)) { client.setPollingInterval(5); } return client; }), }); try { await provider.ensureInitialized(); } catch (e) { logger_1.logger.printError(`${chalk_1.default.bold(`${e.message}`)}`); process.exit(1); } const transactions = new utils_1.Transactions(provider); const locklift = new Locklift(provider, keystore, clock, transactions); const giver = networkConfig && (await (0, giver_1.getGiver)(networkConfig.giver, provider, accountsStorage)); if (giver) { locklift.giver = giver; } const factory = await factory_1.Factory.setup(provider, () => locklift.giver, accountsStorage, forkService?.preFetchedAccounts); locklift.factory = factory; const tracingTransport = (() => { switch (networkConfig?.connection.type) { case "graphql": return transport_1.TracingTransport.fromGqlConnection(networkConfig.connection.data.endpoints[0], provider); case "jrpc": return transport_1.TracingTransport.fromJrpcConnection(provider); case "proxy": return transport_1.TracingTransport.fromProxyConnection(provider); } })(); locklift.network = new network_1.Network(proxyNetwork, (await keystore.getSigner("0")), accountsStorage, provider); locklift.tracing = (0, tracing_1.createTracing)({ ever: provider, features: transactions, network: proxyNetwork, factory, tracingTransport, }); if (networkConfig && network) { const timeMovement = await (0, timeMovement_1.createTimeMovement)(clock, networkConfig); const context = new lockliftContext_1.LockliftContext({ config: networkConfig, name: network }); locklift.testing = timeMovement; locklift.context = context; } await (0, utils_2.initializeExtenders)({ locklift, config, network }); return locklift; } } exports.Locklift = Locklift; const isProxyConnection = (connectionData) => { return connectionData?.type === "proxy"; };