@payburner/keyburner-sidewinder-core
Version:
Core library for Keyburner Sidewinder
190 lines • 11.6 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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransferTransactionProcessor = void 0;
const npm_1 = require("@payburner/keyburner-sidewinder-model/dist/npm");
const TransactionProcessorBase_1 = require("./TransactionProcessorBase");
const CommonErrorCodes_1 = require("../model/CommonErrorCodes");
class TransferTransactionProcessor extends TransactionProcessorBase_1.TransactionProcessorBase {
constructor(globalAccountService, tokenService) {
super(globalAccountService, tokenService);
}
doProcess(decodedTransaction) {
const self = this;
return new Promise((resolve, reject) => {
console.log('Processing transfer: ' + decodedTransaction.id);
const transferTransaction = decodedTransaction.payload;
self.getTokenService().getToken(transferTransaction.environment, transferTransaction.token_symbol).then((token) => __awaiter(this, void 0, void 0, function* () {
let senderAccount = null;
try {
senderAccount = yield this.getTokenService()
.getTokenAccount(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.sender_address);
}
catch (error) {
}
let receiverAccount = null;
try {
receiverAccount = yield this.getTokenService()
.getTokenAccount(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address);
}
catch (error) {
}
let issuerAccount = null;
try {
issuerAccount = yield this.getTokenService()
.getTokenAccount(transferTransaction.environment, transferTransaction.token_symbol, token.token_issuer_address);
}
catch (error) {
}
let isReceiverPermissioned = false;
if (token.is_permissioned && receiverAccount === null) {
if (token.token_issuer_address === transferTransaction.sender_address) {
isReceiverPermissioned = true;
}
else {
isReceiverPermissioned = yield this.getTokenService()
.isAddressPermissionedOnToken(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address);
}
}
if (token.frozen) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_IS_FROZEN);
return;
}
else if (!token.allow_transfers_between_accounts &&
(token.token_issuer_address !== transferTransaction.receiver_address &&
token.token_issuer_address !== transferTransaction.sender_address)) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_NO_INTER_ACCOUNT_TRANSFERS);
return;
}
else if (senderAccount === null) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_ACCOUNT_SENDER_ACCOUNT_DOES_NOT_EXIST);
return;
}
else if (senderAccount !== null && senderAccount.frozen) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_ACCOUNT_SENDER_ACCOUNT_IS_FROZEN);
return;
}
else if (receiverAccount !== null && receiverAccount.frozen) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_ACCOUNT_RECEIVER_ACCOUNT_IS_FROZEN);
return;
}
else if (receiverAccount === null && token.is_permissioned && !isReceiverPermissioned) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_ACCOUNT_RECEIVER_ACCOUNT_NO_ACCESS_TO_TOKEN);
return;
}
else if (typeof token.minimum_transfer_amount !== 'undefined'
&& (token.minimum_transfer_amount) > (transferTransaction.transfer_amount)) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_TRANSFER_AMOUNT_LESS_THAN_MINIMUM_TRANSFER);
return;
}
else if (typeof token.maximum_transfer_amount !== 'undefined'
&& (token.maximum_transfer_amount) < (transferTransaction.transfer_amount)) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_TRANSFER_AMOUNT_GREATER_THAN_MAXIMUM_TRANSFER);
return;
}
else if (typeof token.maximum_balance !== 'undefined' && receiverAccount === null
&& (transferTransaction.transfer_amount) > (token.maximum_balance)) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_DESTINATION_ACCOUNT_EXCEED_MAXIMUM_BALANCE_NO_ACCOUNT);
return;
}
else if (typeof token.maximum_balance !== 'undefined'
&& receiverAccount !== null && (receiverAccount.available_balance) +
(transferTransaction.transfer_amount) > (token.maximum_balance)
&& transferTransaction.receiver_address !== token.token_issuer_address) {
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_DESTINATION_ACCOUNT_EXCEED_MAXIMUM_BALANCE);
return;
}
else if ((senderAccount.available_balance) < (transferTransaction.transfer_amount)
+ (token.transaction_fee)) {
resolve(CommonErrorCodes_1.CommonErrorCodes.INSUFFICIENT_BALANCE);
return;
}
if (receiverAccount === null) {
receiverAccount = {
token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address),
token_symbol: token.token_symbol,
account_owner_address: transferTransaction.receiver_address,
environment: token.environment,
sequence: 0,
available_balance: 0,
total_balance: 0,
locked_balance: 0,
frozen: false
};
try {
receiverAccount = yield this.getTokenService().createTokenAccount(receiverAccount);
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_CREATING_RECEIVER_ACCOUNT);
return;
}
}
if (senderAccount.account_owner_address === token.token_issuer_address) {
try {
yield this.getTokenService().setAmounts(transferTransaction.environment, transferTransaction.sender_address, transferTransaction.token_symbol, ((senderAccount.total_balance) - ((transferTransaction.transfer_amount))), ((senderAccount.available_balance) - ((transferTransaction.transfer_amount))));
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_SETTING_SENDER_BALANCE);
return;
}
}
else {
try {
yield this.getTokenService().setAmounts(transferTransaction.environment, transferTransaction.sender_address, transferTransaction.token_symbol, ((senderAccount.total_balance) - ((transferTransaction.transfer_amount)) -
(token.transaction_fee)), ((senderAccount.available_balance) - ((transferTransaction.transfer_amount)) -
(token.transaction_fee)));
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_SETTING_SENDER_BALANCE);
return;
}
}
if (receiverAccount.account_owner_address === token.token_issuer_address) {
try {
yield this.getTokenService().setAmounts(transferTransaction.environment, transferTransaction.receiver_address, transferTransaction.token_symbol, (receiverAccount.total_balance) + ((transferTransaction.transfer_amount) + (token.transaction_fee)), (receiverAccount.available_balance) + ((transferTransaction.transfer_amount) + (token.transaction_fee)));
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_SETTING_RECEIVER_BALANCE);
return;
}
}
else {
try {
yield this.getTokenService().setAmounts(transferTransaction.environment, transferTransaction.receiver_address, transferTransaction.token_symbol, (receiverAccount.total_balance) + ((transferTransaction.transfer_amount)), (receiverAccount.available_balance) + ((transferTransaction.transfer_amount)));
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_SETTING_RECEIVER_BALANCE);
return;
}
}
if (senderAccount.account_owner_address !== token.token_issuer_address && receiverAccount.account_owner_address !== token.token_issuer_address) {
try {
yield this.getTokenService().setAmounts(transferTransaction.environment, token.token_issuer_address, transferTransaction.token_symbol, (issuerAccount.total_balance) + ((token.transaction_fee)), (issuerAccount.available_balance) + ((token.transaction_fee)));
}
catch (error) {
resolve(CommonErrorCodes_1.CommonErrorCodes.SYSTEM_PROBLEM_SETTING_RECEIVER_BALANCE);
return;
}
}
resolve({ status: 200 });
})).catch((error) => {
console.log('ERRR:' + error);
console.log('ERRR:' + JSON.stringify(error, null, 2));
resolve(CommonErrorCodes_1.CommonErrorCodes.TOKEN_NOT_FOUND);
});
});
}
getTransactionType() {
return npm_1.TransactionTypes.Transfer;
}
}
exports.TransferTransactionProcessor = TransferTransactionProcessor;
//# sourceMappingURL=TransferTransactionProcessor.js.map