UNPKG

@payburner/keyburner-sidewinder-core

Version:
213 lines 12.8 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()); }); }; 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, items) { 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); console.log('Got Sender Account'); } catch (error) { console.log('Did not get Sender Account'); } let receiverAccount = null; try { receiverAccount = yield this.getTokenService() .getTokenAccount(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address); console.log('Got Receiver Account'); } catch (error) { console.log('Did not get Receiver Account'); } 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 (senderAccount.account_owner_address === token.token_issuer_address) { items.push({ Update: { TableName: 'sidewinder_token_account', Key: { token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.sender_address), }, UpdateExpression: 'SET available_balance = available_balance - :transfer_amount, total_balance = total_balance - :transfer_amount', 'ExpressionAttributeValues': { ':transfer_amount': transferTransaction.transfer_amount } } }); } else { items.push({ Update: { TableName: 'sidewinder_token_account', Key: { token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.sender_address), }, UpdateExpression: 'SET available_balance = available_balance - :transfer_amount, total_balance = total_balance - :transfer_amount', 'ExpressionAttributeValues': { ':transfer_amount': transferTransaction.transfer_amount + token.transaction_fee } } }); } if (receiverAccount !== null && receiverAccount.account_owner_address === token.token_issuer_address) { items.push({ Update: { TableName: 'sidewinder_token_account', Key: { token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address), }, UpdateExpression: 'SET available_balance = available_balance + :transfer_amount, total_balance = total_balance + :transfer_amount', 'ExpressionAttributeValues': { ':transfer_amount': transferTransaction.transfer_amount + token.transaction_fee } } }); } else { 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: transferTransaction.transfer_amount, total_balance: transferTransaction.transfer_amount, over_balance: 0, locked_balance: 0, frozen: false }; items.push({ Put: { TableName: 'sidewinder_token_account', Item: receiverAccount, ConditionExpression: "attribute_not_exists(token_account_id)" } }); } else { items.push({ Update: { TableName: 'sidewinder_token_account', Key: { token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, transferTransaction.receiver_address), }, UpdateExpression: 'SET available_balance = available_balance + :transfer_amount, total_balance = total_balance + :transfer_amount', 'ExpressionAttributeValues': { ':transfer_amount': transferTransaction.transfer_amount, } } }); } } if (senderAccount.account_owner_address !== token.token_issuer_address && receiverAccount.account_owner_address !== token.token_issuer_address) { items.push({ Update: { TableName: 'sidewinder_token_account', Key: { token_account_id: npm_1.AccountUtils.calculateTokenAccountId(transferTransaction.environment, transferTransaction.token_symbol, token.token_issuer_address), }, UpdateExpression: 'SET available_balance = available_balance + :transaction_fee, total_balance = total_balance + :transaction_fee', 'ExpressionAttributeValues': { ':transaction_fee': token.transaction_fee } } }); } 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