nansen-cli 1.36.2 → 1.38.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.
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { wcExec } from './walletconnect-exec.js';
12
12
  import { base58Encode } from './wallet.js';
13
+ import { encodeApproveCalldata } from './trade-validation.js';
13
14
 
14
15
  const SOLANA_MAINNET_CHAIN = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';
15
16
 
@@ -104,19 +105,22 @@ export async function sendTransactionViaWalletConnect(txData, timeoutMs = 120000
104
105
  /**
105
106
  * Send an ERC-20 approval via WalletConnect.
106
107
  *
107
- * Builds approve(spender, MAX_UINT256) calldata and delegates to sendTransactionViaWalletConnect.
108
+ * Builds approve(spender, amount) calldata and delegates to sendTransactionViaWalletConnect.
109
+ * The amount is scoped to the swap's input (passed by the caller) so a bad quote
110
+ * can drain at most one trade, not the wallet's full token balance.
108
111
  *
109
112
  * @param {string} tokenAddress - ERC-20 token contract
110
113
  * @param {string} spenderAddress - Approval target (e.g. DEX router)
111
114
  * @param {number} chainId - EIP-155 chain ID
115
+ * @param {bigint|string|number} amount - Allowance to grant, in base units
116
+ * @param {bigint|string|number} [maxAllowance] - Hard cap from persisted request intent
112
117
  * @returns {{ txHash?: string, signedTransaction?: string }}
113
118
  */
114
- export async function sendApprovalViaWalletConnect(tokenAddress, spenderAddress, chainId) {
115
- // ERC-20 approve(address spender, uint256 amount) selector = 0x095ea7b3
116
- const MAX_UINT256_HEX = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff';
117
- const data = '0x095ea7b3'
118
- + spenderAddress.slice(2).toLowerCase().padStart(64, '0')
119
- + MAX_UINT256_HEX;
119
+ export async function sendApprovalViaWalletConnect(tokenAddress, spenderAddress, chainId, amount, maxAllowance) {
120
+ // encodeApproveCalldata enforces a valid 20-byte spender, a bounded (< MAX)
121
+ // amount within the request cap, and exactly-68-byte calldata — so a
122
+ // malformed or tampered spender/amount can't reshape the ABI word layout.
123
+ const data = encodeApproveCalldata(spenderAddress, amount, { maxAllowance });
120
124
 
121
125
  return sendTransactionViaWalletConnect({
122
126
  to: tokenAddress,