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
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 () {
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";
};