@defuse-protocol/intents-sdk 0.41.0 → 0.42.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/dist/src/bridges/hot-bridge/hot-bridge-chains.cjs +2 -1
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.d.cts +1 -1
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.d.ts +1 -1
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.js +2 -1
- package/dist/src/bridges/hot-bridge/hot-bridge-utils.cjs +5 -2
- package/dist/src/bridges/hot-bridge/hot-bridge-utils.js +5 -2
- package/dist/src/bridges/omni-bridge/omni-bridge.cjs +3 -4
- package/dist/src/bridges/omni-bridge/omni-bridge.js +3 -4
- package/dist/src/bridges/poa-bridge/poa-bridge-utils.cjs +7 -3
- package/dist/src/bridges/poa-bridge/poa-bridge-utils.js +7 -3
- package/dist/src/constants/public-rpc-urls.cjs +2 -1
- package/dist/src/constants/public-rpc-urls.js +2 -1
- package/dist/src/lib/caip2.cjs +4 -1
- package/dist/src/lib/caip2.d.cts +3 -0
- package/dist/src/lib/caip2.d.ts +3 -0
- package/dist/src/lib/caip2.js +4 -1
- package/dist/src/lib/validateAddress.cjs +67 -0
- package/dist/src/lib/validateAddress.js +67 -0
- package/package.json +2 -2
|
@@ -9,7 +9,8 @@ const HotBridgeChains = [
|
|
|
9
9
|
require_caip2.Chains.Avalanche,
|
|
10
10
|
require_caip2.Chains.Monad,
|
|
11
11
|
require_caip2.Chains.Stellar,
|
|
12
|
-
require_caip2.Chains.LayerX
|
|
12
|
+
require_caip2.Chains.LayerX,
|
|
13
|
+
require_caip2.Chains.Adi
|
|
13
14
|
];
|
|
14
15
|
const HotBridgeEVMChains = HotBridgeChains.filter((a) => a.startsWith("eip155:"));
|
|
15
16
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/bridges/hot-bridge/hot-bridge-chains.d.ts
|
|
2
2
|
type HotBridgeChain = (typeof HotBridgeChains)[number];
|
|
3
3
|
type HotBridgeEVMChain = Extract<HotBridgeChain, `eip155:${string}`>;
|
|
4
|
-
declare const HotBridgeChains: ("eip155:10" | "eip155:56" | "eip155:137" | "eip155:143" | "eip155:196" | "eip155:43114" | "tvm:-239" | "stellar:pubnet")[];
|
|
4
|
+
declare const HotBridgeChains: ("eip155:10" | "eip155:56" | "eip155:137" | "eip155:143" | "eip155:196" | "eip155:36900" | "eip155:43114" | "tvm:-239" | "stellar:pubnet")[];
|
|
5
5
|
//#endregion
|
|
6
6
|
export { HotBridgeEVMChain };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/bridges/hot-bridge/hot-bridge-chains.d.ts
|
|
2
2
|
type HotBridgeChain = (typeof HotBridgeChains)[number];
|
|
3
3
|
type HotBridgeEVMChain = Extract<HotBridgeChain, `eip155:${string}`>;
|
|
4
|
-
declare const HotBridgeChains: ("eip155:10" | "eip155:56" | "eip155:137" | "eip155:143" | "eip155:196" | "eip155:43114" | "tvm:-239" | "stellar:pubnet")[];
|
|
4
|
+
declare const HotBridgeChains: ("eip155:10" | "eip155:56" | "eip155:137" | "eip155:143" | "eip155:196" | "eip155:36900" | "eip155:43114" | "tvm:-239" | "stellar:pubnet")[];
|
|
5
5
|
//#endregion
|
|
6
6
|
export { HotBridgeEVMChain };
|
|
@@ -6,6 +6,7 @@ let __hot_labs_omni_sdk = require("@hot-labs/omni-sdk");
|
|
|
6
6
|
|
|
7
7
|
//#region src/bridges/hot-bridge/hot-bridge-utils.ts
|
|
8
8
|
const MONAD_MAINNET_NETWORK_ID = 143;
|
|
9
|
+
const ADI_NETWORK_ID = 36900;
|
|
9
10
|
const nativeTokenMapping = {
|
|
10
11
|
[require_caip2.Chains.BNB]: "nep245:v2_1.omni.hot.tg:56_11111111111111111111",
|
|
11
12
|
[require_caip2.Chains.Polygon]: "nep245:v2_1.omni.hot.tg:137_11111111111111111111",
|
|
@@ -14,7 +15,8 @@ const nativeTokenMapping = {
|
|
|
14
15
|
[require_caip2.Chains.Optimism]: "nep245:v2_1.omni.hot.tg:10_11111111111111111111",
|
|
15
16
|
[require_caip2.Chains.Avalanche]: "nep245:v2_1.omni.hot.tg:43114_11111111111111111111",
|
|
16
17
|
[require_caip2.Chains.Stellar]: "nep245:v2_1.omni.hot.tg:1100_111bzQBB5v7AhLyPMDwS8uJgQV24KaAPXtwyVWu2KXbbfQU6NXRCz",
|
|
17
|
-
[require_caip2.Chains.LayerX]: "nep245:v2_1.omni.hot.tg:196_11111111111111111111"
|
|
18
|
+
[require_caip2.Chains.LayerX]: "nep245:v2_1.omni.hot.tg:196_11111111111111111111",
|
|
19
|
+
[require_caip2.Chains.Adi]: "nep245:v2_1.omni.hot.tg:36900_11111111111111111111"
|
|
18
20
|
};
|
|
19
21
|
const caip2NetworkIdMapping = {
|
|
20
22
|
[require_caip2.Chains.BNB]: __hot_labs_omni_sdk.Network.Bnb,
|
|
@@ -24,7 +26,8 @@ const caip2NetworkIdMapping = {
|
|
|
24
26
|
[require_caip2.Chains.Optimism]: __hot_labs_omni_sdk.Network.Optimism,
|
|
25
27
|
[require_caip2.Chains.Avalanche]: __hot_labs_omni_sdk.Network.Avalanche,
|
|
26
28
|
[require_caip2.Chains.Stellar]: __hot_labs_omni_sdk.Network.Stellar,
|
|
27
|
-
[require_caip2.Chains.LayerX]: __hot_labs_omni_sdk.Network.Xlayer
|
|
29
|
+
[require_caip2.Chains.LayerX]: __hot_labs_omni_sdk.Network.Xlayer,
|
|
30
|
+
[require_caip2.Chains.Adi]: ADI_NETWORK_ID
|
|
28
31
|
};
|
|
29
32
|
const networkIdCAIP2Mapping = Object.fromEntries(Object.entries(caip2NetworkIdMapping).map(([k, v]) => [v, k]));
|
|
30
33
|
function getFeeAssetIdForChain(caip2) {
|
|
@@ -5,6 +5,7 @@ import { Network } from "@hot-labs/omni-sdk";
|
|
|
5
5
|
|
|
6
6
|
//#region src/bridges/hot-bridge/hot-bridge-utils.ts
|
|
7
7
|
const MONAD_MAINNET_NETWORK_ID = 143;
|
|
8
|
+
const ADI_NETWORK_ID = 36900;
|
|
8
9
|
const nativeTokenMapping = {
|
|
9
10
|
[Chains.BNB]: "nep245:v2_1.omni.hot.tg:56_11111111111111111111",
|
|
10
11
|
[Chains.Polygon]: "nep245:v2_1.omni.hot.tg:137_11111111111111111111",
|
|
@@ -13,7 +14,8 @@ const nativeTokenMapping = {
|
|
|
13
14
|
[Chains.Optimism]: "nep245:v2_1.omni.hot.tg:10_11111111111111111111",
|
|
14
15
|
[Chains.Avalanche]: "nep245:v2_1.omni.hot.tg:43114_11111111111111111111",
|
|
15
16
|
[Chains.Stellar]: "nep245:v2_1.omni.hot.tg:1100_111bzQBB5v7AhLyPMDwS8uJgQV24KaAPXtwyVWu2KXbbfQU6NXRCz",
|
|
16
|
-
[Chains.LayerX]: "nep245:v2_1.omni.hot.tg:196_11111111111111111111"
|
|
17
|
+
[Chains.LayerX]: "nep245:v2_1.omni.hot.tg:196_11111111111111111111",
|
|
18
|
+
[Chains.Adi]: "nep245:v2_1.omni.hot.tg:36900_11111111111111111111"
|
|
17
19
|
};
|
|
18
20
|
const caip2NetworkIdMapping = {
|
|
19
21
|
[Chains.BNB]: Network.Bnb,
|
|
@@ -23,7 +25,8 @@ const caip2NetworkIdMapping = {
|
|
|
23
25
|
[Chains.Optimism]: Network.Optimism,
|
|
24
26
|
[Chains.Avalanche]: Network.Avalanche,
|
|
25
27
|
[Chains.Stellar]: Network.Stellar,
|
|
26
|
-
[Chains.LayerX]: Network.Xlayer
|
|
28
|
+
[Chains.LayerX]: Network.Xlayer,
|
|
29
|
+
[Chains.Adi]: ADI_NETWORK_ID
|
|
27
30
|
};
|
|
28
31
|
const networkIdCAIP2Mapping = Object.fromEntries(Object.entries(caip2NetworkIdMapping).map(([k, v]) => [v, k]));
|
|
29
32
|
function getFeeAssetIdForChain(caip2) {
|
|
@@ -156,8 +156,7 @@ var OmniBridge = class {
|
|
|
156
156
|
const decimals = await this.getCachedTokenDecimals(destTokenAddress);
|
|
157
157
|
(0, __defuse_protocol_internal_utils.assert)(decimals !== null, `Failed to retrieve token decimals for address ${destTokenAddress} via OmniBridge contract.
|
|
158
158
|
Ensure the token is supported and the address is correct.`);
|
|
159
|
-
|
|
160
|
-
if ((0, omni_bridge_sdk.verifyTransferAmount)(actualAmountWithFee, args.feeEstimation.amount, decimals.origin_decimals, decimals.decimals) === false) throw new require_errors.MinWithdrawalAmountError((0, omni_bridge_sdk.getMinimumTransferableAmount)(decimals.origin_decimals, decimals.decimals), actualAmountWithFee, args.assetId);
|
|
159
|
+
if ((0, omni_bridge_sdk.verifyTransferAmount)(args.amount + args.feeEstimation.amount, args.feeEstimation.amount, decimals.origin_decimals, decimals.decimals) === false) throw new require_errors.MinWithdrawalAmountError((0, omni_bridge_sdk.getMinimumTransferableAmount)(decimals.origin_decimals, decimals.decimals), args.amount, args.assetId);
|
|
161
160
|
const storageBalance = await require_omni_bridge_utils.getAccountOmniStorageBalance(this.nearProvider, __defuse_protocol_internal_utils.configsByEnvironment[this.env].contractID);
|
|
162
161
|
const intentsNearStorageBalance = storageBalance === null ? 0n : BigInt(storageBalance.available);
|
|
163
162
|
if (intentsNearStorageBalance <= require_omni_bridge_constants.MIN_ALLOWED_STORAGE_BALANCE_FOR_INTENTS_NEAR) throw new require_error.IntentsNearOmniAvailableBalanceTooLowError(intentsNearStorageBalance.toString());
|
|
@@ -178,8 +177,8 @@ var OmniBridge = class {
|
|
|
178
177
|
const utxoProtocolFee = require_estimate_fee.getUnderlyingFee(args.feeEstimation, require_route_enum.RouteEnum.OmniBridge, "utxoProtocolFee");
|
|
179
178
|
(0, __defuse_protocol_internal_utils.assert)(utxoMaxGasFee !== void 0 && utxoMaxGasFee > 0n, `Invalid Omni Bridge utxo max gas fee: expected > 0, got ${utxoMaxGasFee}`);
|
|
180
179
|
(0, __defuse_protocol_internal_utils.assert)(utxoProtocolFee !== void 0 && utxoProtocolFee > 0n, `Invalid Omni Bridge utxo protocol fee: expected > 0, got ${utxoProtocolFee}`);
|
|
181
|
-
const actualAmountWithFee
|
|
182
|
-
if (actualAmountWithFee
|
|
180
|
+
const actualAmountWithFee = args.amount + utxoMaxGasFee + utxoProtocolFee;
|
|
181
|
+
if (actualAmountWithFee < minAmount) throw new require_errors.MinWithdrawalAmountError(minAmount, actualAmountWithFee, args.assetId);
|
|
183
182
|
}
|
|
184
183
|
}
|
|
185
184
|
async estimateWithdrawalFee(args) {
|
|
@@ -154,8 +154,7 @@ var OmniBridge = class {
|
|
|
154
154
|
const decimals = await this.getCachedTokenDecimals(destTokenAddress);
|
|
155
155
|
assert(decimals !== null, `Failed to retrieve token decimals for address ${destTokenAddress} via OmniBridge contract.
|
|
156
156
|
Ensure the token is supported and the address is correct.`);
|
|
157
|
-
|
|
158
|
-
if (verifyTransferAmount(actualAmountWithFee, args.feeEstimation.amount, decimals.origin_decimals, decimals.decimals) === false) throw new MinWithdrawalAmountError(getMinimumTransferableAmount(decimals.origin_decimals, decimals.decimals), actualAmountWithFee, args.assetId);
|
|
157
|
+
if (verifyTransferAmount(args.amount + args.feeEstimation.amount, args.feeEstimation.amount, decimals.origin_decimals, decimals.decimals) === false) throw new MinWithdrawalAmountError(getMinimumTransferableAmount(decimals.origin_decimals, decimals.decimals), args.amount, args.assetId);
|
|
159
158
|
const storageBalance = await getAccountOmniStorageBalance(this.nearProvider, configsByEnvironment[this.env].contractID);
|
|
160
159
|
const intentsNearStorageBalance = storageBalance === null ? 0n : BigInt(storageBalance.available);
|
|
161
160
|
if (intentsNearStorageBalance <= MIN_ALLOWED_STORAGE_BALANCE_FOR_INTENTS_NEAR) throw new IntentsNearOmniAvailableBalanceTooLowError(intentsNearStorageBalance.toString());
|
|
@@ -176,8 +175,8 @@ var OmniBridge = class {
|
|
|
176
175
|
const utxoProtocolFee = getUnderlyingFee(args.feeEstimation, RouteEnum.OmniBridge, "utxoProtocolFee");
|
|
177
176
|
assert(utxoMaxGasFee !== void 0 && utxoMaxGasFee > 0n, `Invalid Omni Bridge utxo max gas fee: expected > 0, got ${utxoMaxGasFee}`);
|
|
178
177
|
assert(utxoProtocolFee !== void 0 && utxoProtocolFee > 0n, `Invalid Omni Bridge utxo protocol fee: expected > 0, got ${utxoProtocolFee}`);
|
|
179
|
-
const actualAmountWithFee
|
|
180
|
-
if (actualAmountWithFee
|
|
178
|
+
const actualAmountWithFee = args.amount + utxoMaxGasFee + utxoProtocolFee;
|
|
179
|
+
if (actualAmountWithFee < minAmount) throw new MinWithdrawalAmountError(minAmount, actualAmountWithFee, args.assetId);
|
|
181
180
|
}
|
|
182
181
|
}
|
|
183
182
|
async estimateWithdrawalFee(args) {
|
|
@@ -17,7 +17,7 @@ function createWithdrawIntentPrimitive(params) {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
function createWithdrawMemo({ receiverAddress, xrpMemo }) {
|
|
20
|
-
const memo = ["WITHDRAW_TO", receiverAddress];
|
|
20
|
+
const memo = ["WITHDRAW_TO", receiverAddress.toLowerCase().startsWith("bitcoincash:") ? receiverAddress.slice(12) : receiverAddress];
|
|
21
21
|
if (xrpMemo != null && xrpMemo !== "") memo.push(xrpMemo);
|
|
22
22
|
return memo.join(":");
|
|
23
23
|
}
|
|
@@ -26,6 +26,7 @@ const caip2Mapping = {
|
|
|
26
26
|
[require_caip2.Chains.Base]: "eth:8453",
|
|
27
27
|
[require_caip2.Chains.Arbitrum]: "eth:42161",
|
|
28
28
|
[require_caip2.Chains.Bitcoin]: "btc:mainnet",
|
|
29
|
+
[require_caip2.Chains.BitcoinCash]: "bch:mainnet",
|
|
29
30
|
[require_caip2.Chains.Solana]: "sol:mainnet",
|
|
30
31
|
[require_caip2.Chains.Dogecoin]: "doge:mainnet",
|
|
31
32
|
[require_caip2.Chains.XRPL]: "xrp:mainnet",
|
|
@@ -36,7 +37,8 @@ const caip2Mapping = {
|
|
|
36
37
|
[require_caip2.Chains.Sui]: "sui:mainnet",
|
|
37
38
|
[require_caip2.Chains.Aptos]: "aptos:mainnet",
|
|
38
39
|
[require_caip2.Chains.Cardano]: "cardano:mainnet",
|
|
39
|
-
[require_caip2.Chains.Litecoin]: "ltc:mainnet"
|
|
40
|
+
[require_caip2.Chains.Litecoin]: "ltc:mainnet",
|
|
41
|
+
[require_caip2.Chains.Starknet]: "starknet:mainnet"
|
|
40
42
|
};
|
|
41
43
|
function toPoaNetwork(caip2) {
|
|
42
44
|
if (caip2Mapping[caip2] == null) throw new Error(`Unsupported POA Bridge chain = ${caip2}`);
|
|
@@ -47,6 +49,7 @@ const tokenPrefixMapping = {
|
|
|
47
49
|
base: require_caip2.Chains.Base,
|
|
48
50
|
arb: require_caip2.Chains.Arbitrum,
|
|
49
51
|
btc: require_caip2.Chains.Bitcoin,
|
|
52
|
+
bch: require_caip2.Chains.BitcoinCash,
|
|
50
53
|
sol: require_caip2.Chains.Solana,
|
|
51
54
|
doge: require_caip2.Chains.Dogecoin,
|
|
52
55
|
xrp: require_caip2.Chains.XRPL,
|
|
@@ -57,7 +60,8 @@ const tokenPrefixMapping = {
|
|
|
57
60
|
sui: require_caip2.Chains.Sui,
|
|
58
61
|
aptos: require_caip2.Chains.Aptos,
|
|
59
62
|
cardano: require_caip2.Chains.Cardano,
|
|
60
|
-
ltc: require_caip2.Chains.Litecoin
|
|
63
|
+
ltc: require_caip2.Chains.Litecoin,
|
|
64
|
+
starknet: require_caip2.Chains.Starknet
|
|
61
65
|
};
|
|
62
66
|
function contractIdToCaip2(contractId) {
|
|
63
67
|
for (const [prefix, caip2] of Object.entries(tokenPrefixMapping)) if (contractId.startsWith(`${prefix}.`) || contractId.startsWith(`${prefix}-`)) return caip2;
|
|
@@ -16,7 +16,7 @@ function createWithdrawIntentPrimitive(params) {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
function createWithdrawMemo({ receiverAddress, xrpMemo }) {
|
|
19
|
-
const memo = ["WITHDRAW_TO", receiverAddress];
|
|
19
|
+
const memo = ["WITHDRAW_TO", receiverAddress.toLowerCase().startsWith("bitcoincash:") ? receiverAddress.slice(12) : receiverAddress];
|
|
20
20
|
if (xrpMemo != null && xrpMemo !== "") memo.push(xrpMemo);
|
|
21
21
|
return memo.join(":");
|
|
22
22
|
}
|
|
@@ -25,6 +25,7 @@ const caip2Mapping = {
|
|
|
25
25
|
[Chains.Base]: "eth:8453",
|
|
26
26
|
[Chains.Arbitrum]: "eth:42161",
|
|
27
27
|
[Chains.Bitcoin]: "btc:mainnet",
|
|
28
|
+
[Chains.BitcoinCash]: "bch:mainnet",
|
|
28
29
|
[Chains.Solana]: "sol:mainnet",
|
|
29
30
|
[Chains.Dogecoin]: "doge:mainnet",
|
|
30
31
|
[Chains.XRPL]: "xrp:mainnet",
|
|
@@ -35,7 +36,8 @@ const caip2Mapping = {
|
|
|
35
36
|
[Chains.Sui]: "sui:mainnet",
|
|
36
37
|
[Chains.Aptos]: "aptos:mainnet",
|
|
37
38
|
[Chains.Cardano]: "cardano:mainnet",
|
|
38
|
-
[Chains.Litecoin]: "ltc:mainnet"
|
|
39
|
+
[Chains.Litecoin]: "ltc:mainnet",
|
|
40
|
+
[Chains.Starknet]: "starknet:mainnet"
|
|
39
41
|
};
|
|
40
42
|
function toPoaNetwork(caip2) {
|
|
41
43
|
if (caip2Mapping[caip2] == null) throw new Error(`Unsupported POA Bridge chain = ${caip2}`);
|
|
@@ -46,6 +48,7 @@ const tokenPrefixMapping = {
|
|
|
46
48
|
base: Chains.Base,
|
|
47
49
|
arb: Chains.Arbitrum,
|
|
48
50
|
btc: Chains.Bitcoin,
|
|
51
|
+
bch: Chains.BitcoinCash,
|
|
49
52
|
sol: Chains.Solana,
|
|
50
53
|
doge: Chains.Dogecoin,
|
|
51
54
|
xrp: Chains.XRPL,
|
|
@@ -56,7 +59,8 @@ const tokenPrefixMapping = {
|
|
|
56
59
|
sui: Chains.Sui,
|
|
57
60
|
aptos: Chains.Aptos,
|
|
58
61
|
cardano: Chains.Cardano,
|
|
59
|
-
ltc: Chains.Litecoin
|
|
62
|
+
ltc: Chains.Litecoin,
|
|
63
|
+
starknet: Chains.Starknet
|
|
60
64
|
};
|
|
61
65
|
function contractIdToCaip2(contractId) {
|
|
62
66
|
for (const [prefix, caip2] of Object.entries(tokenPrefixMapping)) if (contractId.startsWith(`${prefix}.`) || contractId.startsWith(`${prefix}-`)) return caip2;
|
|
@@ -10,7 +10,8 @@ const PUBLIC_EVM_RPC_URLS = {
|
|
|
10
10
|
[require_caip2.Chains.Monad]: ["https://rpc.monad.xyz"],
|
|
11
11
|
[require_caip2.Chains.Optimism]: ["https://optimism-rpc.publicnode.com"],
|
|
12
12
|
[require_caip2.Chains.Avalanche]: ["https://avalanche-c-chain-rpc.publicnode.com"],
|
|
13
|
-
[require_caip2.Chains.LayerX]: ["https://rpc.xlayer.tech"]
|
|
13
|
+
[require_caip2.Chains.LayerX]: ["https://rpc.xlayer.tech"],
|
|
14
|
+
[require_caip2.Chains.Adi]: ["https://rpc.adifoundation.ai"]
|
|
14
15
|
};
|
|
15
16
|
const PUBLIC_STELLAR_RPC_URLS = {
|
|
16
17
|
soroban: ["https://mainnet.sorobanrpc.com"],
|
|
@@ -10,7 +10,8 @@ const PUBLIC_EVM_RPC_URLS = {
|
|
|
10
10
|
[Chains.Monad]: ["https://rpc.monad.xyz"],
|
|
11
11
|
[Chains.Optimism]: ["https://optimism-rpc.publicnode.com"],
|
|
12
12
|
[Chains.Avalanche]: ["https://avalanche-c-chain-rpc.publicnode.com"],
|
|
13
|
-
[Chains.LayerX]: ["https://rpc.xlayer.tech"]
|
|
13
|
+
[Chains.LayerX]: ["https://rpc.xlayer.tech"],
|
|
14
|
+
[Chains.Adi]: ["https://rpc.adifoundation.ai"]
|
|
14
15
|
};
|
|
15
16
|
const PUBLIC_STELLAR_RPC_URLS = {
|
|
16
17
|
soroban: ["https://mainnet.sorobanrpc.com"],
|
package/dist/src/lib/caip2.cjs
CHANGED
|
@@ -7,6 +7,7 @@ let __defuse_protocol_internal_utils = require("@defuse-protocol/internal-utils"
|
|
|
7
7
|
*/
|
|
8
8
|
const Chains = {
|
|
9
9
|
Bitcoin: "bip122:000000000019d6689c085ae165831e93",
|
|
10
|
+
BitcoinCash: "bip122:000000000000000000651ef99cb9fcbe",
|
|
10
11
|
Zcash: "bip122:00040fe8ec8471911baa1db1266ea15d",
|
|
11
12
|
Dogecoin: "bip122:1a91e3dace36e2be3bf030a65679fe82",
|
|
12
13
|
Litecoin: "bip122:12a765e31ffd4059bada1e25190f6e98",
|
|
@@ -17,6 +18,7 @@ const Chains = {
|
|
|
17
18
|
Polygon: "eip155:137",
|
|
18
19
|
Monad: "eip155:143",
|
|
19
20
|
LayerX: "eip155:196",
|
|
21
|
+
Adi: "eip155:36900",
|
|
20
22
|
Base: "eip155:8453",
|
|
21
23
|
Arbitrum: "eip155:42161",
|
|
22
24
|
Avalanche: "eip155:43114",
|
|
@@ -29,7 +31,8 @@ const Chains = {
|
|
|
29
31
|
Sui: "sui:mainnet",
|
|
30
32
|
Aptos: "aptos:mainnet",
|
|
31
33
|
Stellar: "stellar:pubnet",
|
|
32
|
-
Cardano: "cip34:1-764824073"
|
|
34
|
+
Cardano: "cip34:1-764824073",
|
|
35
|
+
Starknet: "starknet:SN_MAIN"
|
|
33
36
|
};
|
|
34
37
|
function getEIP155ChainId(chain) {
|
|
35
38
|
(0, __defuse_protocol_internal_utils.assert)(chain.startsWith("eip155:"), "Chain is not an EIP-155 chain");
|
package/dist/src/lib/caip2.d.cts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
declare const Chains: {
|
|
6
6
|
readonly Bitcoin: "bip122:000000000019d6689c085ae165831e93";
|
|
7
|
+
readonly BitcoinCash: "bip122:000000000000000000651ef99cb9fcbe";
|
|
7
8
|
readonly Zcash: "bip122:00040fe8ec8471911baa1db1266ea15d";
|
|
8
9
|
readonly Dogecoin: "bip122:1a91e3dace36e2be3bf030a65679fe82";
|
|
9
10
|
readonly Litecoin: "bip122:12a765e31ffd4059bada1e25190f6e98";
|
|
@@ -14,6 +15,7 @@ declare const Chains: {
|
|
|
14
15
|
readonly Polygon: "eip155:137";
|
|
15
16
|
readonly Monad: "eip155:143";
|
|
16
17
|
readonly LayerX: "eip155:196";
|
|
18
|
+
readonly Adi: "eip155:36900";
|
|
17
19
|
readonly Base: "eip155:8453";
|
|
18
20
|
readonly Arbitrum: "eip155:42161";
|
|
19
21
|
readonly Avalanche: "eip155:43114";
|
|
@@ -27,6 +29,7 @@ declare const Chains: {
|
|
|
27
29
|
readonly Aptos: "aptos:mainnet";
|
|
28
30
|
readonly Stellar: "stellar:pubnet";
|
|
29
31
|
readonly Cardano: "cip34:1-764824073";
|
|
32
|
+
readonly Starknet: "starknet:SN_MAIN";
|
|
30
33
|
};
|
|
31
34
|
type Chain = (typeof Chains)[keyof typeof Chains];
|
|
32
35
|
//#endregion
|
package/dist/src/lib/caip2.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
declare const Chains: {
|
|
6
6
|
readonly Bitcoin: "bip122:000000000019d6689c085ae165831e93";
|
|
7
|
+
readonly BitcoinCash: "bip122:000000000000000000651ef99cb9fcbe";
|
|
7
8
|
readonly Zcash: "bip122:00040fe8ec8471911baa1db1266ea15d";
|
|
8
9
|
readonly Dogecoin: "bip122:1a91e3dace36e2be3bf030a65679fe82";
|
|
9
10
|
readonly Litecoin: "bip122:12a765e31ffd4059bada1e25190f6e98";
|
|
@@ -14,6 +15,7 @@ declare const Chains: {
|
|
|
14
15
|
readonly Polygon: "eip155:137";
|
|
15
16
|
readonly Monad: "eip155:143";
|
|
16
17
|
readonly LayerX: "eip155:196";
|
|
18
|
+
readonly Adi: "eip155:36900";
|
|
17
19
|
readonly Base: "eip155:8453";
|
|
18
20
|
readonly Arbitrum: "eip155:42161";
|
|
19
21
|
readonly Avalanche: "eip155:43114";
|
|
@@ -27,6 +29,7 @@ declare const Chains: {
|
|
|
27
29
|
readonly Aptos: "aptos:mainnet";
|
|
28
30
|
readonly Stellar: "stellar:pubnet";
|
|
29
31
|
readonly Cardano: "cip34:1-764824073";
|
|
32
|
+
readonly Starknet: "starknet:SN_MAIN";
|
|
30
33
|
};
|
|
31
34
|
type Chain = (typeof Chains)[keyof typeof Chains];
|
|
32
35
|
//#endregion
|
package/dist/src/lib/caip2.js
CHANGED
|
@@ -6,6 +6,7 @@ import { assert } from "@defuse-protocol/internal-utils";
|
|
|
6
6
|
*/
|
|
7
7
|
const Chains = {
|
|
8
8
|
Bitcoin: "bip122:000000000019d6689c085ae165831e93",
|
|
9
|
+
BitcoinCash: "bip122:000000000000000000651ef99cb9fcbe",
|
|
9
10
|
Zcash: "bip122:00040fe8ec8471911baa1db1266ea15d",
|
|
10
11
|
Dogecoin: "bip122:1a91e3dace36e2be3bf030a65679fe82",
|
|
11
12
|
Litecoin: "bip122:12a765e31ffd4059bada1e25190f6e98",
|
|
@@ -16,6 +17,7 @@ const Chains = {
|
|
|
16
17
|
Polygon: "eip155:137",
|
|
17
18
|
Monad: "eip155:143",
|
|
18
19
|
LayerX: "eip155:196",
|
|
20
|
+
Adi: "eip155:36900",
|
|
19
21
|
Base: "eip155:8453",
|
|
20
22
|
Arbitrum: "eip155:42161",
|
|
21
23
|
Avalanche: "eip155:43114",
|
|
@@ -28,7 +30,8 @@ const Chains = {
|
|
|
28
30
|
Sui: "sui:mainnet",
|
|
29
31
|
Aptos: "aptos:mainnet",
|
|
30
32
|
Stellar: "stellar:pubnet",
|
|
31
|
-
Cardano: "cip34:1-764824073"
|
|
33
|
+
Cardano: "cip34:1-764824073",
|
|
34
|
+
Starknet: "starknet:SN_MAIN"
|
|
32
35
|
};
|
|
33
36
|
function getEIP155ChainId(chain) {
|
|
34
37
|
assert(chain.startsWith("eip155:"), "Chain is not an EIP-155 chain");
|
|
@@ -12,6 +12,7 @@ function validateAddress(address, blockchain) {
|
|
|
12
12
|
switch (blockchain) {
|
|
13
13
|
case require_caip2.Chains.Near: return __defuse_protocol_internal_utils.utils.validateNearAddress(address);
|
|
14
14
|
case require_caip2.Chains.Bitcoin: return validateBtcAddress(address);
|
|
15
|
+
case require_caip2.Chains.BitcoinCash: return validateBchAddress(address);
|
|
15
16
|
case require_caip2.Chains.Solana: return validateSolAddress(address);
|
|
16
17
|
case require_caip2.Chains.Dogecoin: return validateDogeAddress(address);
|
|
17
18
|
case require_caip2.Chains.Litecoin: return validateLitecoinAddress(address);
|
|
@@ -23,6 +24,7 @@ function validateAddress(address, blockchain) {
|
|
|
23
24
|
case require_caip2.Chains.Stellar: return validateStellarAddress(address);
|
|
24
25
|
case require_caip2.Chains.Aptos: return validateAptosAddress(address);
|
|
25
26
|
case require_caip2.Chains.Cardano: return validateCardanoAddress(address);
|
|
27
|
+
case require_caip2.Chains.Starknet: return validateStarknetAddress(address);
|
|
26
28
|
case require_caip2.Chains.Ethereum:
|
|
27
29
|
case require_caip2.Chains.Optimism:
|
|
28
30
|
case require_caip2.Chains.BNB:
|
|
@@ -30,6 +32,7 @@ function validateAddress(address, blockchain) {
|
|
|
30
32
|
case require_caip2.Chains.Polygon:
|
|
31
33
|
case require_caip2.Chains.Monad:
|
|
32
34
|
case require_caip2.Chains.LayerX:
|
|
35
|
+
case require_caip2.Chains.Adi:
|
|
33
36
|
case require_caip2.Chains.Base:
|
|
34
37
|
case require_caip2.Chains.Arbitrum:
|
|
35
38
|
case require_caip2.Chains.Avalanche:
|
|
@@ -43,6 +46,62 @@ function validateEthAddress(address) {
|
|
|
43
46
|
function validateBtcAddress(address) {
|
|
44
47
|
return /^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^bc1[02-9ac-hj-np-z]{11,87}$/.test(address) || /^bc1p[02-9ac-hj-np-z]{42,87}$/.test(address);
|
|
45
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Validates Bitcoin Cash addresses
|
|
51
|
+
* Supports:
|
|
52
|
+
* - Legacy addresses (1... for P2PKH, 3... for P2SH) - shared with Bitcoin
|
|
53
|
+
* - CashAddr format (bitcoincash:q... or q... for P2PKH, bitcoincash:p... or p... for P2SH)
|
|
54
|
+
*
|
|
55
|
+
* CashAddr checksum implementation based on:
|
|
56
|
+
* @see https://github.com/ealmansi/cashaddrjs (MIT License)
|
|
57
|
+
* @see https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md
|
|
58
|
+
*/
|
|
59
|
+
function validateBchAddress(address) {
|
|
60
|
+
if (/^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address)) return true;
|
|
61
|
+
return validateBchCashAddr(address);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validates Bitcoin Cash CashAddr format
|
|
65
|
+
* CashAddr uses a modified Bech32 encoding with polymod checksum
|
|
66
|
+
*/
|
|
67
|
+
function validateBchCashAddr(address) {
|
|
68
|
+
let normalized = address.toLowerCase();
|
|
69
|
+
if (!normalized.includes(":")) normalized = `bitcoincash:${normalized}`;
|
|
70
|
+
if (!normalized.startsWith("bitcoincash:")) return false;
|
|
71
|
+
const payload = normalized.slice(12);
|
|
72
|
+
if (!payload.startsWith("q") && !payload.startsWith("p")) return false;
|
|
73
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
74
|
+
for (const char of payload) if (!CHARSET.includes(char)) return false;
|
|
75
|
+
if (payload.length !== 42 && payload.length !== 61) return false;
|
|
76
|
+
return verifyBchChecksum(normalized);
|
|
77
|
+
}
|
|
78
|
+
function verifyBchChecksum(address) {
|
|
79
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
80
|
+
const colonIndex = address.indexOf(":");
|
|
81
|
+
const prefix = address.slice(0, colonIndex);
|
|
82
|
+
const payload = address.slice(colonIndex + 1);
|
|
83
|
+
const prefixData = [];
|
|
84
|
+
for (const char of prefix) prefixData.push(char.charCodeAt(0) & 31);
|
|
85
|
+
prefixData.push(0);
|
|
86
|
+
const payloadData = [];
|
|
87
|
+
for (const char of payload) {
|
|
88
|
+
const idx = CHARSET.indexOf(char);
|
|
89
|
+
if (idx === -1) return false;
|
|
90
|
+
payloadData.push(idx);
|
|
91
|
+
}
|
|
92
|
+
const values = [...prefixData, ...payloadData];
|
|
93
|
+
let c = 1n;
|
|
94
|
+
for (const d of values) {
|
|
95
|
+
const c0 = c >> 35n;
|
|
96
|
+
c = (c & 34359738367n) << 5n ^ BigInt(d);
|
|
97
|
+
if (c0 & 1n) c ^= 656907472481n;
|
|
98
|
+
if (c0 & 2n) c ^= 522768456162n;
|
|
99
|
+
if (c0 & 4n) c ^= 1044723512260n;
|
|
100
|
+
if (c0 & 8n) c ^= 748107326120n;
|
|
101
|
+
if (c0 & 16n) c ^= 130178868336n;
|
|
102
|
+
}
|
|
103
|
+
return (c ^ 1n) === 0n;
|
|
104
|
+
}
|
|
46
105
|
function validateSolAddress(address) {
|
|
47
106
|
try {
|
|
48
107
|
return __solana_web3_js.PublicKey.isOnCurve(address);
|
|
@@ -137,6 +196,14 @@ function validateCardanoAddress(address) {
|
|
|
137
196
|
return false;
|
|
138
197
|
}
|
|
139
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Validates Starknet addresses
|
|
201
|
+
* Starknet addresses are felt252 (252-bit field elements) represented as
|
|
202
|
+
* hex strings with 0x prefix (up to 64 hex characters)
|
|
203
|
+
*/
|
|
204
|
+
function validateStarknetAddress(address) {
|
|
205
|
+
return /^0x[a-fA-F0-9]{1,64}$/.test(address);
|
|
206
|
+
}
|
|
140
207
|
function validateLitecoinAddress(address) {
|
|
141
208
|
const first = address[0];
|
|
142
209
|
if (first === "L") return validateLitecoinBase58Address(address, 48);
|
|
@@ -11,6 +11,7 @@ function validateAddress(address, blockchain) {
|
|
|
11
11
|
switch (blockchain) {
|
|
12
12
|
case Chains.Near: return utils.validateNearAddress(address);
|
|
13
13
|
case Chains.Bitcoin: return validateBtcAddress(address);
|
|
14
|
+
case Chains.BitcoinCash: return validateBchAddress(address);
|
|
14
15
|
case Chains.Solana: return validateSolAddress(address);
|
|
15
16
|
case Chains.Dogecoin: return validateDogeAddress(address);
|
|
16
17
|
case Chains.Litecoin: return validateLitecoinAddress(address);
|
|
@@ -22,6 +23,7 @@ function validateAddress(address, blockchain) {
|
|
|
22
23
|
case Chains.Stellar: return validateStellarAddress(address);
|
|
23
24
|
case Chains.Aptos: return validateAptosAddress(address);
|
|
24
25
|
case Chains.Cardano: return validateCardanoAddress(address);
|
|
26
|
+
case Chains.Starknet: return validateStarknetAddress(address);
|
|
25
27
|
case Chains.Ethereum:
|
|
26
28
|
case Chains.Optimism:
|
|
27
29
|
case Chains.BNB:
|
|
@@ -29,6 +31,7 @@ function validateAddress(address, blockchain) {
|
|
|
29
31
|
case Chains.Polygon:
|
|
30
32
|
case Chains.Monad:
|
|
31
33
|
case Chains.LayerX:
|
|
34
|
+
case Chains.Adi:
|
|
32
35
|
case Chains.Base:
|
|
33
36
|
case Chains.Arbitrum:
|
|
34
37
|
case Chains.Avalanche:
|
|
@@ -42,6 +45,62 @@ function validateEthAddress(address) {
|
|
|
42
45
|
function validateBtcAddress(address) {
|
|
43
46
|
return /^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^bc1[02-9ac-hj-np-z]{11,87}$/.test(address) || /^bc1p[02-9ac-hj-np-z]{42,87}$/.test(address);
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Validates Bitcoin Cash addresses
|
|
50
|
+
* Supports:
|
|
51
|
+
* - Legacy addresses (1... for P2PKH, 3... for P2SH) - shared with Bitcoin
|
|
52
|
+
* - CashAddr format (bitcoincash:q... or q... for P2PKH, bitcoincash:p... or p... for P2SH)
|
|
53
|
+
*
|
|
54
|
+
* CashAddr checksum implementation based on:
|
|
55
|
+
* @see https://github.com/ealmansi/cashaddrjs (MIT License)
|
|
56
|
+
* @see https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md
|
|
57
|
+
*/
|
|
58
|
+
function validateBchAddress(address) {
|
|
59
|
+
if (/^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address)) return true;
|
|
60
|
+
return validateBchCashAddr(address);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates Bitcoin Cash CashAddr format
|
|
64
|
+
* CashAddr uses a modified Bech32 encoding with polymod checksum
|
|
65
|
+
*/
|
|
66
|
+
function validateBchCashAddr(address) {
|
|
67
|
+
let normalized = address.toLowerCase();
|
|
68
|
+
if (!normalized.includes(":")) normalized = `bitcoincash:${normalized}`;
|
|
69
|
+
if (!normalized.startsWith("bitcoincash:")) return false;
|
|
70
|
+
const payload = normalized.slice(12);
|
|
71
|
+
if (!payload.startsWith("q") && !payload.startsWith("p")) return false;
|
|
72
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
73
|
+
for (const char of payload) if (!CHARSET.includes(char)) return false;
|
|
74
|
+
if (payload.length !== 42 && payload.length !== 61) return false;
|
|
75
|
+
return verifyBchChecksum(normalized);
|
|
76
|
+
}
|
|
77
|
+
function verifyBchChecksum(address) {
|
|
78
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
79
|
+
const colonIndex = address.indexOf(":");
|
|
80
|
+
const prefix = address.slice(0, colonIndex);
|
|
81
|
+
const payload = address.slice(colonIndex + 1);
|
|
82
|
+
const prefixData = [];
|
|
83
|
+
for (const char of prefix) prefixData.push(char.charCodeAt(0) & 31);
|
|
84
|
+
prefixData.push(0);
|
|
85
|
+
const payloadData = [];
|
|
86
|
+
for (const char of payload) {
|
|
87
|
+
const idx = CHARSET.indexOf(char);
|
|
88
|
+
if (idx === -1) return false;
|
|
89
|
+
payloadData.push(idx);
|
|
90
|
+
}
|
|
91
|
+
const values = [...prefixData, ...payloadData];
|
|
92
|
+
let c = 1n;
|
|
93
|
+
for (const d of values) {
|
|
94
|
+
const c0 = c >> 35n;
|
|
95
|
+
c = (c & 34359738367n) << 5n ^ BigInt(d);
|
|
96
|
+
if (c0 & 1n) c ^= 656907472481n;
|
|
97
|
+
if (c0 & 2n) c ^= 522768456162n;
|
|
98
|
+
if (c0 & 4n) c ^= 1044723512260n;
|
|
99
|
+
if (c0 & 8n) c ^= 748107326120n;
|
|
100
|
+
if (c0 & 16n) c ^= 130178868336n;
|
|
101
|
+
}
|
|
102
|
+
return (c ^ 1n) === 0n;
|
|
103
|
+
}
|
|
45
104
|
function validateSolAddress(address) {
|
|
46
105
|
try {
|
|
47
106
|
return PublicKey.isOnCurve(address);
|
|
@@ -136,6 +195,14 @@ function validateCardanoAddress(address) {
|
|
|
136
195
|
return false;
|
|
137
196
|
}
|
|
138
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* Validates Starknet addresses
|
|
200
|
+
* Starknet addresses are felt252 (252-bit field elements) represented as
|
|
201
|
+
* hex strings with 0x prefix (up to 64 hex characters)
|
|
202
|
+
*/
|
|
203
|
+
function validateStarknetAddress(address) {
|
|
204
|
+
return /^0x[a-fA-F0-9]{1,64}$/.test(address);
|
|
205
|
+
}
|
|
139
206
|
function validateLitecoinAddress(address) {
|
|
140
207
|
const first = address[0];
|
|
141
208
|
if (first === "L") return validateLitecoinBase58Address(address, 48);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defuse-protocol/intents-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"valibot": "^1.0.0",
|
|
40
40
|
"viem": "^2.0.0",
|
|
41
41
|
"@defuse-protocol/contract-types": "0.4.3",
|
|
42
|
-
"@defuse-protocol/internal-utils": "0.
|
|
42
|
+
"@defuse-protocol/internal-utils": "0.21.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"tsdown": "0.15.5",
|