tx-indexer 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,7 +40,7 @@ console.log(tx.classification.receiver); // receiver address
40
40
  ## Transaction Types
41
41
 
42
42
  - `transfer` - Wallet-to-wallet transfers
43
- - `swap` - Token exchanges (Jupiter, Raydium, Orca)
43
+ - `swap` - Token exchanges (pattern-based detection works with any DEX, higher confidence for known protocols like Jupiter, Raydium, Orca)
44
44
  - `nft_mint` - NFT minting (Metaplex, Candy Machine, Bubblegum)
45
45
  - `stake_deposit` - SOL staking deposits
46
46
  - `stake_withdraw` - SOL staking withdrawals
package/dist/client.js CHANGED
@@ -706,7 +706,7 @@ var TransferClassifier = class {
706
706
  sender,
707
707
  receiver,
708
708
  counterparty: {
709
- type: "wallet",
709
+ type: "unknown",
710
710
  address: receiver,
711
711
  name: `${receiver.slice(0, 8)}...`
712
712
  },
@@ -877,19 +877,19 @@ var SwapClassifier = class {
877
877
  priority = 80;
878
878
  classify(context) {
879
879
  const { legs, tx } = context;
880
- const hasDexProtocol = isDexProtocolById(tx.protocol?.id);
881
- if (!hasDexProtocol) {
882
- return null;
883
- }
884
880
  const feeLeg = legs.find(
885
881
  (leg) => leg.role === "fee" && leg.side === "debit"
886
882
  );
887
883
  const initiator = feeLeg?.accountId.replace("external:", "") ?? null;
884
+ if (!initiator) {
885
+ return null;
886
+ }
887
+ const initiatorAccountId = `external:${initiator}`;
888
888
  const tokensOut = legs.filter(
889
- (leg) => leg.accountId.startsWith("external:") && leg.side === "debit" && (leg.role === "sent" || leg.role === "protocol_deposit")
889
+ (leg) => leg.accountId === initiatorAccountId && leg.side === "debit" && (leg.role === "sent" || leg.role === "protocol_deposit")
890
890
  );
891
891
  const tokensIn = legs.filter(
892
- (leg) => leg.accountId.startsWith("external:") && leg.side === "credit" && (leg.role === "received" || leg.role === "protocol_withdraw")
892
+ (leg) => leg.accountId === initiatorAccountId && leg.side === "credit" && (leg.role === "received" || leg.role === "protocol_withdraw")
893
893
  );
894
894
  if (tokensOut.length === 0 || tokensIn.length === 0) {
895
895
  return null;
@@ -899,6 +899,8 @@ var SwapClassifier = class {
899
899
  if (tokenOut.amount.token.symbol === tokenIn.amount.token.symbol) {
900
900
  return null;
901
901
  }
902
+ const hasDexProtocol = isDexProtocolById(tx.protocol?.id);
903
+ const confidence = hasDexProtocol ? 0.95 : 0.75;
902
904
  return {
903
905
  primaryType: "swap",
904
906
  primaryAmount: tokenOut.amount,
@@ -906,7 +908,7 @@ var SwapClassifier = class {
906
908
  sender: initiator,
907
909
  receiver: initiator,
908
910
  counterparty: null,
909
- confidence: 0.9,
911
+ confidence,
910
912
  isRelevant: true,
911
913
  metadata: {
912
914
  swap_type: "token_to_token",
@@ -1038,7 +1040,7 @@ var SolanaPayClassifier = class {
1038
1040
  counterparty: receiver ? {
1039
1041
  address: receiver,
1040
1042
  name: memo.merchant ?? void 0,
1041
- type: memo.merchant ? "merchant" : "wallet"
1043
+ type: memo.merchant ? "merchant" : "unknown"
1042
1044
  } : null,
1043
1045
  confidence: 0.98,
1044
1046
  isRelevant: true,