genius-intents 0.20.2 → 0.20.3-develop.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/CHANGELOG.md +27 -0
- package/dist/lib/dex/pair-discovery/pair-discovery.service.d.ts +4 -0
- package/dist/lib/dex/pair-discovery/pair-discovery.service.d.ts.map +1 -1
- package/dist/lib/dex/pair-discovery/pair-discovery.service.js +103 -27
- package/dist/lib/dex/pair-discovery/pair-discovery.service.js.map +1 -1
- package/dist/lib/dex/pair-discovery/pair-discovery.types.d.ts +26 -0
- package/dist/lib/dex/pair-discovery/pair-discovery.types.d.ts.map +1 -1
- package/dist/lib/transfer-taxes/erc20-taxes.types.d.ts +30 -0
- package/dist/lib/transfer-taxes/erc20-taxes.types.d.ts.map +1 -0
- package/dist/lib/transfer-taxes/erc20-taxes.types.js +3 -0
- package/dist/lib/transfer-taxes/erc20-taxes.types.js.map +1 -0
- package/dist/lib/transfer-taxes/erc20-tokenIn-taxes.d.ts +3 -0
- package/dist/lib/transfer-taxes/erc20-tokenIn-taxes.d.ts.map +1 -0
- package/dist/lib/transfer-taxes/erc20-tokenIn-taxes.js +166 -0
- package/dist/lib/transfer-taxes/erc20-tokenIn-taxes.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
+
## [0.20.3-develop.0] - 2025-11-10 (Beta)
|
|
2
|
+
|
|
3
|
+
🧪 **This is a beta release for testing purposes.**
|
|
4
|
+
|
|
5
|
+
### [0.20.3-develop.0](https://github.com/Genius-Foundation/genius-intents/compare/v0.20.2...v0.20.3-develop.0) (2025-11-10)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* Transfer Tax Detection for TokenIn ([#148](https://github.com/Genius-Foundation/genius-intents/issues/148)) ([19dbcb7](https://github.com/Genius-Foundation/genius-intents/commit/19dbcb7a991f8dd46207df37c10def1726afdbe2))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Documentation
|
|
14
|
+
|
|
15
|
+
* update CHANGELOG.md for v0.20.2 (beta) ([6bb0550](https://github.com/Genius-Foundation/genius-intents/commit/6bb0550e3aff7c92a59ae980ce6e8b88953d319e))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
⚠️ **Beta Release Notes:**
|
|
20
|
+
- This version is intended for testing and development
|
|
21
|
+
- May contain experimental features
|
|
22
|
+
- Not recommended for production use
|
|
23
|
+
- Feedback and bug reports are welcome
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
|
|
1
28
|
## [0.20.2] - 2025-11-07 (Beta)
|
|
2
29
|
|
|
3
30
|
🧪 **This is a beta release for testing purposes.**
|
|
@@ -10,6 +10,10 @@ export declare class EvmPairDiscoveryService {
|
|
|
10
10
|
dexes: SupportedEvmDexes[];
|
|
11
11
|
chains: ChainIdEnum[];
|
|
12
12
|
private _adapters;
|
|
13
|
+
/**
|
|
14
|
+
* Utilized to determine the sell tax of an ERC20 token
|
|
15
|
+
*/
|
|
16
|
+
private _clients;
|
|
13
17
|
constructor(config: DexPairDiscoveryConfig);
|
|
14
18
|
getPairInfo(params: GetEvmDexPairParams): Promise<EvmPairCandidate>;
|
|
15
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair-discovery.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pair-discovery.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.service.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,OAAO,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAC;AAoBjE,qBAAa,uBAAuB;IAC3B,KAAK,EAAE,iBAAiB,EAAE,CAuC/B;IAEK,MAAM,EAAE,WAAW,EAAE,CAS1B;IAEF,OAAO,CAAC,SAAS,CAAyB;IAE1C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAgC;gBAEpC,MAAM,EAAE,sBAAsB;IAyB7B,WAAW,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8FjF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EvmPairDiscoveryService = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
4
5
|
/**
|
|
5
6
|
* Enumerations for various supported DEX protocols and chains
|
|
6
7
|
*/
|
|
@@ -19,13 +20,24 @@ const v3_dex_pair_discovery_adapter_1 = require("./adapters/v3-dex-pair-discover
|
|
|
19
20
|
const ve33_dex_pair_discovery_adapter_1 = require("./adapters/ve33-dex-pair-discovery.adapter");
|
|
20
21
|
const fourmeme_dex_pair_discovery_adapter_1 = require("./adapters/fourmeme-dex-pair-discovery.adapter");
|
|
21
22
|
const norm_dex_token_1 = require("../../../utils/norm-dex-token");
|
|
23
|
+
const erc20_tokenIn_taxes_1 = require("../../transfer-taxes/erc20-tokenIn-taxes");
|
|
24
|
+
const chainId_to_chain_1 = require("../../../utils/chainId-to-chain");
|
|
22
25
|
class EvmPairDiscoveryService {
|
|
23
26
|
constructor(config) {
|
|
24
27
|
this.dexes = [
|
|
28
|
+
/**
|
|
29
|
+
* Protocol Specific
|
|
30
|
+
*/
|
|
25
31
|
enums_1.ProtocolEnum.LFJ,
|
|
26
32
|
enums_1.ProtocolEnum.FOUR_MEME,
|
|
33
|
+
/**
|
|
34
|
+
* Algebra
|
|
35
|
+
*/
|
|
27
36
|
algebra_types_1.AlgebraDexTagEnum.BLACKHOLE,
|
|
28
37
|
algebra_types_1.AlgebraDexTagEnum.QUICKSWAP_CLMM,
|
|
38
|
+
/**
|
|
39
|
+
* Uniswap V2 Style DEXes
|
|
40
|
+
*/
|
|
29
41
|
v2_dex_types_1.UniswapV2StyleDexEnum.UNISWAP_V2,
|
|
30
42
|
v2_dex_types_1.UniswapV2StyleDexEnum.SUSHISWAP_V2,
|
|
31
43
|
v2_dex_types_1.UniswapV2StyleDexEnum.PANCAKESWAP_V2,
|
|
@@ -33,6 +45,9 @@ class EvmPairDiscoveryService {
|
|
|
33
45
|
v2_dex_types_1.UniswapV2StyleDexEnum.TRADERJOE_V2,
|
|
34
46
|
v2_dex_types_1.UniswapV2StyleDexEnum.PANGOLIN_V2,
|
|
35
47
|
v2_dex_types_1.UniswapV2StyleDexEnum.HYPERSWAP_V2,
|
|
48
|
+
/**
|
|
49
|
+
* Uniswap V3 Style DEXes
|
|
50
|
+
*/
|
|
36
51
|
v3_dex_types_1.UniswapV3StyleDexEnum.UNISWAP_V3,
|
|
37
52
|
v3_dex_types_1.UniswapV3StyleDexEnum.PANCAKESWAP_V3,
|
|
38
53
|
v3_dex_types_1.UniswapV3StyleDexEnum.PANGOLIN_V3,
|
|
@@ -41,6 +56,9 @@ class EvmPairDiscoveryService {
|
|
|
41
56
|
v3_dex_types_1.UniswapV3StyleDexEnum.VELODROME_CLMM,
|
|
42
57
|
v3_dex_types_1.UniswapV3StyleDexEnum.AERODROME_CLMM,
|
|
43
58
|
v3_dex_types_1.UniswapV3StyleDexEnum.RAMSES_CLMM,
|
|
59
|
+
/**
|
|
60
|
+
* Ve33 Style Deployments
|
|
61
|
+
*/
|
|
44
62
|
ve33_types_1.Ve33StyleDeploymentEnum.AERODROME,
|
|
45
63
|
ve33_types_1.Ve33StyleDeploymentEnum.VELODROME,
|
|
46
64
|
ve33_types_1.Ve33StyleDeploymentEnum.BLACKHOLE,
|
|
@@ -57,6 +75,10 @@ class EvmPairDiscoveryService {
|
|
|
57
75
|
enums_1.ChainIdEnum.HYPEREVM,
|
|
58
76
|
];
|
|
59
77
|
this._adapters = [];
|
|
78
|
+
/**
|
|
79
|
+
* Utilized to determine the sell tax of an ERC20 token
|
|
80
|
+
*/
|
|
81
|
+
this._clients = [];
|
|
60
82
|
this._adapters = [
|
|
61
83
|
new lfj_v3_dex_pair_doscovery_adapter_1.LfjPairAdapter(config),
|
|
62
84
|
new algebra_dex_pair_discovery_adapter_1.AlgebraPairAdapter(config),
|
|
@@ -65,38 +87,92 @@ class EvmPairDiscoveryService {
|
|
|
65
87
|
new ve33_dex_pair_discovery_adapter_1.Ve33PairAdapter(config),
|
|
66
88
|
new fourmeme_dex_pair_discovery_adapter_1.FourMemePairAdapter(config),
|
|
67
89
|
];
|
|
90
|
+
for (const [chainIdStr, rpcUrl] of Object.entries(config.rpcs)) {
|
|
91
|
+
const network = Number(chainIdStr);
|
|
92
|
+
const chainConfig = chainId_to_chain_1.chainIdToChain[network];
|
|
93
|
+
const supportsNetwork = this.chains.includes(network);
|
|
94
|
+
if (!chainConfig || !supportsNetwork) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const client = new ethers_1.ethers.JsonRpcProvider(rpcUrl, network);
|
|
98
|
+
this._clients[network] = client;
|
|
99
|
+
}
|
|
68
100
|
}
|
|
69
101
|
async getPairInfo(params) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
102
|
+
const supportedAdapters = this._adapters.filter(adapter => adapter.chains.includes(params.network));
|
|
103
|
+
if (supportedAdapters.length === 0) {
|
|
104
|
+
throw new Error(`EvmPairDiscoveryService: No supported adapters found for network ${params.network}`);
|
|
105
|
+
}
|
|
106
|
+
const { tokenIn, tokenOut } = (0, norm_dex_token_1.normalizeDexTokens)({
|
|
107
|
+
tokenIn: params.tokenIn,
|
|
108
|
+
tokenOut: params.tokenOut,
|
|
109
|
+
network: params.network,
|
|
110
|
+
});
|
|
111
|
+
const adapterErrors = [];
|
|
112
|
+
const promises = supportedAdapters.map(async (adapter) => {
|
|
113
|
+
try {
|
|
114
|
+
const pairInfo = await adapter.getPairInfo({ ...params, tokenIn, tokenOut });
|
|
115
|
+
if (pairInfo) {
|
|
116
|
+
return { success: true, adapter: adapter.constructor.name, pairInfo };
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
adapter: adapter.constructor.name,
|
|
121
|
+
error: new Error('No matching pair found'),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return {
|
|
126
|
+
success: false,
|
|
127
|
+
adapter: adapter.constructor.name,
|
|
128
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
let transferTaxPromise = undefined;
|
|
133
|
+
if (params.sellTxHash && params.sellerEOA) {
|
|
134
|
+
const client = this._clients[params.network];
|
|
135
|
+
if (!client) {
|
|
136
|
+
throw new Error(`EvmPairDiscoveryService: No RPC client available for network ${params.network} to determine transfer tax`);
|
|
137
|
+
}
|
|
138
|
+
transferTaxPromise = (0, erc20_tokenIn_taxes_1.determineTokenInTransferTax)({
|
|
139
|
+
tokenIn,
|
|
140
|
+
tokenOut,
|
|
141
|
+
pairAddress: params.pair,
|
|
76
142
|
network: params.network,
|
|
143
|
+
client,
|
|
144
|
+
/**
|
|
145
|
+
* We know that these are defined due to the outer if condition
|
|
146
|
+
*/
|
|
147
|
+
sellTxHash: params.sellTxHash,
|
|
148
|
+
sellTxEoa: params.sellerEOA,
|
|
77
149
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
});
|
|
150
|
+
}
|
|
151
|
+
const [transferTaxInfo, results] = await Promise.all([
|
|
152
|
+
transferTaxPromise,
|
|
153
|
+
Promise.all(promises),
|
|
154
|
+
]);
|
|
155
|
+
for (const result of results) {
|
|
156
|
+
if (result.success && result.pairInfo) {
|
|
157
|
+
// Add transfer tax information if available
|
|
158
|
+
if (transferTaxInfo) {
|
|
159
|
+
return {
|
|
160
|
+
...result.pairInfo,
|
|
161
|
+
tokenInTransferTax: transferTaxInfo,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return result.pairInfo;
|
|
165
|
+
}
|
|
166
|
+
adapterErrors.push({
|
|
167
|
+
adapter: result.adapter,
|
|
168
|
+
error: result?.error instanceof Error ? result.error : new Error(String(result.error)),
|
|
98
169
|
});
|
|
99
|
-
}
|
|
170
|
+
}
|
|
171
|
+
// If we reach here, all adapters failed
|
|
172
|
+
const errorDetails = adapterErrors
|
|
173
|
+
.map(({ adapter, error }) => `${adapter}: ${error.message}`)
|
|
174
|
+
.join('; ');
|
|
175
|
+
throw new Error(`EvmPairDiscoveryService: All adapters failed for tokens ${params.tokenIn} and ${params.tokenOut} on network ${params.network}. Errors: ${errorDetails}`);
|
|
100
176
|
}
|
|
101
177
|
}
|
|
102
178
|
exports.EvmPairDiscoveryService = EvmPairDiscoveryService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair-discovery.service.js","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.service.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pair-discovery.service.js","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,28 @@ import { UniswapV2StyleDexEnum, V2DexDeployment } from '../../../protocols/v2-de
|
|
|
5
5
|
import { UniswapV3StyleDexEnum, UniV3Deployment } from '../../../protocols/v3-dex/v3-dex.types';
|
|
6
6
|
import { ChainIdEnum, ProtocolEnum } from '../../../types/enums';
|
|
7
7
|
import { LFJDeployment } from '../../../protocols/lfj/lfj.types';
|
|
8
|
+
import { ERC20TransferTaxResult } from '../../transfer-taxes/erc20-taxes.types';
|
|
8
9
|
export type SupportedEvmDexes = UniswapV3StyleDexEnum | UniswapV2StyleDexEnum | AlgebraDexTagEnum | Ve33StyleDeploymentEnum | ProtocolEnum.LFJ | ProtocolEnum.FOUR_MEME;
|
|
9
10
|
export type EvmDirectPoolAmountOutResponse = EvmDirectLegacyPoolAmountOutResponse | EvmDirectCLMMPoolAmountOutResponse | EvmDirectFourMemePoolAmountOutResponse;
|
|
10
11
|
export type UnifiedPoolAmountOutParams = EvmDirectPoolAmountOutParams | AlgebraPoolAmountOutParams | V2PoolAmountOutParams | Ve33PoolAmountOutParams | V3PoolAmountOutParams | LFJPoolAmountOutParams | FourMemePoolAmountOutParams;
|
|
11
12
|
export type EvmDexPairResponse = V2PairCandidate | V3PairCandidate | Ve33PairCandidate | FourMemePairCandidate | LfjV22PairCandidate;
|
|
12
13
|
export type GetEvmDexPairParams = {
|
|
14
|
+
/**
|
|
15
|
+
* The network to search for the pair on
|
|
16
|
+
*/
|
|
13
17
|
network: ChainIdEnum;
|
|
18
|
+
/**
|
|
19
|
+
* The input token address
|
|
20
|
+
*/
|
|
14
21
|
tokenIn: string;
|
|
22
|
+
/**
|
|
23
|
+
* The output token address
|
|
24
|
+
*/
|
|
15
25
|
tokenOut: string;
|
|
26
|
+
/**
|
|
27
|
+
* The expected pair for the tokenIn and tokenOut values. This
|
|
28
|
+
* value is validated by using the deterministic CREATE2 address calculations
|
|
29
|
+
*/
|
|
16
30
|
pair: string;
|
|
17
31
|
/**
|
|
18
32
|
* If amountIn is specified, slippage must be specified as well
|
|
@@ -30,6 +44,14 @@ export type GetEvmDexPairParams = {
|
|
|
30
44
|
* The price of the Quote Token for the Four.meme pair, in case the quote token is not BNB
|
|
31
45
|
*/
|
|
32
46
|
quoteTokenPrice?: number;
|
|
47
|
+
/**
|
|
48
|
+
* A sell transaction hash for the given token pair
|
|
49
|
+
*/
|
|
50
|
+
sellTxHash?: string;
|
|
51
|
+
/**
|
|
52
|
+
* (Optional) EOA that executed the sell transaction
|
|
53
|
+
*/
|
|
54
|
+
sellerEOA?: string;
|
|
33
55
|
};
|
|
34
56
|
export type EvmDirectPoolKey = `${SupportedEvmDexes}:${Address}:${ChainIdEnum}`;
|
|
35
57
|
export type EvmPairCandidate = {
|
|
@@ -47,6 +69,10 @@ export type EvmPairCandidate = {
|
|
|
47
69
|
* Only given if amountIn and slippage were provided in the request
|
|
48
70
|
*/
|
|
49
71
|
amountOutMin?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Only given if a valid TxHash and EOA were provided for transfer-tax calculation
|
|
74
|
+
*/
|
|
75
|
+
tokenInTransferTax?: ERC20TransferTaxResult;
|
|
50
76
|
};
|
|
51
77
|
export type EvmDirectPoolAmountOutParams = {
|
|
52
78
|
network: ChainIdEnum;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair-discovery.types.d.ts","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"pair-discovery.types.d.ts","sourceRoot":"","sources":["../../../../src/lib/dex/pair-discovery/pair-discovery.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { ChainIdEnum } from '../..';
|
|
3
|
+
export type DetermineERC20TransferTax = {
|
|
4
|
+
tokenIn: string;
|
|
5
|
+
tokenOut: string;
|
|
6
|
+
pairAddress: string;
|
|
7
|
+
network: ChainIdEnum;
|
|
8
|
+
client: ethers.JsonRpcProvider;
|
|
9
|
+
/**
|
|
10
|
+
* Sell transaction hash is required for tax calculation
|
|
11
|
+
*/
|
|
12
|
+
sellTxHash: string;
|
|
13
|
+
/**
|
|
14
|
+
* EOA address that executed the sell transaction - needed for accurate tax calculation
|
|
15
|
+
*/
|
|
16
|
+
sellTxEoa: string;
|
|
17
|
+
};
|
|
18
|
+
export type ERC20TransferTaxResult = {
|
|
19
|
+
address: string;
|
|
20
|
+
sellTaxBps: number;
|
|
21
|
+
};
|
|
22
|
+
export type ERC20TransferLog = {
|
|
23
|
+
from: string;
|
|
24
|
+
to: string;
|
|
25
|
+
value: bigint;
|
|
26
|
+
};
|
|
27
|
+
export type ERC20DirectionalTax = {
|
|
28
|
+
sellTaxBps: number;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=erc20-taxes.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-taxes.types.d.ts","sourceRoot":"","sources":["../../../src/lib/transfer-taxes/erc20-taxes.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3E,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-taxes.types.js","sourceRoot":"","sources":["../../../src/lib/transfer-taxes/erc20-taxes.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-tokenIn-taxes.d.ts","sourceRoot":"","sources":["../../../src/lib/transfer-taxes/erc20-tokenIn-taxes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAwIxF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,sBAAsB,CAAC,CA8DjC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.determineTokenInTransferTax = determineTokenInTransferTax;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
const constants_1 = require("../../utils/constants");
|
|
6
|
+
const is_native_1 = require("../../utils/is-native");
|
|
7
|
+
const wrapped_native_1 = require("../../utils/wrapped-native");
|
|
8
|
+
/* ----------------- constants & helpers ----------------- */
|
|
9
|
+
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
10
|
+
const SWAP_TOPIC = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822';
|
|
11
|
+
const KNOWN_SINKS = new Set([
|
|
12
|
+
constants_1.ZERO_ADDRESS.toLowerCase(),
|
|
13
|
+
'0x000000000000000000000000000000000000dead',
|
|
14
|
+
]);
|
|
15
|
+
function toChecksum(addr) {
|
|
16
|
+
return ethers_1.ethers.getAddress(addr);
|
|
17
|
+
}
|
|
18
|
+
function toBps(n, d) {
|
|
19
|
+
if (d <= 0n)
|
|
20
|
+
return 0;
|
|
21
|
+
return Number((n * 10000n) / d);
|
|
22
|
+
}
|
|
23
|
+
function parseTokenTransfersFor(receipt, token) {
|
|
24
|
+
const tokenLc = token.toLowerCase();
|
|
25
|
+
const out = [];
|
|
26
|
+
for (const log of receipt.logs) {
|
|
27
|
+
if (!log || !log.topics?.length)
|
|
28
|
+
continue;
|
|
29
|
+
if (log.address.toLowerCase() !== tokenLc)
|
|
30
|
+
continue;
|
|
31
|
+
if (!log?.topics[0])
|
|
32
|
+
continue;
|
|
33
|
+
if (log.topics[0].toLowerCase() !== TRANSFER_TOPIC)
|
|
34
|
+
continue;
|
|
35
|
+
if (log.topics.length < 3)
|
|
36
|
+
continue;
|
|
37
|
+
if (!log.topics[1])
|
|
38
|
+
continue;
|
|
39
|
+
if (!log.topics[2])
|
|
40
|
+
continue;
|
|
41
|
+
const from = `0x${log.topics[1].slice(26)}`.toLowerCase();
|
|
42
|
+
const to = `0x${log.topics[2].slice(26)}`.toLowerCase();
|
|
43
|
+
const value = BigInt(log.data);
|
|
44
|
+
// @ts-ignore
|
|
45
|
+
const index = log.index ?? log.logIndex ?? 0;
|
|
46
|
+
out.push({ from, to, value, index });
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
const pairAbi = [
|
|
51
|
+
'function token0() view returns (address)',
|
|
52
|
+
'function token1() view returns (address)',
|
|
53
|
+
'event Swap(address indexed sender,uint256 amount0In,uint256 amount1In,uint256 amount0Out,uint256 amount1Out,address indexed to)',
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Find and decode the Swap for this pair in this receipt.
|
|
57
|
+
* Returns the log index and decoded amounts.
|
|
58
|
+
*/
|
|
59
|
+
function hasSwapEvent(receipt, pair) {
|
|
60
|
+
const iface = new ethers_1.ethers.Interface(pairAbi);
|
|
61
|
+
for (const log of receipt.logs) {
|
|
62
|
+
if (log.address.toLowerCase() !== pair.toLowerCase())
|
|
63
|
+
continue;
|
|
64
|
+
if (!log?.topics[0])
|
|
65
|
+
continue;
|
|
66
|
+
if (log.topics[0].toLowerCase() !== SWAP_TOPIC)
|
|
67
|
+
continue;
|
|
68
|
+
const parsed = iface.parseLog({ topics: log.topics, data: log.data });
|
|
69
|
+
if (!parsed)
|
|
70
|
+
continue;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Sell tax (tokenIn): fee burned/redirected when user sells tokenIn tokens
|
|
77
|
+
* taxBps = feeToSinks / (userSentToPair + feeToSinks)
|
|
78
|
+
*/
|
|
79
|
+
function computeSellTaxBpsFromTx(tokenOutTransfers, pair, tokenOutAddr, userEoa) {
|
|
80
|
+
const pairLc = pair.toLowerCase();
|
|
81
|
+
const tokenLc = tokenOutAddr.toLowerCase();
|
|
82
|
+
const userEoaLc = userEoa.toLowerCase();
|
|
83
|
+
// console.log(`\n=== SELL TAX DEBUG ===`);
|
|
84
|
+
// console.log(`Token: ${tokenOutAddr}`);
|
|
85
|
+
// console.log(`Pair: ${pair}`);
|
|
86
|
+
// console.log(`UserEOA: ${userEoa}`);
|
|
87
|
+
// console.log(`SwapIndex: ${swapIndex}`);
|
|
88
|
+
// console.log(`Total transfers: ${tokenOutTransfers.length}`);
|
|
89
|
+
let userSentToPair = 0n;
|
|
90
|
+
let feeToSinks = 0n;
|
|
91
|
+
// Look for transfers from user (both before and after swap)
|
|
92
|
+
for (const t of tokenOutTransfers) {
|
|
93
|
+
if (t.from !== userEoaLc)
|
|
94
|
+
continue; // only transfers from the user
|
|
95
|
+
const isPairReceiving = t.to === pairLc;
|
|
96
|
+
const isSink = KNOWN_SINKS.has(t.to) || t.to === tokenLc;
|
|
97
|
+
// console.log(
|
|
98
|
+
// `User transfer: from=${t.from} to=${t.to} value=${t.value} index=${t.index} isPair=${isPairReceiving} isSink=${isSink}`,
|
|
99
|
+
// );
|
|
100
|
+
if (isPairReceiving) {
|
|
101
|
+
userSentToPair += t.value;
|
|
102
|
+
}
|
|
103
|
+
else if (isSink) {
|
|
104
|
+
feeToSinks += t.value;
|
|
105
|
+
}
|
|
106
|
+
// Ignore other transfers from user (might be approvals, etc.)
|
|
107
|
+
}
|
|
108
|
+
// console.log(`UserSentToPair: ${userSentToPair}`);
|
|
109
|
+
// console.log(`FeeToSinks: ${feeToSinks}`);
|
|
110
|
+
const totalUserSent = userSentToPair + feeToSinks;
|
|
111
|
+
// console.log(`TotalUserSent: ${totalUserSent}`);
|
|
112
|
+
if (totalUserSent === 0n)
|
|
113
|
+
return 0;
|
|
114
|
+
// Tax rate = fee / (amount to pair + fee)
|
|
115
|
+
const taxBps = toBps(feeToSinks, totalUserSent);
|
|
116
|
+
// console.log(`Sell Tax BPS: ${taxBps}`);
|
|
117
|
+
return taxBps;
|
|
118
|
+
}
|
|
119
|
+
/* ----------------- public entry ----------------- */
|
|
120
|
+
async function determineTokenInTransferTax(params) {
|
|
121
|
+
const { tokenIn, tokenOut, network, client, sellTxHash, pairAddress, sellTxEoa } = params;
|
|
122
|
+
const tokenInIsNative = (0, is_native_1.isNative)(tokenIn);
|
|
123
|
+
const tokenOutIsNative = (0, is_native_1.isNative)(tokenOut);
|
|
124
|
+
const wNative = wrapped_native_1.wrappedNativeTokens[network];
|
|
125
|
+
try {
|
|
126
|
+
// If tokenIn is native, no sell tax applies - return 0 immediately
|
|
127
|
+
if (tokenInIsNative) {
|
|
128
|
+
if (!wNative)
|
|
129
|
+
throw new Error(`No wrapped native token configured for network ${network}`);
|
|
130
|
+
return {
|
|
131
|
+
address: wNative,
|
|
132
|
+
sellTaxBps: 0,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (!pairAddress) {
|
|
136
|
+
throw new Error('pairAddress is required for EVM transfer-tax detection');
|
|
137
|
+
}
|
|
138
|
+
if (tokenInIsNative && tokenOutIsNative)
|
|
139
|
+
throw new Error('Both tokenIn and tokenOut cannot be native tokens');
|
|
140
|
+
const pair = toChecksum(pairAddress);
|
|
141
|
+
// Only calculate sell tax for tokenIn since that's what we care about
|
|
142
|
+
let tokenInSellTax = 0;
|
|
143
|
+
const receipt = await client.getTransactionReceipt(sellTxHash);
|
|
144
|
+
if (!receipt)
|
|
145
|
+
throw new Error(`Sell transaction ${sellTxHash} not found`);
|
|
146
|
+
const swap = hasSwapEvent(receipt, pair);
|
|
147
|
+
if (swap) {
|
|
148
|
+
// For sell tax we measure fee on tokenIn (the token being sold)
|
|
149
|
+
const tokenInForTax = toChecksum(tokenIn);
|
|
150
|
+
const transfersIn = parseTokenTransfersFor(receipt, tokenInForTax);
|
|
151
|
+
tokenInSellTax = computeSellTaxBpsFromTx(transfersIn, pair.toLowerCase(), tokenInForTax, sellTxEoa);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
address: toChecksum(tokenIn),
|
|
155
|
+
sellTaxBps: tokenInSellTax,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.log(`Error determining transfer tax for tokenIn ${tokenIn} on network ${network}:`, error);
|
|
160
|
+
return {
|
|
161
|
+
address: toChecksum(tokenIn),
|
|
162
|
+
sellTaxBps: 0,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=erc20-tokenIn-taxes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-tokenIn-taxes.js","sourceRoot":"","sources":["../../../src/lib/transfer-taxes/erc20-tokenIn-taxes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genius-intents",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.3-develop.0",
|
|
4
4
|
"description": "A unified SDK for interacting with intents-based protocols across multiple blockchains including Solana, Ethereum, and Sui",
|
|
5
5
|
"license": "GNU",
|
|
6
6
|
"author": "Samuel Videau <samuel@videau.io>, AltLoot <@altloot>, Satyam Kumar <skdbsp123@gmail.com>",
|