UNPKG

dp-contract-proxy-kit

Version:

Enable batched transactions and contract account interactions using a unique deterministic Gnosis Safe.

147 lines 7.72 kB
"use strict"; 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 __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _RocksideRelayTransactionManager_speed; Object.defineProperty(exports, "__esModule", { value: true }); exports.RocksideSpeed = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const transactionManagers_1 = require("../../config/transactionManagers"); const constants_1 = require("../../utils/constants"); const httpRequests_1 = require("../../utils/httpRequests"); const TransactionManager_1 = require("../TransactionManager"); const utils_1 = require("../utils"); var RocksideSpeed; (function (RocksideSpeed) { RocksideSpeed["Fast"] = "fast"; RocksideSpeed["Fastest"] = "fastest"; RocksideSpeed["Safelow"] = "safelow"; RocksideSpeed["Standard"] = "standard"; })(RocksideSpeed = exports.RocksideSpeed || (exports.RocksideSpeed = {})); class RocksideRelayTransactionManager { constructor({ speed }) { _RocksideRelayTransactionManager_speed.set(this, void 0); __classPrivateFieldSet(this, _RocksideRelayTransactionManager_speed, speed, "f"); } get config() { return { name: TransactionManager_1.TransactionManagerNames.RocksideTxRelayManager, speed: __classPrivateFieldGet(this, _RocksideRelayTransactionManager_speed, "f") }; } execTransactions({ ownerAccount, safeExecTxParams, contractManager, ethLibAdapter }) { return __awaiter(this, void 0, void 0, function* () { const { contract } = contractManager; if (!contract) { throw new Error('CPK Proxy contract uninitialized'); } let network; const networkId = yield ethLibAdapter.getNetworkId(); switch (networkId) { case 1: network = 'mainnet'; break; case 3: network = 'ropsten'; break; default: throw new Error('Network not supported when using Rockside transaction relay'); } const nonce = yield contract.call('nonce', []); const txRelayParams = yield this.getTxRelayParams(contract.address, network); const safeTransaction = { to: safeExecTxParams.to, value: safeExecTxParams.value, data: safeExecTxParams.data, operation: safeExecTxParams.operation, safeTxGas: 0, baseGas: 0, gasPrice: Number(txRelayParams.gas_price), gasToken: constants_1.zeroAddress, refundReceiver: txRelayParams.relayer, nonce }; const transactionHash = yield contract.call('getTransactionHash', [ safeTransaction.to, new bignumber_js_1.default(safeExecTxParams.value).toString(10), safeTransaction.data, safeTransaction.operation, safeTransaction.safeTxGas, safeTransaction.baseGas, safeTransaction.gasPrice, safeTransaction.gasToken, safeTransaction.refundReceiver, safeTransaction.nonce ]); const signatures = yield utils_1.getTransactionHashSignature(ethLibAdapter, ownerAccount, transactionHash); const data = contract.encode('execTransaction', [ safeTransaction.to, new bignumber_js_1.default(safeExecTxParams.value).toString(10), safeTransaction.data, safeTransaction.operation, safeTransaction.safeTxGas, safeTransaction.baseGas, safeTransaction.gasPrice, safeTransaction.gasToken, safeTransaction.refundReceiver, signatures ]); const trackingId = yield this.sendTxToRelay(contract.address, data, network); return this.followTransaction(network, trackingId, ethLibAdapter); }); } getTxRelayParams(safeAccount, network) { return __awaiter(this, void 0, void 0, function* () { const jsonResponse = yield httpRequests_1.sendRequest({ url: `${transactionManagers_1.rocksideTxRelayUrl}/ethereum/${network}/relay/${safeAccount}/params`, method: httpRequests_1.HttpMethod.GET, expectedHttpCodeResponse: 200 }); return jsonResponse.speeds[__classPrivateFieldGet(this, _RocksideRelayTransactionManager_speed, "f")]; }); } sendTxToRelay(safeAccount, data, network) { return __awaiter(this, void 0, void 0, function* () { const jsonResponse = yield httpRequests_1.sendRequest({ url: `${transactionManagers_1.rocksideTxRelayUrl}/ethereum/${network}/relay/${safeAccount}`, method: httpRequests_1.HttpMethod.POST, body: JSON.stringify({ data, speed: __classPrivateFieldGet(this, _RocksideRelayTransactionManager_speed, "f") }), expectedHttpCodeResponse: 200 }); return jsonResponse.tracking_id; }); } followTransaction(network, trackingId, ethLibAdapter) { return __awaiter(this, void 0, void 0, function* () { const jsonResponse = yield httpRequests_1.sendRequest({ url: `${transactionManagers_1.rocksideTxRelayUrl}/ethereum/${network}/transactions/${trackingId}`, method: httpRequests_1.HttpMethod.GET, expectedHttpCodeResponse: 200 }); return ethLibAdapter.toRocksideRelayTxResult(jsonResponse); }); } } _RocksideRelayTransactionManager_speed = new WeakMap(); exports.default = RocksideRelayTransactionManager; //# sourceMappingURL=index.js.map