dxdao-contract-proxy-kit
Version:
Enable batched transactions and contract account interactions using a unique deterministic Gnosis Safe.
149 lines • 6.96 kB
JavaScript
;
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, privateMap, value) {
if (!privateMap.has(receiver)) {
throw new TypeError("attempted to set private field on non-instance");
}
privateMap.set(receiver, value);
return value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
if (!privateMap.has(receiver)) {
throw new TypeError("attempted to get private field on non-instance");
}
return privateMap.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _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 }) {
_speed.set(this, void 0);
__classPrivateFieldSet(this, _speed, speed);
}
get config() {
return {
name: TransactionManager_1.TransactionManagerNames.RocksideTxRelayManager,
speed: __classPrivateFieldGet(this, _speed)
};
}
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, _speed)];
});
}
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, _speed) }),
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);
});
}
}
_speed = new WeakMap();
exports.default = RocksideRelayTransactionManager;
//# sourceMappingURL=index.js.map