@cenoa/waas-js-sdk
Version:
Official Cenoa Wallet as a Service SDK
464 lines (463 loc) • 24.1 kB
JavaScript
"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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = __importDefault(require("../types"));
const errors_1 = __importDefault(require("../errors"));
const api_1 = require("../api");
const SignManager_1 = __importDefault(require("../wallet-manager/sign-manager/SignManager"));
const sdk_1 = require("../sdk");
const web_ui_options_1 = require("./web-ui-options");
var TransactionManager;
(function (TransactionManager) {
function transfer(payload) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
if (!((_a = payload === null || payload === void 0 ? void 0 : payload.fundingWallet) === null || _a === void 0 ? void 0 : _a.privateKey)) {
throw new errors_1.default.InvalidPrivateKeyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoCurrency)) {
throw new errors_1.default.InvalidCryptoCurrencyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoAmount)) {
throw new errors_1.default.InvalidCryptoAmountError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.network)) {
throw new errors_1.default.InvalidNetworkError();
}
// get the sign credentials from the server
const signCredentialsResp = yield api_1.apiHelper.getSignCredentialsForTransfer(payload);
// sign the transactions
const signedTransactions = yield SignManager_1.default.signTransactions(payload.fundingWallet, signCredentialsResp.data);
// send the signed transactions to the server
const transferStatusResp = yield api_1.apiHelper.transfer({
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
});
return transferStatusResp.data;
});
}
function transferToClientWallet(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.toCenoaUserId)) {
throw new errors_1.default.InvalidCenoaUserIdError();
}
const partnerWalletResp = yield sdk_1.WalletManager.getPartnerWallet();
if (partnerWalletResp.address.toLocaleLowerCase() !==
payload.fundingWallet.address.toLocaleLowerCase()) {
throw new errors_1.default.InvalidSenderWalletAddressError();
}
return transfer(payload);
});
}
TransactionManager.transferToClientWallet = transferToClientWallet;
function transferFromClientWallet(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.fromCenoaUserId)) {
throw new errors_1.default.InvalidCenoaUserIdError();
}
const userWalletResp = yield sdk_1.WalletManager.getUserWallet({
cenoaUserId: payload.fromCenoaUserId,
});
if (userWalletResp.address.toLocaleLowerCase() !==
payload.fundingWallet.address.toLocaleLowerCase()) {
throw new errors_1.default.InvalidSenderWalletAddressError();
}
return transfer(payload);
});
}
TransactionManager.transferFromClientWallet = transferFromClientWallet;
/**
* @deprecated This method is deprecated. For user transactions, use {@link getTransaction} with the params `getTransaction({txId, type})`.
* For partner transactions, use {@link getPartnerTransaction} with the params `getPartnerTransaction({txId, type})`.
* This method may be removed in a future release.
*/
function get(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
// get transaction details from the server
const transferStatusResp = yield api_1.apiHelper.getTransferStatus({
txId: payload.txId,
});
return transferStatusResp.data;
});
}
TransactionManager.get = get;
function initiateTransaction(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) {
throw new errors_1.default.InvalidCenoaUserIdError();
}
let initiateTransactionResponse;
if (payload.type === types_1.default.TransactionType.BUY) {
initiateTransactionResponse = yield api_1.apiHelper.initiateDepositTransaction({
cenoaUserId: payload.cenoaUserId,
});
}
else if (payload.type === types_1.default.TransactionType.SELL) {
initiateTransactionResponse = yield api_1.apiHelper.initiateWithdrawTransaction({
cenoaUserId: payload.cenoaUserId,
});
}
else {
throw new errors_1.default.InvalidTransactionTypeError();
}
const webUiOptions = (0, web_ui_options_1.getWebUiOptions)();
if (!webUiOptions) {
return initiateTransactionResponse;
}
// append webUiOptions to the URL
const url = new URL(initiateTransactionResponse.url);
Object.keys(webUiOptions).forEach(key => url.searchParams.append(key, webUiOptions[key]));
return Object.assign(Object.assign({}, initiateTransactionResponse), { url: url.toString() });
});
}
TransactionManager.initiateTransaction = initiateTransaction;
function signAndCompleteTransaction(payload) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) {
throw new errors_1.default.InvalidCenoaUserIdError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.type)) {
throw new errors_1.default.InvalidTransactionTypeError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
if (!((_a = payload === null || payload === void 0 ? void 0 : payload.fundingWallet) === null || _a === void 0 ? void 0 : _a.privateKey)) {
throw new errors_1.default.InvalidPrivateKeyError();
}
// check if the funding wallet belongs to the right user
const userWalletResp = yield sdk_1.WalletManager.getUserWallet({
cenoaUserId: payload.cenoaUserId,
});
if (userWalletResp.address.toLocaleLowerCase() !==
payload.fundingWallet.address.toLocaleLowerCase()) {
throw new errors_1.default.InvalidSenderWalletAddressError();
}
// get the sign credentials from the server
let signCredentialsResp;
if (payload.type === types_1.default.TransactionType.BUY) {
signCredentialsResp = yield api_1.apiHelper.getUserDepositTransaction({
txId: payload.txId,
});
}
else if (payload.type === types_1.default.TransactionType.SELL) {
signCredentialsResp = yield api_1.apiHelper.getUserWithdrawTransaction({
txId: payload.txId,
});
}
else {
throw new errors_1.default.InvalidTransactionTypeError();
}
if (signCredentialsResp.data.status === types_1.default.TransactionStatus.FAILED) {
throw new errors_1.default.AttemptedToSignFailedTransactionError();
}
if (signCredentialsResp.data.status === types_1.default.TransactionStatus.COMPLETED) {
throw new errors_1.default.AttemptedToSignCompletedTransactionError();
}
if (signCredentialsResp.data.status === types_1.default.TransactionStatus.IN_PROGRESS) {
throw new errors_1.default.AttemptedToSignInProgressTransactionError();
}
if (signCredentialsResp.data.status !== types_1.default.TransactionStatus.UNSIGNED) {
throw new errors_1.default.InvalidTransactionStatusError();
}
if (!signCredentialsResp.data.signs ||
signCredentialsResp.data.signs.length === 0) {
throw new errors_1.default.InvalidSignsFieldError();
}
// sign the transactions
const signedTransactions = yield SignManager_1.default.signTransactions(payload.fundingWallet, signCredentialsResp.data);
// send the signed transactions to the server
if (payload.type === types_1.default.TransactionType.BUY) {
return api_1.apiHelper
.patchDepositWithSignature({
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
})
.then(resp => resp.data);
}
else if (payload.type === types_1.default.TransactionType.SELL) {
return api_1.apiHelper
.patchWithdrawWithSignature({
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
})
.then(resp => resp.data);
}
else {
throw new errors_1.default.InvalidTransactionTypeError();
}
});
}
TransactionManager.signAndCompleteTransaction = signAndCompleteTransaction;
function isValidAccountType(accountType) {
return accountType === 'USER' || accountType === 'PARTNER';
}
function moveFundsToYieldAccount(accountType, payload) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
if (!isValidAccountType(accountType)) {
throw new errors_1.default.InvalidAccountTypeError();
}
if (!((_a = payload === null || payload === void 0 ? void 0 : payload.fundingWallet) === null || _a === void 0 ? void 0 : _a.privateKey)) {
throw new errors_1.default.InvalidPrivateKeyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoCurrency)) {
throw new errors_1.default.InvalidCryptoCurrencyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoAmount)) {
throw new errors_1.default.InvalidCryptoAmountError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.network)) {
throw new errors_1.default.InvalidNetworkError();
}
// get the sign credentials from the server
let signCredentialsResp;
if (accountType === 'PARTNER') {
signCredentialsResp = yield api_1.apiHelper.getSignCredentialsForPartnerDeposit(payload);
}
else {
signCredentialsResp = yield api_1.apiHelper.getSignCredentialsForUserDeposit(payload);
}
// sign the transactions
const signedTransactions = yield SignManager_1.default.signTransactions(payload.fundingWallet, signCredentialsResp.data);
// send the signed transactions to the server
const patchPayload = {
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
};
if (accountType === 'PARTNER') {
return api_1.apiHelper
.patchPartnerDeposit(patchPayload)
.then(resp => resp.data);
}
return api_1.apiHelper
.patchDepositWithSignature(patchPayload)
.then(resp => resp.data);
});
}
function moveFundsToActiveYieldAccount(wallet) {
return __awaiter(this, void 0, void 0, function* () {
// get the sign credentials from the server
const signCredentialsResp = yield api_1.apiHelper.getSignCredentialsForReinvest();
// sign the transactions
const signedTransactions = yield SignManager_1.default.signTransactions(wallet, signCredentialsResp.data);
// send the signed transactions to the server
const patchPayload = {
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
};
return api_1.apiHelper
.patchReinvestWithSignature(patchPayload)
.then(resp => resp.data);
});
}
TransactionManager.moveFundsToActiveYieldAccount = moveFundsToActiveYieldAccount;
function userMoveFundsToYieldAccount(payload) {
return __awaiter(this, void 0, void 0, function* () {
return moveFundsToYieldAccount('USER', payload);
});
}
TransactionManager.userMoveFundsToYieldAccount = userMoveFundsToYieldAccount;
function partnerMoveFundsToYieldAccount(payload) {
return __awaiter(this, void 0, void 0, function* () {
return moveFundsToYieldAccount('PARTNER', payload);
});
}
TransactionManager.partnerMoveFundsToYieldAccount = partnerMoveFundsToYieldAccount;
function getPartnerMoveFundsToYieldAccountTransactionDetails(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
// get transaction details from the server
const depositTransactionResp = yield api_1.apiHelper.getPartnerDepositTransaction({
txId: payload.txId,
});
return depositTransactionResp.data;
});
}
TransactionManager.getPartnerMoveFundsToYieldAccountTransactionDetails = getPartnerMoveFundsToYieldAccountTransactionDetails;
function moveFundsFromYieldAccountToMainAccount(accountType, payload) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
if (!isValidAccountType(accountType)) {
throw new errors_1.default.InvalidAccountTypeError();
}
if (!((_a = payload === null || payload === void 0 ? void 0 : payload.fundingWallet) === null || _a === void 0 ? void 0 : _a.privateKey)) {
throw new errors_1.default.InvalidPrivateKeyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoCurrency)) {
throw new errors_1.default.InvalidCryptoCurrencyError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.cryptoAmount)) {
throw new errors_1.default.InvalidCryptoAmountError();
}
if (!(payload === null || payload === void 0 ? void 0 : payload.network)) {
throw new errors_1.default.InvalidNetworkError();
}
// if the toWalletAddress is not provided, use the funding wallet address
if (!(payload === null || payload === void 0 ? void 0 : payload.toWalletAddress)) {
payload.toWalletAddress = (_b = payload === null || payload === void 0 ? void 0 : payload.fundingWallet) === null || _b === void 0 ? void 0 : _b.address;
}
// get the sign credentials from the server
let signCredentialsResp;
if (accountType === 'PARTNER') {
signCredentialsResp =
yield api_1.apiHelper.getSignCredentialsForPartnerWithdraw(payload);
}
else {
signCredentialsResp = yield api_1.apiHelper.getSignCredentialsForUserWithdraw(payload);
}
// sign the transactions
const signedTransactions = yield SignManager_1.default.signTransactions(payload.fundingWallet, signCredentialsResp.data);
// send the signed transactions to the server
const patchPayload = {
id: signCredentialsResp.data.id,
signedTransactionsPayload: {
signedTransactions,
},
};
if (accountType === 'PARTNER') {
return api_1.apiHelper
.patchPartnerWithdraw(patchPayload)
.then(resp => resp.data);
}
return api_1.apiHelper
.patchWithdrawWithSignature(patchPayload)
.then(resp => resp.data);
});
}
function userMoveFundsFromYieldAccountToMainAccount(payload) {
return __awaiter(this, void 0, void 0, function* () {
return moveFundsFromYieldAccountToMainAccount('USER', payload);
});
}
TransactionManager.userMoveFundsFromYieldAccountToMainAccount = userMoveFundsFromYieldAccountToMainAccount;
function partnerMoveFundsFromYieldAccountToMainAccount(payload) {
return __awaiter(this, void 0, void 0, function* () {
return moveFundsFromYieldAccountToMainAccount('PARTNER', payload);
});
}
TransactionManager.partnerMoveFundsFromYieldAccountToMainAccount = partnerMoveFundsFromYieldAccountToMainAccount;
function getPartnerMoveFundsFromYieldAccountToMainAccountTransactionDetails(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
// get transaction details from the server
const withdrawTransactionResp = yield api_1.apiHelper.getPartnerWithdrawTransaction({
txId: payload.txId,
});
return withdrawTransactionResp.data;
});
}
TransactionManager.getPartnerMoveFundsFromYieldAccountToMainAccountTransactionDetails = getPartnerMoveFundsFromYieldAccountToMainAccountTransactionDetails;
function getPartnerTransactions(payload) {
return __awaiter(this, void 0, void 0, function* () {
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.BUY) {
return api_1.apiHelper.getPartnerDepositTransactions();
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.SELL) {
return api_1.apiHelper.getPartnerWithdrawTransactions();
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.TRANSFER) {
return api_1.apiHelper.getUserTransferTransactions(payload);
}
throw new errors_1.default.InvalidTransactionTypeError();
});
}
TransactionManager.getPartnerTransactions = getPartnerTransactions;
function getPartnerTransaction(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.BUY) {
return api_1.apiHelper
.getPartnerDepositTransaction(payload)
.then(resp => resp.data);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.SELL) {
return api_1.apiHelper
.getPartnerWithdrawTransaction(payload)
.then(resp => resp.data);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.TRANSFER) {
return api_1.apiHelper
.getTransferStatus({
txId: payload.txId,
})
.then(resp => resp.data);
}
throw new errors_1.default.InvalidTransactionTypeError();
});
}
TransactionManager.getPartnerTransaction = getPartnerTransaction;
function getTransactions(payload) {
return __awaiter(this, void 0, void 0, function* () {
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.BUY) {
return api_1.apiHelper.getUserDepositTransactions(payload);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.SELL) {
return api_1.apiHelper.getUserWithdrawTransactions(payload);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.TRANSFER) {
return api_1.apiHelper.getUserTransferTransactions(payload);
}
throw new errors_1.default.InvalidTransactionTypeError();
});
}
TransactionManager.getTransactions = getTransactions;
function getTransaction(payload) {
return __awaiter(this, void 0, void 0, function* () {
if (!(payload === null || payload === void 0 ? void 0 : payload.txId)) {
throw new errors_1.default.InvalidTransactionIdError();
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.BUY) {
return api_1.apiHelper
.getUserDepositTransaction(payload)
.then(resp => resp.data);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.SELL) {
return api_1.apiHelper
.getUserDepositTransaction(payload)
.then(resp => resp.data);
}
if ((payload === null || payload === void 0 ? void 0 : payload.type) === types_1.default.TransactionType.TRANSFER) {
return api_1.apiHelper
.getTransferStatus({
txId: payload.txId,
})
.then(resp => resp.data);
}
throw new errors_1.default.InvalidTransactionTypeError();
});
}
TransactionManager.getTransaction = getTransaction;
})(TransactionManager || (TransactionManager = {}));
exports.default = TransactionManager;