secret-polar-reworks
Version:
Polar is a development environment to compile, deploy, test, run scrt contracts on different networks.
467 lines (466 loc) • 24.7 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Contract = void 0;
var chalk_1 = __importDefault(require("chalk"));
var fs_extra_1 = __importDefault(require("fs-extra"));
var path_1 = __importDefault(require("path"));
var context_1 = require("../../internal/context");
var errors_1 = require("../../internal/core/errors");
var errors_list_1 = require("../../internal/core/errors-list");
var project_structure_1 = require("../../internal/core/project-structure");
var strings_1 = require("../../internal/util/strings");
var compress_1 = require("../../lib/deploy/compress");
var checkpoints_1 = require("../checkpoints");
var client_1 = require("../client");
var abi_1 = require("./abi");
function checkCallArgs(args, argNames, msgName) {
var e_1, _a, e_2, _b;
var validArgs = [];
try {
for (var argNames_1 = __values(argNames), argNames_1_1 = argNames_1.next(); !argNames_1_1.done; argNames_1_1 = argNames_1.next()) {
var argName = argNames_1_1.value;
validArgs.push(argName.name);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (argNames_1_1 && !argNames_1_1.done && (_a = argNames_1.return)) _a.call(argNames_1);
}
finally { if (e_1) throw e_1.error; }
}
if (args !== undefined) {
var argKeys = Object.keys(args);
try {
// argKeys should be a subset of validArgs
for (var argKeys_1 = __values(argKeys), argKeys_1_1 = argKeys_1.next(); !argKeys_1_1.done; argKeys_1_1 = argKeys_1.next()) {
var key = argKeys_1_1.value;
if (!(validArgs.includes(key))) {
console.error("Invalid " + msgName + " call. Argument '" + key + "' not an argument of '" + msgName + "' method");
return false;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (argKeys_1_1 && !argKeys_1_1.done && (_b = argKeys_1.return)) _b.call(argKeys_1);
}
finally { if (e_2) throw e_2.error; }
}
}
return true;
}
function buildCall(contract, msgName, argNames) {
return function (args) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!checkCallArgs(args, argNames, msgName)) {
return [2 /*return*/];
}
return [4 /*yield*/, contract.queryMsg(msgName, args !== undefined ? args : {})];
case 1:
// Query function
return [2 /*return*/, _a.sent()];
}
});
});
};
}
function buildSend(contract, msgName, argNames) {
return function (_a, args) {
var account = _a.account, transferAmount = _a.transferAmount, customFees = _a.customFees;
return __awaiter(this, void 0, void 0, function () {
var accountVal;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (transferAmount === []) {
transferAmount = undefined;
}
if (!checkCallArgs(args, argNames, msgName)) {
return [2 /*return*/];
}
accountVal = account.account !== undefined
? account.account : account;
return [4 /*yield*/, contract.executeMsg(msgName, args !== undefined ? args : {}, accountVal, transferAmount, customFees)];
case 1:
// Execute function (write)
return [2 /*return*/, _b.sent()];
}
});
});
};
}
var Contract = /** @class */ (function () {
function Contract(contractName, instance) {
var e_3, _a, e_4, _b;
var _c, _d, _e;
this.responsePaths = [];
this.responseAbis = [];
this.env = context_1.PolarContext.getPolarContext().getRuntimeEnv();
this.contractName = strings_1.replaceAll(contractName, '-', '_');
this.codeId = 0;
this.contractCodeHash = "mock_hash";
this.contractAddress = "mock_address";
this.contractPath = path_1.default.join(project_structure_1.ARTIFACTS_DIR, "contracts", this.contractName + "_compressed.wasm");
this.initSchemaPath = path_1.default.join(project_structure_1.SCHEMA_DIR, this.contractName, "init_msg.json");
this.querySchemaPath = path_1.default.join(project_structure_1.SCHEMA_DIR, this.contractName, "query_msg.json");
this.executeSchemaPath = path_1.default.join(project_structure_1.SCHEMA_DIR, this.contractName, "handle_msg.json");
try {
for (var _f = __values(fs_extra_1.default.readdirSync(path_1.default.join(project_structure_1.SCHEMA_DIR, this.contractName))), _g = _f.next(); !_g.done; _g = _f.next()) {
var file = _g.value;
if (file.split('.')[0].split('_')[1] !== "response") { // *_response.json
continue;
}
this.responsePaths.push(path_1.default.join(project_structure_1.SCHEMA_DIR, this.contractName, file));
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
}
finally { if (e_3) throw e_3.error; }
}
if (!fs_extra_1.default.existsSync(this.initSchemaPath)) {
console.log("Warning: Init schema not found for contract ", chalk_1.default.cyan(contractName));
}
if (!fs_extra_1.default.existsSync(this.querySchemaPath)) {
console.log("Warning: Query schema not found for contract ", chalk_1.default.cyan(contractName));
}
if (!fs_extra_1.default.existsSync(this.executeSchemaPath)) {
console.log("Warning: Execute schema not found for contract ", chalk_1.default.cyan(contractName));
}
var initSchemaJson = fs_extra_1.default.readJsonSync(this.initSchemaPath);
var querySchemaJson = fs_extra_1.default.readJsonSync(this.querySchemaPath);
var executeSchemaJson = fs_extra_1.default.readJsonSync(this.executeSchemaPath);
this.initAbi = new abi_1.Abi(initSchemaJson);
this.queryAbi = new abi_1.Abi(querySchemaJson);
this.executeAbi = new abi_1.Abi(executeSchemaJson);
try {
for (var _h = __values(this.responsePaths), _j = _h.next(); !_j.done; _j = _h.next()) {
var file = _j.value;
var responseSchemaJson = fs_extra_1.default.readJSONSync(file);
var responseAbi = new abi_1.Abi(responseSchemaJson);
this.responseAbis.push(responseAbi);
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
}
finally { if (e_4) throw e_4.error; }
}
this.query = {};
this.tx = {};
this.responses = {};
// Load checkpoints
this.checkpointPath = path_1.default.join(project_structure_1.ARTIFACTS_DIR, "checkpoints", this.contractName + (instance !== null && instance !== void 0 ? instance : "") + ".yaml");
// For multiple instances
var mainContract = path_1.default.join(project_structure_1.ARTIFACTS_DIR, "checkpoints", this.contractName + ".yaml");
if (fs_extra_1.default.existsSync(mainContract)) {
var data = checkpoints_1.loadCheckpoint(mainContract);
delete data[this.env.network.name].instantiateInfo;
checkpoints_1.persistCheckpoint(this.checkpointPath, data);
}
// file exist load it else create new checkpoint
// skip checkpoints if test command is run, or skip-checkpoints is passed
if (fs_extra_1.default.existsSync(this.checkpointPath) &&
this.env.runtimeArgs.useCheckpoints === true) {
this.checkpointData = checkpoints_1.loadCheckpoint(this.checkpointPath);
var contractHash = (_c = this.checkpointData[this.env.network.name].deployInfo) === null || _c === void 0 ? void 0 : _c.contractCodeHash;
var contractCodeId = (_d = this.checkpointData[this.env.network.name].deployInfo) === null || _d === void 0 ? void 0 : _d.codeId;
var contractAddr = (_e = this.checkpointData[this.env.network.name].instantiateInfo) === null || _e === void 0 ? void 0 : _e.contractAddress;
this.contractCodeHash = contractHash !== null && contractHash !== void 0 ? contractHash : "mock_hash";
this.codeId = contractCodeId !== null && contractCodeId !== void 0 ? contractCodeId : 0;
this.contractAddress = contractAddr !== null && contractAddr !== void 0 ? contractAddr : "mock_address";
}
else {
this.checkpointData = {};
}
this.client = client_1.getClient(this.env.network);
}
Contract.prototype.parseSchema = function () {
return __awaiter(this, void 0, void 0, function () {
var _a, _b, message, msgName, args, _c, _d, message, msgName, args;
var e_5, _e, e_6, _f;
return __generator(this, function (_g) {
switch (_g.label) {
case 0:
if (!fs_extra_1.default.existsSync(this.querySchemaPath)) {
throw new errors_1.PolarError(errors_list_1.ERRORS.ARTIFACTS.QUERY_SCHEMA_NOT_FOUND, {
param: this.contractName
});
}
if (!fs_extra_1.default.existsSync(this.executeSchemaPath)) {
throw new errors_1.PolarError(errors_list_1.ERRORS.ARTIFACTS.EXEC_SCHEMA_NOT_FOUND, {
param: this.contractName
});
}
return [4 /*yield*/, this.queryAbi.parseSchema()];
case 1:
_g.sent();
return [4 /*yield*/, this.executeAbi.parseSchema()];
case 2:
_g.sent();
try {
for (_a = __values(this.queryAbi.messages), _b = _a.next(); !_b.done; _b = _a.next()) {
message = _b.value;
msgName = message.identifier;
args = message.args;
if (this.query[msgName] == null) {
this.query[msgName] = buildCall(this, msgName, args);
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
}
finally { if (e_5) throw e_5.error; }
}
try {
for (_c = __values(this.executeAbi.messages), _d = _c.next(); !_d.done; _d = _c.next()) {
message = _d.value;
msgName = message.identifier;
args = message.args;
if (this.tx[msgName] == null) {
this.tx[msgName] = buildSend(this, msgName, args);
}
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (_d && !_d.done && (_f = _c.return)) _f.call(_c);
}
finally { if (e_6) throw e_6.error; }
}
return [2 /*return*/];
}
});
});
};
Contract.prototype.deploy = function (account, customFees) {
var _a;
return __awaiter(this, void 0, void 0, function () {
var accountVal, info, wasmFileContent, signingClient, uploadReceipt, codeId, contractCodeHash, deployInfo;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
accountVal = account.account !== undefined
? account.account : account;
info = (_a = this.checkpointData[this.env.network.name]) === null || _a === void 0 ? void 0 : _a.deployInfo;
if (info) {
console.log("Warning: contract already deployed, using checkpoints");
return [2 /*return*/, info];
}
return [4 /*yield*/, compress_1.compress(this.contractName)];
case 1:
_b.sent();
wasmFileContent = fs_extra_1.default.readFileSync(this.contractPath);
return [4 /*yield*/, client_1.getSigningClient(this.env.network, accountVal)];
case 2:
signingClient = _b.sent();
return [4 /*yield*/, signingClient.upload(wasmFileContent, {}, "upload " + this.contractName, customFees)];
case 3:
uploadReceipt = _b.sent();
codeId = uploadReceipt.codeId;
return [4 /*yield*/, signingClient.restClient.getCodeHashByCodeId(codeId)];
case 4:
contractCodeHash = _b.sent();
this.codeId = codeId;
deployInfo = {
codeId: codeId,
contractCodeHash: contractCodeHash,
deployTimestamp: String(new Date())
};
if (this.env.runtimeArgs.useCheckpoints === true) {
this.checkpointData[this.env.network.name] = __assign(__assign({}, this.checkpointData[this.env.network.name]), { deployInfo: deployInfo });
checkpoints_1.persistCheckpoint(this.checkpointPath, this.checkpointData);
}
this.contractCodeHash = contractCodeHash;
return [2 /*return*/, deployInfo];
}
});
});
};
Contract.prototype.instantiatedWithAddress = function (address, timestamp) {
var initTimestamp = (timestamp !== undefined) ? String(timestamp) : String(new Date());
// contract address already exists
if (this.contractAddress !== "mock_address") {
console.log("Contract " + this.contractName + " already has address: " + this.contractAddress + ", skipping");
return;
}
else {
this.contractAddress = address;
}
var instantiateInfo = {
contractAddress: address,
instantiateTimestamp: initTimestamp
};
// set init data (contract address, init timestamp) in checkpoints
this.checkpointData[this.env.network.name] = __assign(__assign({}, this.checkpointData[this.env.network.name]), { instantiateInfo: instantiateInfo });
checkpoints_1.persistCheckpoint(this.checkpointPath, this.checkpointData);
};
Contract.prototype.instantiate = function (initArgs, label, account, transferAmount, customFees) {
var _a;
return __awaiter(this, void 0, void 0, function () {
var accountVal, info, signingClient, initTimestamp, contract, instantiateInfo;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
accountVal = account.account !== undefined
? account.account : account;
if (this.contractCodeHash === "mock_hash") {
throw new errors_1.PolarError(errors_list_1.ERRORS.GENERAL.CONTRACT_NOT_DEPLOYED, {
param: this.contractName
});
}
info = (_a = this.checkpointData[this.env.network.name]) === null || _a === void 0 ? void 0 : _a.instantiateInfo;
if (info) {
console.log("Warning: contract already instantiated, using checkpoints");
return [2 /*return*/, info];
}
return [4 /*yield*/, client_1.getSigningClient(this.env.network, accountVal)];
case 1:
signingClient = _b.sent();
initTimestamp = String(new Date());
label = (this.env.runtimeArgs.command === "test")
? "deploy " + this.contractName + " " + initTimestamp : label;
console.log("Instantiating with label: " + label);
return [4 /*yield*/, signingClient.instantiate(this.codeId, initArgs, label, "init " + this.contractName, transferAmount, customFees)];
case 2:
contract = _b.sent();
this.contractAddress = contract.contractAddress;
instantiateInfo = {
contractAddress: this.contractAddress,
instantiateTimestamp: initTimestamp
};
if (this.env.runtimeArgs.useCheckpoints === true) {
this.checkpointData[this.env.network.name] = __assign(__assign({}, this.checkpointData[this.env.network.name]), { instantiateInfo: instantiateInfo });
checkpoints_1.persistCheckpoint(this.checkpointPath, this.checkpointData);
}
return [2 /*return*/, instantiateInfo];
}
});
});
};
Contract.prototype.queryMsg = function (methodName, callArgs) {
return __awaiter(this, void 0, void 0, function () {
var msgData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.contractAddress === "mock_address") {
throw new errors_1.PolarError(errors_list_1.ERRORS.GENERAL.CONTRACT_NOT_INSTANTIATED, {
param: this.contractName
});
}
// Query the contract
console.log('Querying contract for', methodName);
msgData = {};
msgData[methodName] = callArgs;
console.log(this.contractAddress, msgData);
return [4 /*yield*/, this.client.queryContractSmart(this.contractAddress, msgData)];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
Contract.prototype.executeMsg = function (methodName, callArgs, account, transferAmount, customFees) {
return __awaiter(this, void 0, void 0, function () {
var accountVal, signingClient, msgData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
accountVal = account.account !== undefined
? account.account : account;
if (this.contractAddress === "mock_address") {
throw new errors_1.PolarError(errors_list_1.ERRORS.GENERAL.CONTRACT_NOT_INSTANTIATED, {
param: this.contractName
});
}
return [4 /*yield*/, client_1.getSigningClient(this.env.network, accountVal)];
case 1:
signingClient = _a.sent();
msgData = {};
msgData[methodName] = callArgs;
console.log(this.contractAddress, msgData);
return [4 /*yield*/, signingClient.execute(this.contractAddress, msgData, "execute handle " + this.contractName, transferAmount, customFees)];
case 2:
// Send the same handleMsg to increment multiple times
return [2 /*return*/, _a.sent()];
}
});
});
};
return Contract;
}());
exports.Contract = Contract;