@shogun-sdk/intents-sdk 1.0.0 → 1.0.1
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/dist/_esm/chains.js +5 -0
- package/dist/_esm/chains.js.map +1 -1
- package/dist/_esm/constants.js +7 -0
- package/dist/_esm/constants.js.map +1 -1
- package/dist/_esm/core/sdk.js +24 -3
- package/dist/_esm/core/sdk.js.map +1 -1
- package/dist/_esm/errors/index.js +6 -0
- package/dist/_esm/errors/index.js.map +1 -1
- package/dist/_esm/index.js +1 -0
- package/dist/_esm/index.js.map +1 -1
- package/dist/_esm/utils/defillama.js +115 -0
- package/dist/_esm/utils/defillama.js.map +1 -0
- package/dist/_esm/utils/parsers.js +41 -0
- package/dist/_esm/utils/parsers.js.map +1 -1
- package/dist/_types/chains.d.ts +1 -0
- package/dist/_types/chains.d.ts.map +1 -1
- package/dist/_types/constants.d.ts +3 -0
- package/dist/_types/constants.d.ts.map +1 -1
- package/dist/_types/core/sdk.d.ts.map +1 -1
- package/dist/_types/errors/index.d.ts +3 -0
- package/dist/_types/errors/index.d.ts.map +1 -1
- package/dist/_types/index.d.ts +2 -0
- package/dist/_types/index.d.ts.map +1 -1
- package/dist/_types/types/intent.d.ts +2 -2
- package/dist/_types/types/intent.d.ts.map +1 -1
- package/dist/_types/utils/defillama.d.ts +61 -0
- package/dist/_types/utils/defillama.d.ts.map +1 -0
- package/dist/_types/utils/parsers.d.ts +15 -0
- package/dist/_types/utils/parsers.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/chains.ts +7 -0
- package/src/constants.ts +9 -0
- package/src/core/sdk.ts +28 -4
- package/src/errors/index.ts +7 -0
- package/src/index.ts +2 -0
- package/src/types/intent.ts +2 -2
- package/src/utils/defillama.ts +173 -0
- package/src/utils/parsers.ts +48 -0
package/dist/_esm/chains.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NATIVE_EVM_ETH_ADDRESSES } from './constants.js';
|
|
1
2
|
/**
|
|
2
3
|
* Represents the blockchain platform type
|
|
3
4
|
* Used to distinguish between different blockchain ecosystems
|
|
@@ -43,4 +44,8 @@ export const chainIdToChainTypeMap = {
|
|
|
43
44
|
[ChainID.Solana]: ChainType.Solana,
|
|
44
45
|
[ChainID.Sui]: ChainType.Sui,
|
|
45
46
|
};
|
|
47
|
+
export function isNativeTokenEvmAddress(tokenAddress) {
|
|
48
|
+
const normalizedAddress = tokenAddress.toLowerCase();
|
|
49
|
+
return NATIVE_EVM_ETH_ADDRESSES.some((addr) => addr.toLowerCase() === normalizedAddress);
|
|
50
|
+
}
|
|
46
51
|
//# sourceMappingURL=chains.js.map
|
package/dist/_esm/chains.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D;;;GAGG;AACH,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,8BAAiB,CAAA;IACjB,wBAAW,CAAA;AACb,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,iDAAgB,CAAA;IAChB,8CAAa,CAAA;IACb,wCAAW,CAAA;IACX,+CAAgB,CAAA;IAChB,qCAAS,CAAA;AACX,CAAC,EANW,OAAO,KAAP,OAAO,QAMlB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAU,CAAC;AA8BxH;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA2B,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC;AAEvH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG;IAC7B,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM;IAClC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG;CACpB,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IAC1D,MAAM,iBAAiB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAErD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC,CAAC;AAC3F,CAAC"}
|
package/dist/_esm/constants.js
CHANGED
|
@@ -29,6 +29,10 @@ export const SRC_CHAIN_GUARD = {
|
|
|
29
29
|
// [ChainID.Sui]:
|
|
30
30
|
// '0xd5057237ba5fe3d9aa00bb2a1555c3d3de77fd5653e72ce70f4aa0561fa9f04d',
|
|
31
31
|
// }
|
|
32
|
+
export const NATIVE_EVM_ETH_ADDRESSES = [
|
|
33
|
+
'0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
|
|
34
|
+
'0x0000000000000000000000000000000000000000',
|
|
35
|
+
];
|
|
32
36
|
export const NATIVE_SOLANA_TOKEN_ADDRESS = address('So11111111111111111111111111111111111111111');
|
|
33
37
|
export const WRAPPED_SOL_MINT_ADDRESS = address('So11111111111111111111111111111111111111112');
|
|
34
38
|
export const SUI_PACKAGE_ID = '0x6273e29f803ff5851f89ec17d40d5b1f367476e1677ad0a52ca408f64c4473fe';
|
|
@@ -43,4 +47,7 @@ export const AUCTIONEER_URL = 'http://127.0.0.1:8080';
|
|
|
43
47
|
export const MAX_UINT_64 = 2n ** 64n - 1n;
|
|
44
48
|
export const MAX_UINT_128 = 2n ** 128n - 1n;
|
|
45
49
|
export const MAX_UINT_256 = 2n ** 256n - 1n;
|
|
50
|
+
// Amount Calculation constants
|
|
51
|
+
export const REDUCTION_FACTOR = 0.8; // 80% of the input value
|
|
52
|
+
export const STABLECOIN_DECIMALS = 6; // USDC/USDT typically use 6 decimals
|
|
46
53
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;CACxE,CAAC;AAEF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,mBAAmB;AACnB,4EAA4E;AAC5E,IAAI;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAgD;IAC1E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;IACvE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,8CAA8C,CAAC;IACzE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,oEAAoE;CACpF,CAAC;AAEF,mFAAmF;AACnF,MAAM;AACN,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,iFAAiF;AACjF,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM;AAEN,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAEnG,0GAA0G;AAE1G,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF;;GAEG;AACH,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;CACxE,CAAC;AAEF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,mBAAmB;AACnB,4EAA4E;AAC5E,IAAI;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAgD;IAC1E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;IACvE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,8CAA8C,CAAC;IACzE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,oEAAoE;CACpF,CAAC;AAEF,mFAAmF;AACnF,MAAM;AACN,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,iFAAiF;AACjF,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM;AAEN,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAEnG,0GAA0G;AAE1G,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF;;GAEG;AACH,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAE5C,+BAA+B;AAC/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,yBAAyB;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,qCAAqC"}
|
package/dist/_esm/core/sdk.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { chainIdToChainTypeMap } from '../chains.js';
|
|
2
|
-
import { AUCTIONEER_URL } from '../constants.js';
|
|
2
|
+
import { AUCTIONEER_URL, } from '../constants.js';
|
|
3
3
|
import { NetworkError } from '../errors/index.js';
|
|
4
|
+
import { calculateAmounts } from '../utils/defillama.js';
|
|
4
5
|
import { Parsers } from '../utils/parsers.js';
|
|
5
6
|
import { Order } from './order.js';
|
|
6
7
|
/**
|
|
@@ -26,18 +27,38 @@ export class BaseSDK {
|
|
|
26
27
|
*/
|
|
27
28
|
async createOrder(params) {
|
|
28
29
|
const userAddress = await this.getUserAddress();
|
|
30
|
+
let minStablecoinAmount;
|
|
31
|
+
let destinationTokenMinAmount;
|
|
32
|
+
if (!params.minStablecoinAmount || !params.destinationTokenMinAmount) {
|
|
33
|
+
// Calculate missing values using DefiLlama
|
|
34
|
+
const { amountOut: calculatedAmountOut, minStablecoinsAmount: calculatedMinStablecoins } = await calculateAmounts({
|
|
35
|
+
srcChainId: params.sourceChainId,
|
|
36
|
+
tokenIn: params.sourceTokenAddress,
|
|
37
|
+
amountIn: params.sourceTokenAmount,
|
|
38
|
+
destChainId: params.destinationChainId,
|
|
39
|
+
tokenOut: params.destinationTokenAddress,
|
|
40
|
+
});
|
|
41
|
+
// Use provided values if available, otherwise use calculated ones
|
|
42
|
+
minStablecoinAmount = params.minStablecoinAmount ?? calculatedMinStablecoins;
|
|
43
|
+
destinationTokenMinAmount = params.destinationTokenMinAmount ?? calculatedAmountOut;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Both values provided, use them directly
|
|
47
|
+
minStablecoinAmount = params.minStablecoinAmount;
|
|
48
|
+
destinationTokenMinAmount = params.destinationTokenMinAmount;
|
|
49
|
+
}
|
|
29
50
|
// Order is validated upon creation
|
|
30
51
|
const order = await Order.create({
|
|
31
52
|
user: userAddress,
|
|
32
53
|
sourceChainId: params.sourceChainId,
|
|
33
54
|
sourceTokenAddress: params.sourceTokenAddress,
|
|
34
55
|
sourceTokenAmount: params.sourceTokenAmount,
|
|
35
|
-
minStablecoinAmount:
|
|
56
|
+
minStablecoinAmount: minStablecoinAmount,
|
|
36
57
|
deadline: params.deadline,
|
|
37
58
|
destinationAddress: params.destinationAddress,
|
|
38
59
|
destinationChainId: params.destinationChainId,
|
|
39
60
|
destinationTokenAddress: params.destinationTokenAddress,
|
|
40
|
-
destinationTokenMinAmount:
|
|
61
|
+
destinationTokenMinAmount: destinationTokenMinAmount,
|
|
41
62
|
extraTransfers: params.extraTransfers,
|
|
42
63
|
});
|
|
43
64
|
return this.prepareOrder(order);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,12 @@ export class InsufficientBalanceError extends BaseError {
|
|
|
76
76
|
Object.setPrototypeOf(this, InsufficientBalanceError.prototype);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
+
export class CalculateAmountError extends BaseError {
|
|
80
|
+
constructor(message, cause) {
|
|
81
|
+
super(message, cause);
|
|
82
|
+
Object.setPrototypeOf(this, CalculateAmountError.prototype);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
79
85
|
export class InsufficientAllowanceError extends BaseError {
|
|
80
86
|
constructor(message, cause) {
|
|
81
87
|
super(message, cause);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
package/dist/_esm/index.js
CHANGED
|
@@ -4,4 +4,5 @@ export { Order } from './core/order.js';
|
|
|
4
4
|
export { SolanaSDK } from './core/solana/sdk.js';
|
|
5
5
|
export { SuiSDK } from './core/sui/sdk.js';
|
|
6
6
|
export { ValidationError } from './errors/index.js';
|
|
7
|
+
export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/_esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ChainID, isNativeTokenEvmAddress } from '../chains';
|
|
2
|
+
import { NATIVE_SOLANA_TOKEN_ADDRESS, REDUCTION_FACTOR, STABLECOIN_DECIMALS, WRAPPED_SOL_MINT_ADDRESS } from '../constants';
|
|
3
|
+
import { CalculateAmountError } from '../errors';
|
|
4
|
+
import { Parsers } from './parsers';
|
|
5
|
+
const TOKEN_PRICE_BASE_URL = 'https://coins.llama.fi/prices/current/';
|
|
6
|
+
/**
|
|
7
|
+
* Maps chain IDs to their corresponding chain types
|
|
8
|
+
* Used to determine which SDK implementation to use for a given chain
|
|
9
|
+
*/
|
|
10
|
+
export const chainIdToDefiLlamaChainMap = {
|
|
11
|
+
[ChainID.Arbitrum]: 'arbitrum',
|
|
12
|
+
[ChainID.Base]: 'base',
|
|
13
|
+
[ChainID.Optimism]: 'optimism',
|
|
14
|
+
[ChainID.Solana]: 'solana',
|
|
15
|
+
[ChainID.Sui]: 'sui',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Creates DefiLlama coin key from chain ID and token address
|
|
19
|
+
* Format: "chainName:tokenAddress"
|
|
20
|
+
*/
|
|
21
|
+
export const createDefiLlamaCoinKey = (chainId, tokenAddress) => {
|
|
22
|
+
const chainName = chainIdToDefiLlamaChainMap[chainId];
|
|
23
|
+
if (!chainName) {
|
|
24
|
+
throw new CalculateAmountError(`Unsupported chain ID for DefiLlama: ${chainId}`);
|
|
25
|
+
}
|
|
26
|
+
return `${chainName}:${toDefiLlamaToken(tokenAddress)}`;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Retrieves token data from DefiLlama response by chain and address
|
|
30
|
+
*/
|
|
31
|
+
export const getCoinFromResponse = (response, chainId, tokenAddress) => {
|
|
32
|
+
const key = createDefiLlamaCoinKey(chainId, tokenAddress);
|
|
33
|
+
const coin = response.coins[key];
|
|
34
|
+
if (!coin) {
|
|
35
|
+
throw new CalculateAmountError(`DefiLlama coin not found for ${key}`);
|
|
36
|
+
}
|
|
37
|
+
return coin;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Converts Solana native token address to wrapped SOL mint address
|
|
41
|
+
* DefiLlama uses wrapped SOL mint address for native SOL
|
|
42
|
+
*
|
|
43
|
+
* @param tokenAddress The token address to convert
|
|
44
|
+
* @returns The DefiLlama-compatible token address
|
|
45
|
+
*/
|
|
46
|
+
function toDefiLlamaToken(tokenAddress) {
|
|
47
|
+
if (isNativeTokenEvmAddress(tokenAddress)) {
|
|
48
|
+
return '0x0000000000000000000000000000000000000000';
|
|
49
|
+
}
|
|
50
|
+
if (tokenAddress === NATIVE_SOLANA_TOKEN_ADDRESS) {
|
|
51
|
+
return WRAPPED_SOL_MINT_ADDRESS;
|
|
52
|
+
}
|
|
53
|
+
return tokenAddress;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Builds a comma-separated query string for DefiLlama API token requests
|
|
57
|
+
*
|
|
58
|
+
* Converts an array of chain/token pairs into the format expected by DefiLlama's
|
|
59
|
+
* bulk price endpoint: "chain1:token1,chain2:token2,..."
|
|
60
|
+
*
|
|
61
|
+
* @param tokens - Array of [ChainID, token address] tuples to query
|
|
62
|
+
* @returns Comma-separated string of DefiLlama coin keys
|
|
63
|
+
*
|
|
64
|
+
* @throws {CalculateAmountError} When any chain ID is not supported by DefiLlama
|
|
65
|
+
*/
|
|
66
|
+
function buildTokensQueryString(tokens) {
|
|
67
|
+
return tokens.map(([chainId, tokenAddress]) => createDefiLlamaCoinKey(chainId, tokenAddress)).join(',');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Fetch tokens data for array of coins
|
|
71
|
+
*
|
|
72
|
+
* @param tokens Array of [ChainID, Token Address] tuples
|
|
73
|
+
* @returns Promise resolving to DefiLlama tokens response
|
|
74
|
+
* @throws {CalculateAmountError} If the request fails or response is invalid
|
|
75
|
+
*/
|
|
76
|
+
export async function getTokensData(tokens) {
|
|
77
|
+
const tokensStr = buildTokensQueryString(tokens);
|
|
78
|
+
const url = `${TOKEN_PRICE_BASE_URL}${tokensStr}`;
|
|
79
|
+
const response = await fetch(url, {
|
|
80
|
+
method: 'GET',
|
|
81
|
+
headers: {
|
|
82
|
+
'Content-Type': 'application/json',
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new CalculateAmountError(`Failed to fetch token prices: ${response.status} ${response.statusText}`);
|
|
87
|
+
}
|
|
88
|
+
const data = await response.json();
|
|
89
|
+
return data;
|
|
90
|
+
}
|
|
91
|
+
export async function calculateAmounts({ srcChainId, tokenIn, amountIn, destChainId, tokenOut, }) {
|
|
92
|
+
// Fetch token data from DefiLlama
|
|
93
|
+
const tokensResponse = await getTokensData([
|
|
94
|
+
[srcChainId, tokenIn],
|
|
95
|
+
[destChainId, tokenOut],
|
|
96
|
+
]);
|
|
97
|
+
// Get token data for input token
|
|
98
|
+
const tokenInData = getCoinFromResponse(tokensResponse, srcChainId, tokenIn);
|
|
99
|
+
if (!tokenInData) {
|
|
100
|
+
throw new CalculateAmountError(`Token ${tokenIn} for chain ${srcChainId} not found in DefiLlama response`);
|
|
101
|
+
}
|
|
102
|
+
// Get token data for output token
|
|
103
|
+
const tokenOutData = getCoinFromResponse(tokensResponse, destChainId, tokenOut);
|
|
104
|
+
if (!tokenOutData) {
|
|
105
|
+
throw new CalculateAmountError(`Token ${tokenOut} for chain ${destChainId} not found in DefiLlama response`);
|
|
106
|
+
}
|
|
107
|
+
// Calculate 80% of the amount_in value as amount_out_min and min_stablecoins_amount
|
|
108
|
+
const tokenInUsdAmount = Parsers.bigintToFloat(amountIn, tokenInData.decimals) * tokenInData.price;
|
|
109
|
+
const amountInUsdReduced = tokenInUsdAmount * REDUCTION_FACTOR;
|
|
110
|
+
const amountOutReduced = amountInUsdReduced / tokenOutData.price;
|
|
111
|
+
const amountOut = Parsers.floatToBigint(amountOutReduced, tokenOutData.decimals);
|
|
112
|
+
const minStablecoinsAmount = Parsers.floatToBigint(amountInUsdReduced, STABLECOIN_DECIMALS);
|
|
113
|
+
return { amountOut, minStablecoinsAmount };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=defillama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defillama.js","sourceRoot":"","sources":["../../../src/utils/defillama.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-namespace */
|
|
2
|
+
import { formatUnits, parseUnits } from 'viem';
|
|
3
|
+
import { CalculateAmountError } from '../errors';
|
|
2
4
|
export var Parsers;
|
|
3
5
|
(function (Parsers) {
|
|
4
6
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -6,5 +8,44 @@ export var Parsers;
|
|
|
6
8
|
return typeof value === 'bigint' ? value.toString() : value;
|
|
7
9
|
}
|
|
8
10
|
Parsers.bigIntReplacer = bigIntReplacer;
|
|
11
|
+
/**
|
|
12
|
+
* Converts a bigint amount to a floating point USD value
|
|
13
|
+
* @param amount Amount in token's smallest unit
|
|
14
|
+
* @param decimals Number of decimal places for the token
|
|
15
|
+
* @returns USD value as number
|
|
16
|
+
*/
|
|
17
|
+
function bigintToFloat(amount, decimals) {
|
|
18
|
+
const formatted = formatUnits(amount, decimals);
|
|
19
|
+
const result = parseFloat(formatted);
|
|
20
|
+
if (!Number.isFinite(result)) {
|
|
21
|
+
throw new CalculateAmountError(`Conversion resulted in invalid number: ${formatted}`);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
Parsers.bigintToFloat = bigintToFloat;
|
|
26
|
+
/**
|
|
27
|
+
* Converts a floating point USD value to bigint amount
|
|
28
|
+
* Uses viem's parseUnits for consistency and reliability
|
|
29
|
+
* @param usdValue USD value as number
|
|
30
|
+
* @param decimals Number of decimal places for the token
|
|
31
|
+
* @returns Amount in token's smallest unit
|
|
32
|
+
*/
|
|
33
|
+
function floatToBigint(usdValue, decimals) {
|
|
34
|
+
if (!Number.isFinite(usdValue) || usdValue < 0) {
|
|
35
|
+
throw new CalculateAmountError(`Invalid USD value: ${usdValue}`);
|
|
36
|
+
}
|
|
37
|
+
if (decimals < 0 || decimals > 77) {
|
|
38
|
+
throw new CalculateAmountError(`Invalid decimals: ${decimals}`);
|
|
39
|
+
}
|
|
40
|
+
// Convert to fixed-precision string to avoid floating point issues
|
|
41
|
+
const valueString = usdValue.toFixed(decimals);
|
|
42
|
+
try {
|
|
43
|
+
return parseUnits(valueString, decimals);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new CalculateAmountError(`Failed to convert ${usdValue} to bigint with ${decimals} decimals: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
Parsers.floatToBigint = floatToBigint;
|
|
9
50
|
})(Parsers || (Parsers = {}));
|
|
10
51
|
//# sourceMappingURL=parsers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAAA,oDAAoD;
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,KAAW,OAAO,CAkDvB;AAlDD,WAAiB,OAAO;IACtB,8DAA8D;IAC9D,SAAgB,cAAc,CAAC,IAAY,EAAE,KAAU;QACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;IAFe,sBAAc,iBAE7B,CAAA;IAED;;;;;OAKG;IACH,SAAgB,aAAa,CAAC,MAAc,EAAE,QAAgB;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,oBAAoB,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IATe,qBAAa,gBAS5B,CAAA;IAED;;;;;;OAMG;IACH,SAAgB,aAAa,CAAC,QAAgB,EAAE,QAAgB;QAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAoB,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,mEAAmE;QACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAC5B,qBAAqB,QAAQ,mBAAmB,QAAQ,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACjI,CAAC;QACJ,CAAC;IACH,CAAC;IAnBe,qBAAa,gBAmB5B,CAAA;AACH,CAAC,EAlDgB,OAAO,KAAP,OAAO,QAkDvB"}
|
package/dist/_types/chains.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAED;;;;GAIG;AACH,oBAAY,OAAO;IACjB,QAAQ,QAAQ;IAChB,QAAQ,KAAK;IACb,IAAI,OAAO;IACX,MAAM,UAAU;IAChB,GAAG,MAAM;CACV;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,0FAA2F,CAAC;AAExH;;;GAGG;AACH,KAAK,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,cAA2D,CAAC;AAEvH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAIrE"}
|
|
@@ -3,6 +3,7 @@ import type { Address, Hex } from 'viem';
|
|
|
3
3
|
import type { SupportedChain, SupportedEvmChain } from './chains.js';
|
|
4
4
|
export declare const PERMIT2_ADDRESS: Record<SupportedEvmChain, Address>;
|
|
5
5
|
export declare const SRC_CHAIN_GUARD: Record<SupportedChain, SolanaAddress | Hex>;
|
|
6
|
+
export declare const NATIVE_EVM_ETH_ADDRESSES: string[];
|
|
6
7
|
export declare const NATIVE_SOLANA_TOKEN_ADDRESS: SolanaAddress<"So11111111111111111111111111111111111111111">;
|
|
7
8
|
export declare const WRAPPED_SOL_MINT_ADDRESS: SolanaAddress<"So11111111111111111111111111111111111111112">;
|
|
8
9
|
export declare const SUI_PACKAGE_ID = "0x6273e29f803ff5851f89ec17d40d5b1f367476e1677ad0a52ca408f64c4473fe";
|
|
@@ -15,4 +16,6 @@ export declare const AUCTIONEER_URL = "http://127.0.0.1:8080";
|
|
|
15
16
|
export declare const MAX_UINT_64: bigint;
|
|
16
17
|
export declare const MAX_UINT_128: bigint;
|
|
17
18
|
export declare const MAX_UINT_256: bigint;
|
|
19
|
+
export declare const REDUCTION_FACTOR = 0.8;
|
|
20
|
+
export declare const STABLECOIN_DECIMALS = 6;
|
|
18
21
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAI9D,CAAC;AAWF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,GAAG,GAAG,CAMvE,CAAC;AAYF,eAAO,MAAM,2BAA2B,8DAAyD,CAAC;AAElG,eAAO,MAAM,wBAAwB,8DAAyD,CAAC;AAE/F,eAAO,MAAM,cAAc,uEAAuE,CAAC;AAInG,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF;;GAEG;AAEH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,eAAO,MAAM,WAAW,QAAiB,CAAC;AAC1C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,QAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAI9D,CAAC;AAWF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,GAAG,GAAG,CAMvE,CAAC;AAYF,eAAO,MAAM,wBAAwB,UAGpC,CAAC;AAEF,eAAO,MAAM,2BAA2B,8DAAyD,CAAC;AAElG,eAAO,MAAM,wBAAwB,8DAAyD,CAAC;AAE/F,eAAO,MAAM,cAAc,uEAAuE,CAAC;AAInG,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF;;GAEG;AAEH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,eAAO,MAAM,WAAW,QAAiB,CAAC;AAC1C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAG5C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,mBAAmB,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAG9F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,8BAAsB,OAAO;IAC3B;;;;;OAKG;aACa,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAEjD;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;IAErE;;;;;;;;;;;;OAYG;IACU,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C3E;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK7E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;;;;;;;;;;OAYG;IACU,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA0BxE"}
|
|
@@ -25,6 +25,9 @@ export declare class NetworkError extends BaseError {
|
|
|
25
25
|
export declare class InsufficientBalanceError extends BaseError {
|
|
26
26
|
constructor(message: string, cause?: unknown);
|
|
27
27
|
}
|
|
28
|
+
export declare class CalculateAmountError extends BaseError {
|
|
29
|
+
constructor(message: string, cause?: unknown);
|
|
30
|
+
}
|
|
28
31
|
export declare class InsufficientAllowanceError extends BaseError {
|
|
29
32
|
constructor(message: string, cause?: unknown);
|
|
30
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;aAGP,KAAK,CAAC,EAAE,OAAO;gBADxC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,OAAO,YAAA;IAQnC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC,OAAO,CAAC,WAAW;CAapB;AAGD,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAGD,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,0BAA2B,SAAQ,SAAS;gBAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAcrD"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;aAGP,KAAK,CAAC,EAAE,OAAO;gBADxC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,OAAO,YAAA;IAQnC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC,OAAO,CAAC,WAAW;CAapB;AAGD,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAGD,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,0BAA2B,SAAQ,SAAS;gBAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAcrD"}
|
package/dist/_types/index.d.ts
CHANGED
|
@@ -6,5 +6,7 @@ export { Order } from './core/order.js';
|
|
|
6
6
|
export { SolanaSDK } from './core/solana/sdk.js';
|
|
7
7
|
export { SuiSDK } from './core/sui/sdk.js';
|
|
8
8
|
export { ValidationError } from './errors/index.js';
|
|
9
|
+
export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
|
|
10
|
+
export type { DefiLlamaCoinData, DefiLlamaTokensResponse } from './utils/defillama.js';
|
|
9
11
|
export type { CreateOrderParams } from './types/intent.js';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChJ,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACvF,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -16,11 +16,11 @@ export type CreateOrderParams = {
|
|
|
16
16
|
/** Token address on the destination chain to receive */
|
|
17
17
|
destinationTokenAddress: string;
|
|
18
18
|
/** Minimum amount of destination tokens to receive, in smallest units */
|
|
19
|
-
destinationTokenMinAmount
|
|
19
|
+
destinationTokenMinAmount?: bigint;
|
|
20
20
|
/** Recipient wallet address on the destination chain */
|
|
21
21
|
destinationAddress: string;
|
|
22
22
|
/** Minimum amount of stablecoins in the intermediate swap, in smallest units */
|
|
23
|
-
minStablecoinAmount
|
|
23
|
+
minStablecoinAmount?: bigint;
|
|
24
24
|
/** Timestamp (in seconds) after which the order expires */
|
|
25
25
|
deadline: number;
|
|
26
26
|
/** Extra Transfers */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/types/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8CAA8C;IAC9C,aAAa,EAAE,cAAc,CAAC;IAC9B,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAE1B,6CAA6C;IAC7C,kBAAkB,EAAE,cAAc,CAAC;IACnC,wDAAwD;IACxD,uBAAuB,EAAE,MAAM,CAAC;IAChC,yEAAyE;IACzE,yBAAyB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/types/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8CAA8C;IAC9C,aAAa,EAAE,cAAc,CAAC;IAC9B,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAE1B,6CAA6C;IAC7C,kBAAkB,EAAE,cAAc,CAAC;IACnC,wDAAwD;IACxD,uBAAuB,EAAE,MAAM,CAAC;IAChC,yEAAyE;IACzE,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IAEjB,sBAAsB;IACtB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6CAA6C;IAC7C,WAAW,EAAE,cAAc,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iCAAiC;IACjC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;AACjC,8EAA8E;AAC9E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,UAAU,EAAE,cAAc,CAAC;IAC3B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,oBAAoB,EAAE,oBAAoB,CAAC;CAC5C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,wCAAwC;IACxC,WAAW,EAAE,eAAe,CAAC;IAC7B,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,iBAAiB,EAAE;QACjB,iEAAiE;QACjE,GAAG,CAAC,EAAE,eAAe,CAAC;QACtB,2BAA2B;QAC3B,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAC5B,wBAAwB;QACxB,GAAG,CAAC,EAAE,kBAAkB,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEvF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;IACb,qDAAqD;IACrD,YAAY,EAAE,iBAAiB,CAAC;CAGjC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ChainID, type SupportedChain } from '../chains';
|
|
2
|
+
/**
|
|
3
|
+
* Response structure from DefiLlama API for token prices
|
|
4
|
+
*/
|
|
5
|
+
export interface DefiLlamaTokensResponse {
|
|
6
|
+
coins: Record<string, DefiLlamaCoinData>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Individual token data from DefiLlama API
|
|
10
|
+
*/
|
|
11
|
+
export interface DefiLlamaCoinData {
|
|
12
|
+
/** Number of decimal places for the token */
|
|
13
|
+
decimals: number;
|
|
14
|
+
/** Token symbol (e.g., "ETH", "USDC") */
|
|
15
|
+
symbol: string;
|
|
16
|
+
/** Current price in USD */
|
|
17
|
+
price: number;
|
|
18
|
+
/** Unix timestamp of the price data */
|
|
19
|
+
timestamp: number;
|
|
20
|
+
/** Confidence level of the price data (0-1) */
|
|
21
|
+
confidence: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Maps chain IDs to their corresponding chain types
|
|
25
|
+
* Used to determine which SDK implementation to use for a given chain
|
|
26
|
+
*/
|
|
27
|
+
export declare const chainIdToDefiLlamaChainMap: {
|
|
28
|
+
readonly 42161: "arbitrum";
|
|
29
|
+
readonly 8453: "base";
|
|
30
|
+
readonly 10: "optimism";
|
|
31
|
+
readonly 7565164: "solana";
|
|
32
|
+
readonly 101: "sui";
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Creates DefiLlama coin key from chain ID and token address
|
|
36
|
+
* Format: "chainName:tokenAddress"
|
|
37
|
+
*/
|
|
38
|
+
export declare const createDefiLlamaCoinKey: (chainId: ChainID, tokenAddress: string) => string;
|
|
39
|
+
/**
|
|
40
|
+
* Retrieves token data from DefiLlama response by chain and address
|
|
41
|
+
*/
|
|
42
|
+
export declare const getCoinFromResponse: (response: DefiLlamaTokensResponse, chainId: ChainID, tokenAddress: string) => DefiLlamaCoinData;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch tokens data for array of coins
|
|
45
|
+
*
|
|
46
|
+
* @param tokens Array of [ChainID, Token Address] tuples
|
|
47
|
+
* @returns Promise resolving to DefiLlama tokens response
|
|
48
|
+
* @throws {CalculateAmountError} If the request fails or response is invalid
|
|
49
|
+
*/
|
|
50
|
+
export declare function getTokensData(tokens: Array<[ChainID, string]>): Promise<DefiLlamaTokensResponse>;
|
|
51
|
+
export declare function calculateAmounts({ srcChainId, tokenIn, amountIn, destChainId, tokenOut, }: {
|
|
52
|
+
srcChainId: SupportedChain;
|
|
53
|
+
tokenIn: string;
|
|
54
|
+
amountIn: bigint;
|
|
55
|
+
destChainId: SupportedChain;
|
|
56
|
+
tokenOut: string;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
amountOut: bigint;
|
|
59
|
+
minStablecoinsAmount: bigint;
|
|
60
|
+
}>;
|
|
61
|
+
//# sourceMappingURL=defillama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defillama.d.ts","sourceRoot":"","sources":["../../../src/utils/defillama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAOlF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;CAM7B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,EAAE,cAAc,MAAM,KAAG,MAO/E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,uBAAuB,EACjC,SAAS,OAAO,EAChB,cAAc,MAAM,KACnB,iBASF,CAAC;AAoCF;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAiBtG;AACD,wBAAsB,gBAAgB,CAAC,EACnC,UAAU,EACV,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B/D"}
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
export declare namespace Parsers {
|
|
2
2
|
function bigIntReplacer(_key: string, value: any): any;
|
|
3
|
+
/**
|
|
4
|
+
* Converts a bigint amount to a floating point USD value
|
|
5
|
+
* @param amount Amount in token's smallest unit
|
|
6
|
+
* @param decimals Number of decimal places for the token
|
|
7
|
+
* @returns USD value as number
|
|
8
|
+
*/
|
|
9
|
+
function bigintToFloat(amount: bigint, decimals: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Converts a floating point USD value to bigint amount
|
|
12
|
+
* Uses viem's parseUnits for consistency and reliability
|
|
13
|
+
* @param usdValue USD value as number
|
|
14
|
+
* @param decimals Number of decimal places for the token
|
|
15
|
+
* @returns Amount in token's smallest unit
|
|
16
|
+
*/
|
|
17
|
+
function floatToBigint(usdValue: number, decimals: number): bigint;
|
|
3
18
|
}
|
|
4
19
|
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAKA,yBAAiB,OAAO,CAAC;IAEvB,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAE5D;IAED;;;;;OAKG;IACH,SAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStE;IAED;;;;;;OAMG;IACH,SAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBxE;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shogun-sdk/intents-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shogun Network Intent-based cross-chain swaps SDK",
|
|
6
6
|
"author": "Shogun network",
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"@solana-program/system": "^0.7.0",
|
|
48
48
|
"@solana-program/token": "^0.5.1",
|
|
49
49
|
"@solana/kit": "^2.1.0",
|
|
50
|
-
"viem": "
|
|
50
|
+
"viem": "2.31.0"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
|
-
"build": "pnpm clean && pnpm build:
|
|
53
|
+
"build": "pnpm clean && pnpm build:types && pnpm build:esm",
|
|
54
54
|
"build:esm": "tsc --project ./tsconfig.build.json --module es2015 --outDir ./dist/_esm && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./dist/_esm/package.json",
|
|
55
55
|
"build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./dist/_types --emitDeclarationOnly --declaration --declarationMap",
|
|
56
56
|
"clean": "rm -rf ./dist",
|
package/src/chains.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NATIVE_EVM_ETH_ADDRESSES } from './constants.js';
|
|
1
2
|
import type { TupleToUnion } from './utils/type-utils.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -75,3 +76,9 @@ export const chainIdToChainTypeMap = {
|
|
|
75
76
|
[ChainID.Solana]: ChainType.Solana,
|
|
76
77
|
[ChainID.Sui]: ChainType.Sui,
|
|
77
78
|
} as const;
|
|
79
|
+
|
|
80
|
+
export function isNativeTokenEvmAddress(tokenAddress: string): boolean {
|
|
81
|
+
const normalizedAddress = tokenAddress.toLowerCase();
|
|
82
|
+
|
|
83
|
+
return NATIVE_EVM_ETH_ADDRESSES.some((addr) => addr.toLowerCase() === normalizedAddress);
|
|
84
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -36,6 +36,11 @@ export const SRC_CHAIN_GUARD: Record<SupportedChain, SolanaAddress | Hex> = {
|
|
|
36
36
|
// '0xd5057237ba5fe3d9aa00bb2a1555c3d3de77fd5653e72ce70f4aa0561fa9f04d',
|
|
37
37
|
// }
|
|
38
38
|
|
|
39
|
+
export const NATIVE_EVM_ETH_ADDRESSES = [
|
|
40
|
+
'0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
|
|
41
|
+
'0x0000000000000000000000000000000000000000',
|
|
42
|
+
];
|
|
43
|
+
|
|
39
44
|
export const NATIVE_SOLANA_TOKEN_ADDRESS = address('So11111111111111111111111111111111111111111');
|
|
40
45
|
|
|
41
46
|
export const WRAPPED_SOL_MINT_ADDRESS = address('So11111111111111111111111111111111111111112');
|
|
@@ -59,3 +64,7 @@ export const AUCTIONEER_URL = 'http://127.0.0.1:8080';
|
|
|
59
64
|
export const MAX_UINT_64 = 2n ** 64n - 1n;
|
|
60
65
|
export const MAX_UINT_128 = 2n ** 128n - 1n;
|
|
61
66
|
export const MAX_UINT_256 = 2n ** 256n - 1n;
|
|
67
|
+
|
|
68
|
+
// Amount Calculation constants
|
|
69
|
+
export const REDUCTION_FACTOR = 0.8; // 80% of the input value
|
|
70
|
+
export const STABLECOIN_DECIMALS = 6; // USDC/USDT typically use 6 decimals
|
package/src/core/sdk.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { chainIdToChainTypeMap } from '../chains.js';
|
|
2
|
-
import { AUCTIONEER_URL
|
|
3
|
-
import {
|
|
2
|
+
import { AUCTIONEER_URL, } from '../constants.js';
|
|
3
|
+
import { NetworkError } from '../errors/index.js';
|
|
4
4
|
import type { CreateOrderParams, PreparedOrder, UserIntentRequest } from '../types/intent.js';
|
|
5
|
+
import { calculateAmounts } from '../utils/defillama.js';
|
|
5
6
|
import { Parsers } from '../utils/parsers.js';
|
|
6
7
|
import { Order } from './order.js';
|
|
7
8
|
|
|
@@ -52,18 +53,41 @@ export abstract class BaseSDK {
|
|
|
52
53
|
public async createOrder(params: CreateOrderParams): Promise<PreparedOrder> {
|
|
53
54
|
const userAddress = await this.getUserAddress();
|
|
54
55
|
|
|
56
|
+
let minStablecoinAmount: bigint;
|
|
57
|
+
let destinationTokenMinAmount: bigint;
|
|
58
|
+
|
|
59
|
+
if (!params.minStablecoinAmount || !params.destinationTokenMinAmount) {
|
|
60
|
+
// Calculate missing values using DefiLlama
|
|
61
|
+
const { amountOut: calculatedAmountOut, minStablecoinsAmount: calculatedMinStablecoins } =
|
|
62
|
+
await calculateAmounts({
|
|
63
|
+
srcChainId: params.sourceChainId,
|
|
64
|
+
tokenIn: params.sourceTokenAddress,
|
|
65
|
+
amountIn: params.sourceTokenAmount,
|
|
66
|
+
destChainId: params.destinationChainId,
|
|
67
|
+
tokenOut: params.destinationTokenAddress,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Use provided values if available, otherwise use calculated ones
|
|
71
|
+
minStablecoinAmount = params.minStablecoinAmount ?? calculatedMinStablecoins;
|
|
72
|
+
destinationTokenMinAmount = params.destinationTokenMinAmount ?? calculatedAmountOut;
|
|
73
|
+
} else {
|
|
74
|
+
// Both values provided, use them directly
|
|
75
|
+
minStablecoinAmount = params.minStablecoinAmount;
|
|
76
|
+
destinationTokenMinAmount = params.destinationTokenMinAmount;
|
|
77
|
+
}
|
|
78
|
+
|
|
55
79
|
// Order is validated upon creation
|
|
56
80
|
const order = await Order.create({
|
|
57
81
|
user: userAddress,
|
|
58
82
|
sourceChainId: params.sourceChainId,
|
|
59
83
|
sourceTokenAddress: params.sourceTokenAddress,
|
|
60
84
|
sourceTokenAmount: params.sourceTokenAmount,
|
|
61
|
-
minStablecoinAmount:
|
|
85
|
+
minStablecoinAmount: minStablecoinAmount,
|
|
62
86
|
deadline: params.deadline,
|
|
63
87
|
destinationAddress: params.destinationAddress,
|
|
64
88
|
destinationChainId: params.destinationChainId,
|
|
65
89
|
destinationTokenAddress: params.destinationTokenAddress,
|
|
66
|
-
destinationTokenMinAmount:
|
|
90
|
+
destinationTokenMinAmount: destinationTokenMinAmount,
|
|
67
91
|
extraTransfers: params.extraTransfers,
|
|
68
92
|
});
|
|
69
93
|
|
package/src/errors/index.ts
CHANGED
|
@@ -83,6 +83,13 @@ export class InsufficientBalanceError extends BaseError {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
export class CalculateAmountError extends BaseError {
|
|
87
|
+
constructor(message: string, cause?: unknown) {
|
|
88
|
+
super(message, cause);
|
|
89
|
+
Object.setPrototypeOf(this, CalculateAmountError.prototype);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
86
93
|
export class InsufficientAllowanceError extends BaseError {
|
|
87
94
|
constructor(message: string, cause?: unknown) {
|
|
88
95
|
super(message, cause);
|
package/src/index.ts
CHANGED
|
@@ -7,4 +7,6 @@ export { Order } from './core/order.js';
|
|
|
7
7
|
export { SolanaSDK } from './core/solana/sdk.js';
|
|
8
8
|
export { SuiSDK } from './core/sui/sdk.js';
|
|
9
9
|
export { ValidationError } from './errors/index.js';
|
|
10
|
+
export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
|
|
11
|
+
export type { DefiLlamaCoinData, DefiLlamaTokensResponse } from './utils/defillama.js';
|
|
10
12
|
export type { CreateOrderParams } from './types/intent.js';
|
package/src/types/intent.ts
CHANGED
|
@@ -18,12 +18,12 @@ export type CreateOrderParams = {
|
|
|
18
18
|
/** Token address on the destination chain to receive */
|
|
19
19
|
destinationTokenAddress: string;
|
|
20
20
|
/** Minimum amount of destination tokens to receive, in smallest units */
|
|
21
|
-
destinationTokenMinAmount
|
|
21
|
+
destinationTokenMinAmount?: bigint;
|
|
22
22
|
/** Recipient wallet address on the destination chain */
|
|
23
23
|
destinationAddress: string;
|
|
24
24
|
|
|
25
25
|
/** Minimum amount of stablecoins in the intermediate swap, in smallest units */
|
|
26
|
-
minStablecoinAmount
|
|
26
|
+
minStablecoinAmount?: bigint;
|
|
27
27
|
/** Timestamp (in seconds) after which the order expires */
|
|
28
28
|
deadline: number;
|
|
29
29
|
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { ChainID, isNativeTokenEvmAddress, type SupportedChain } from '../chains';
|
|
2
|
+
import { NATIVE_SOLANA_TOKEN_ADDRESS, REDUCTION_FACTOR, STABLECOIN_DECIMALS, WRAPPED_SOL_MINT_ADDRESS } from '../constants';
|
|
3
|
+
import { CalculateAmountError } from '../errors';
|
|
4
|
+
import { Parsers } from './parsers';
|
|
5
|
+
|
|
6
|
+
const TOKEN_PRICE_BASE_URL: string = 'https://coins.llama.fi/prices/current/';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Response structure from DefiLlama API for token prices
|
|
10
|
+
*/
|
|
11
|
+
export interface DefiLlamaTokensResponse {
|
|
12
|
+
coins: Record<string, DefiLlamaCoinData>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Individual token data from DefiLlama API
|
|
17
|
+
*/
|
|
18
|
+
export interface DefiLlamaCoinData {
|
|
19
|
+
/** Number of decimal places for the token */
|
|
20
|
+
decimals: number;
|
|
21
|
+
/** Token symbol (e.g., "ETH", "USDC") */
|
|
22
|
+
symbol: string;
|
|
23
|
+
/** Current price in USD */
|
|
24
|
+
price: number;
|
|
25
|
+
/** Unix timestamp of the price data */
|
|
26
|
+
timestamp: number;
|
|
27
|
+
/** Confidence level of the price data (0-1) */
|
|
28
|
+
confidence: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Maps chain IDs to their corresponding chain types
|
|
33
|
+
* Used to determine which SDK implementation to use for a given chain
|
|
34
|
+
*/
|
|
35
|
+
export const chainIdToDefiLlamaChainMap = {
|
|
36
|
+
[ChainID.Arbitrum]: 'arbitrum',
|
|
37
|
+
[ChainID.Base]: 'base',
|
|
38
|
+
[ChainID.Optimism]: 'optimism',
|
|
39
|
+
[ChainID.Solana]: 'solana',
|
|
40
|
+
[ChainID.Sui]: 'sui',
|
|
41
|
+
} as const;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Creates DefiLlama coin key from chain ID and token address
|
|
45
|
+
* Format: "chainName:tokenAddress"
|
|
46
|
+
*/
|
|
47
|
+
export const createDefiLlamaCoinKey = (chainId: ChainID, tokenAddress: string): string => {
|
|
48
|
+
const chainName = chainIdToDefiLlamaChainMap[chainId];
|
|
49
|
+
if (!chainName) {
|
|
50
|
+
throw new CalculateAmountError(`Unsupported chain ID for DefiLlama: ${chainId}`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return `${chainName}:${toDefiLlamaToken(tokenAddress)}`;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Retrieves token data from DefiLlama response by chain and address
|
|
58
|
+
*/
|
|
59
|
+
export const getCoinFromResponse = (
|
|
60
|
+
response: DefiLlamaTokensResponse,
|
|
61
|
+
chainId: ChainID,
|
|
62
|
+
tokenAddress: string,
|
|
63
|
+
): DefiLlamaCoinData => {
|
|
64
|
+
const key = createDefiLlamaCoinKey(chainId, tokenAddress);
|
|
65
|
+
const coin = response.coins[key];
|
|
66
|
+
|
|
67
|
+
if (!coin) {
|
|
68
|
+
throw new CalculateAmountError(`DefiLlama coin not found for ${key}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return coin;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Converts Solana native token address to wrapped SOL mint address
|
|
76
|
+
* DefiLlama uses wrapped SOL mint address for native SOL
|
|
77
|
+
*
|
|
78
|
+
* @param tokenAddress The token address to convert
|
|
79
|
+
* @returns The DefiLlama-compatible token address
|
|
80
|
+
*/
|
|
81
|
+
function toDefiLlamaToken(tokenAddress: string): string {
|
|
82
|
+
if (isNativeTokenEvmAddress(tokenAddress)) {
|
|
83
|
+
return '0x0000000000000000000000000000000000000000';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (tokenAddress === NATIVE_SOLANA_TOKEN_ADDRESS) {
|
|
87
|
+
return WRAPPED_SOL_MINT_ADDRESS;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return tokenAddress;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Builds a comma-separated query string for DefiLlama API token requests
|
|
95
|
+
*
|
|
96
|
+
* Converts an array of chain/token pairs into the format expected by DefiLlama's
|
|
97
|
+
* bulk price endpoint: "chain1:token1,chain2:token2,..."
|
|
98
|
+
*
|
|
99
|
+
* @param tokens - Array of [ChainID, token address] tuples to query
|
|
100
|
+
* @returns Comma-separated string of DefiLlama coin keys
|
|
101
|
+
*
|
|
102
|
+
* @throws {CalculateAmountError} When any chain ID is not supported by DefiLlama
|
|
103
|
+
*/
|
|
104
|
+
function buildTokensQueryString(tokens: Array<[ChainID, string]>): string {
|
|
105
|
+
return tokens.map(([chainId, tokenAddress]) => createDefiLlamaCoinKey(chainId, tokenAddress)).join(',');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Fetch tokens data for array of coins
|
|
110
|
+
*
|
|
111
|
+
* @param tokens Array of [ChainID, Token Address] tuples
|
|
112
|
+
* @returns Promise resolving to DefiLlama tokens response
|
|
113
|
+
* @throws {CalculateAmountError} If the request fails or response is invalid
|
|
114
|
+
*/
|
|
115
|
+
export async function getTokensData(tokens: Array<[ChainID, string]>): Promise<DefiLlamaTokensResponse> {
|
|
116
|
+
const tokensStr = buildTokensQueryString(tokens);
|
|
117
|
+
|
|
118
|
+
const url = `${TOKEN_PRICE_BASE_URL}${tokensStr}`;
|
|
119
|
+
const response = await fetch(url, {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
headers: {
|
|
122
|
+
'Content-Type': 'application/json',
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
throw new CalculateAmountError(`Failed to fetch token prices: ${response.status} ${response.statusText}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const data: DefiLlamaTokensResponse = await response.json();
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
export async function calculateAmounts({
|
|
134
|
+
srcChainId,
|
|
135
|
+
tokenIn,
|
|
136
|
+
amountIn,
|
|
137
|
+
destChainId,
|
|
138
|
+
tokenOut,
|
|
139
|
+
}: {
|
|
140
|
+
srcChainId: SupportedChain;
|
|
141
|
+
tokenIn: string;
|
|
142
|
+
amountIn: bigint;
|
|
143
|
+
destChainId: SupportedChain;
|
|
144
|
+
tokenOut: string;
|
|
145
|
+
}): Promise<{ amountOut: bigint; minStablecoinsAmount: bigint }> {
|
|
146
|
+
// Fetch token data from DefiLlama
|
|
147
|
+
const tokensResponse = await getTokensData([
|
|
148
|
+
[srcChainId, tokenIn],
|
|
149
|
+
[destChainId, tokenOut],
|
|
150
|
+
]);
|
|
151
|
+
|
|
152
|
+
// Get token data for input token
|
|
153
|
+
const tokenInData = getCoinFromResponse(tokensResponse, srcChainId, tokenIn);
|
|
154
|
+
if (!tokenInData) {
|
|
155
|
+
throw new CalculateAmountError(`Token ${tokenIn} for chain ${srcChainId} not found in DefiLlama response`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Get token data for output token
|
|
159
|
+
const tokenOutData = getCoinFromResponse(tokensResponse, destChainId, tokenOut);
|
|
160
|
+
if (!tokenOutData) {
|
|
161
|
+
throw new CalculateAmountError(`Token ${tokenOut} for chain ${destChainId} not found in DefiLlama response`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Calculate 80% of the amount_in value as amount_out_min and min_stablecoins_amount
|
|
165
|
+
const tokenInUsdAmount = Parsers.bigintToFloat(amountIn, tokenInData.decimals) * tokenInData.price;
|
|
166
|
+
const amountInUsdReduced = tokenInUsdAmount * REDUCTION_FACTOR;
|
|
167
|
+
const amountOutReduced = amountInUsdReduced / tokenOutData.price;
|
|
168
|
+
|
|
169
|
+
const amountOut = Parsers.floatToBigint(amountOutReduced, tokenOutData.decimals);
|
|
170
|
+
const minStablecoinsAmount = Parsers.floatToBigint(amountInUsdReduced, STABLECOIN_DECIMALS);
|
|
171
|
+
|
|
172
|
+
return { amountOut, minStablecoinsAmount };
|
|
173
|
+
}
|
package/src/utils/parsers.ts
CHANGED
|
@@ -1,8 +1,56 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-namespace */
|
|
2
|
+
import { formatUnits, parseUnits } from 'viem';
|
|
3
|
+
|
|
4
|
+
import { CalculateAmountError } from '../errors';
|
|
2
5
|
|
|
3
6
|
export namespace Parsers {
|
|
4
7
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
8
|
export function bigIntReplacer(_key: string, value: any): any {
|
|
6
9
|
return typeof value === 'bigint' ? value.toString() : value;
|
|
7
10
|
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Converts a bigint amount to a floating point USD value
|
|
14
|
+
* @param amount Amount in token's smallest unit
|
|
15
|
+
* @param decimals Number of decimal places for the token
|
|
16
|
+
* @returns USD value as number
|
|
17
|
+
*/
|
|
18
|
+
export function bigintToFloat(amount: bigint, decimals: number): number {
|
|
19
|
+
const formatted = formatUnits(amount, decimals);
|
|
20
|
+
const result = parseFloat(formatted);
|
|
21
|
+
|
|
22
|
+
if (!Number.isFinite(result)) {
|
|
23
|
+
throw new CalculateAmountError(`Conversion resulted in invalid number: ${formatted}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Converts a floating point USD value to bigint amount
|
|
31
|
+
* Uses viem's parseUnits for consistency and reliability
|
|
32
|
+
* @param usdValue USD value as number
|
|
33
|
+
* @param decimals Number of decimal places for the token
|
|
34
|
+
* @returns Amount in token's smallest unit
|
|
35
|
+
*/
|
|
36
|
+
export function floatToBigint(usdValue: number, decimals: number): bigint {
|
|
37
|
+
if (!Number.isFinite(usdValue) || usdValue < 0) {
|
|
38
|
+
throw new CalculateAmountError(`Invalid USD value: ${usdValue}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (decimals < 0 || decimals > 77) {
|
|
42
|
+
throw new CalculateAmountError(`Invalid decimals: ${decimals}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Convert to fixed-precision string to avoid floating point issues
|
|
46
|
+
const valueString = usdValue.toFixed(decimals);
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
return parseUnits(valueString, decimals);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
throw new CalculateAmountError(
|
|
52
|
+
`Failed to convert ${usdValue} to bigint with ${decimals} decimals: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
8
56
|
}
|