UNPKG

@radixdlt/atom-transaction-mapping

Version:
129 lines 5.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tokenBalancesForOneAccountReducer = exports.mergeMaps = exports.mergeTokenBalance = exports.tokenBalance = exports.emptyTokenBalancesForOneAccount = exports.tokenBalancesForOneAccountFromParticle = exports.tokenBalancesForOneAccount = void 0; const _types_1 = require("./_types"); const atom_1 = require("@radixdlt/atom"); const neverthrow_1 = require("neverthrow"); const util_1 = require("@radixdlt/util"); const particleReducer_1 = require("./particleReducer"); const tokenBalancesForOneAccount = (input) => ({ stateType: _types_1.ApplicationStateType.TOKEN_BALANCES_FOR_ONE_ACCOUNT, balances: input.balances, owner: input.owner, size: input.balances.size, balanceOf: (resourceIdentifier) => input.balances.get(resourceIdentifier), }); exports.tokenBalancesForOneAccount = tokenBalancesForOneAccount; const tokenBalancesForOneAccountFromParticle = (transferrableTokensParticle) => { const tokenBalance_ = exports.tokenBalance(transferrableTokensParticle); return exports.tokenBalancesForOneAccount({ owner: transferrableTokensParticle.address, balances: new Map([ [transferrableTokensParticle.resourceIdentifier, tokenBalance_], ]), }); }; exports.tokenBalancesForOneAccountFromParticle = tokenBalancesForOneAccountFromParticle; const emptyTokenBalancesForOneAccount = (owner) => exports.tokenBalancesForOneAccount({ owner, balances: new Map(), }); exports.emptyTokenBalancesForOneAccount = emptyTokenBalancesForOneAccount; const tokenBalance = (ttp) => { return { owner: ttp.address, tokenAmount: { amount: ttp.amount, token: ttp, }, }; }; exports.tokenBalance = tokenBalance; const ownerMismatchError = new Error(`Cannot merge TokenBalance's with different owners.`); const mergeTokenBalance = (lhs, rhs) => { if (!lhs.tokenAmount.token.resourceIdentifier.equals(rhs.tokenAmount.token.resourceIdentifier)) { return neverthrow_1.err(new Error(`Cannot merge TokenBalance's with different token types.`)); } if (!lhs.owner.equals(rhs.owner)) { return neverthrow_1.err(ownerMismatchError); } return lhs.tokenAmount.amount.adding(rhs.tokenAmount.amount).map((sum) => ({ owner: lhs.owner, tokenAmount: { token: lhs.tokenAmount.token, amount: sum, }, })); }; exports.mergeTokenBalance = mergeTokenBalance; const mergeMaps = (input) => { const lhs = input.first; const rhs = input.second; const uniqueKeys = Array.from(new Set([] .concat(Array.from(lhs.keys())) .concat(Array.from(rhs.keys())))); /* eslint-disable functional/immutable-data, functional/no-let, functional/no-loop-statement, prefer-const */ let combinedMap = new Map(); for (const key of uniqueKeys) { const lhsVal = lhs.get(key); const rhsVal = rhs.get(key); if (lhsVal && rhsVal) { // Found duplicates... const mergeResult = input.onDuplicates(lhsVal, rhsVal, key); if (mergeResult.isOk()) { combinedMap.set(key, mergeResult.value); } else { return neverthrow_1.err(mergeResult.error); } } else if (lhsVal) { combinedMap.set(key, lhsVal); } else if (rhsVal) { combinedMap.set(key, rhsVal); } else { throw Error('Incorrect implementation, should never happen.'); } } return neverthrow_1.ok(combinedMap); }; exports.mergeMaps = mergeMaps; // eslint-disable-next-line max-lines-per-function const tokenBalancesForOneAccountReducer = (owner) => { const combine = (input) => { if (!input.current.owner.equals(owner) || !input.current.owner.equals(input.newState.owner)) return neverthrow_1.err(new Error('Incorrect implementation, owner mismatch')); if (util_1.mapEquals(input.current.balances, input.newState.balances)) return neverthrow_1.ok(input.current); return exports.mergeMaps({ first: input.current.balances, second: input.newState.balances, onDuplicates: (a, b, _) => exports.mergeTokenBalance(a, b), }).map((balances) => exports.tokenBalancesForOneAccount({ owner: input.current.owner, balances: balances, })); }; return particleReducer_1.makeParticleReducer({ applicationStateType: _types_1.ApplicationStateType.TOKEN_BALANCES_FOR_ONE_ACCOUNT, initialState: exports.emptyTokenBalancesForOneAccount(owner), reduce: (input) => { const particle = input.upParticle.particle; if (!atom_1.isTransferrableTokensParticle(particle)) return neverthrow_1.ok(input.state); if (!particle.address.equals(owner)) return neverthrow_1.err(ownerMismatchError); const tokenBalancesForOneAccount_ = exports.tokenBalancesForOneAccountFromParticle(particle); return combine({ current: input.state, newState: tokenBalancesForOneAccount_, }); }, combine: combine, }); }; exports.tokenBalancesForOneAccountReducer = tokenBalancesForOneAccountReducer; //# sourceMappingURL=tokenBalancesForOneAccountReducer.js.map