@radixdlt/atom-transaction-mapping
Version:
79 lines • 3.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeAtomToTokenTransfersMapper = exports.syncMapAtomToTokenTransfers = exports.pgToTokenTransfer = void 0;
const atom_1 = require("@radixdlt/atom");
const _types_1 = require("./_types");
const rxjs_1 = require("rxjs");
const neverthrow_1 = require("neverthrow");
const tokenTransfer_1 = require("./tokenTransfer");
const uniqueAddressCountTTPs = (particles) => {
return new Set(particles.map((ttp) => ttp.address)).size;
};
const getSenderAndToken = (particleGroup) => {
const downedTTPsFromSender = particleGroup
.transferrableTokensParticles(atom_1.Spin.DOWN)
.map((sp) => sp.particle);
if (uniqueAddressCountTTPs(downedTTPsFromSender) !== 1)
return neverthrow_1.err(new Error('Incorrect number of senders.'));
const downedParticleFromSender = downedTTPsFromSender[0];
return neverthrow_1.ok({
particleGroup: particleGroup,
from: downedParticleFromSender.address,
tokenDefinition: downedParticleFromSender,
});
};
const doesPGContainUnallocatedTokensParticleWithSpinUp = (input) => input.particleGroup
.unallocatedTokensParticles(atom_1.Spin.UP)
.some((upP) => upP.particle.resourceIdentifier.equals(input.tokenDefinition.resourceIdentifier));
const validateNotIsTransferNotBurn = (input) => doesPGContainUnallocatedTokensParticleWithSpinUp(input)
? neverthrow_1.err(new Error('Action seems to be a burn action, which we will omit and not count as a transfer.'))
: neverthrow_1.ok(input);
const getRecipient = (input) => {
var _a, _b;
const sender = input.from;
const particleGroup = input.particleGroup;
const upTTPs = particleGroup
.transferrableTokensParticles(atom_1.Spin.UP)
.map((sp) => sp.particle);
const numberOfRecipients = uniqueAddressCountTTPs(upTTPs);
if (numberOfRecipients < 1 || numberOfRecipients > 2)
return neverthrow_1.err(new Error('A transfer should have one or two receivers. Unable to parse.'));
const recipient = (_b = (_a = upTTPs.find((p) => !p.address.equals(sender))) === null || _a === void 0 ? void 0 : _a.address) !== null && _b !== void 0 ? _b : sender;
return neverthrow_1.ok({ to: recipient, upTTPs });
};
const getRecipientAndAmount = (input) => getRecipient(input).map((toAndTTPWithSpinUp) => {
const to = toAndTTPWithSpinUp.to;
const upTTPs = toAndTTPWithSpinUp.upTTPs;
const upParticleToRecipient = upTTPs.find((p) => p.address.equals(to));
if (!upParticleToRecipient)
throw Error('Incorrect implementation, should not happen.');
return Object.assign(Object.assign({}, input), { to, amount: upParticleToRecipient.amount });
});
const pgToTokenTransfer = (particleGroup) => getSenderAndToken(particleGroup)
.andThen(validateNotIsTransferNotBurn)
.andThen(getRecipientAndAmount)
.map(tokenTransfer_1.executedTokenTransfer);
exports.pgToTokenTransfer = pgToTokenTransfer;
const valuePresent = (value) => {
return value !== null && value !== undefined;
};
const filterTransfer = (input, transfer) => {
const actor = input.addressOfActiveAccount;
return transfer.from.equals(actor) || transfer.to.equals(actor);
};
const syncMapAtomToTokenTransfers = (input) => {
return input.atom.particleGroups.groups
.map(exports.pgToTokenTransfer)
.map((r) => (r.isOk() ? r.value : undefined))
.filter(valuePresent)
.filter(filterTransfer.bind(null, input));
};
exports.syncMapAtomToTokenTransfers = syncMapAtomToTokenTransfers;
const makeAtomToTokenTransfersMapper = () => {
return {
executedUserActionType: _types_1.ExecutedUserActionType.TOKEN_TRANSFER,
map: (input) => rxjs_1.from(exports.syncMapAtomToTokenTransfers(input)),
};
};
exports.makeAtomToTokenTransfersMapper = makeAtomToTokenTransfersMapper;
//# sourceMappingURL=atomToTokenTransfersMapper.js.map