@bronlabs/intents-sdk 1.0.115 → 1.0.117
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/networks/cosmos.d.ts +2 -0
- package/dist/networks/cosmos.js +77 -64
- package/dist/networks/cosmos.js.map +1 -1
- package/dist/networks/index.js +4 -1
- package/dist/networks/index.js.map +1 -1
- package/dist/networks/ton.js +1 -1
- package/dist/networks/xrp.d.ts +17 -0
- package/dist/networks/xrp.js +201 -0
- package/dist/networks/xrp.js.map +1 -0
- package/package.json +3 -2
|
@@ -11,4 +11,6 @@ export declare class CosmosNetwork implements Network {
|
|
|
11
11
|
getDecimals(tokenAddress: string): Promise<number>;
|
|
12
12
|
getTxData(txHash: string, tokenAddress: string): Promise<TransactionData | undefined>;
|
|
13
13
|
transfer(privateKey: string, to: string, value: bigint, tokenAddress: string): Promise<string>;
|
|
14
|
+
private parseEventAttributes;
|
|
15
|
+
private rpcCall;
|
|
14
16
|
}
|
package/dist/networks/cosmos.js
CHANGED
|
@@ -1,34 +1,8 @@
|
|
|
1
1
|
import { log } from '../utils.js';
|
|
2
2
|
import { proxyFetch } from '../proxy.js';
|
|
3
|
-
import {
|
|
4
|
-
import { GasPrice, SigningStargateClient
|
|
3
|
+
import { DirectSecp256k1Wallet } from '@cosmjs/proto-signing';
|
|
4
|
+
import { GasPrice, SigningStargateClient } from '@cosmjs/stargate';
|
|
5
5
|
import { Tendermint37Client } from '@cosmjs/tendermint-rpc';
|
|
6
|
-
import { MsgSend } from 'cosmjs-types/cosmos/bank/v1beta1/tx';
|
|
7
|
-
class ProxyRpcClient {
|
|
8
|
-
constructor(url) {
|
|
9
|
-
this.url = url;
|
|
10
|
-
}
|
|
11
|
-
disconnect() { }
|
|
12
|
-
async execute(request) {
|
|
13
|
-
const response = await proxyFetch(this.url, {
|
|
14
|
-
method: 'POST',
|
|
15
|
-
headers: { 'Content-Type': 'application/json' },
|
|
16
|
-
body: JSON.stringify(request),
|
|
17
|
-
});
|
|
18
|
-
if (!response.ok) {
|
|
19
|
-
const body = await response.text().catch(() => '');
|
|
20
|
-
throw new Error(`Cosmos RPC request to ${this.url} failed: ${response.status} ${response.statusText} - ${body}`);
|
|
21
|
-
}
|
|
22
|
-
const json = await response.json();
|
|
23
|
-
if (json.error) {
|
|
24
|
-
throw new Error(JSON.stringify(json.error));
|
|
25
|
-
}
|
|
26
|
-
return json;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function createCometClient(rpcUrl) {
|
|
30
|
-
return Tendermint37Client.create(new ProxyRpcClient(rpcUrl));
|
|
31
|
-
}
|
|
32
6
|
export class CosmosNetwork {
|
|
33
7
|
constructor(rpcUrl, nativeDenom, bech32, gasPrice, confirmations = 1) {
|
|
34
8
|
this.retryDelay = 15000;
|
|
@@ -39,13 +13,7 @@ export class CosmosNetwork {
|
|
|
39
13
|
this.bech32 = bech32;
|
|
40
14
|
}
|
|
41
15
|
async ping() {
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
await client.getHeight();
|
|
45
|
-
}
|
|
46
|
-
finally {
|
|
47
|
-
client.disconnect();
|
|
48
|
-
}
|
|
16
|
+
await this.rpcCall('status');
|
|
49
17
|
}
|
|
50
18
|
async getDecimals(tokenAddress) {
|
|
51
19
|
let denom = tokenAddress;
|
|
@@ -54,27 +22,24 @@ export class CosmosNetwork {
|
|
|
54
22
|
}
|
|
55
23
|
const firstLetter = denom[0];
|
|
56
24
|
if (firstLetter === 'u') {
|
|
57
|
-
// micro
|
|
58
25
|
return 6;
|
|
59
26
|
}
|
|
60
27
|
if (firstLetter === 'a') {
|
|
61
|
-
// atto
|
|
62
28
|
return 18;
|
|
63
29
|
}
|
|
64
30
|
if (firstLetter === 'n') {
|
|
65
|
-
// nano
|
|
66
31
|
return 9;
|
|
67
32
|
}
|
|
68
33
|
return 0;
|
|
69
34
|
}
|
|
70
35
|
async getTxData(txHash, tokenAddress) {
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
if (!
|
|
36
|
+
const hashBase64 = Buffer.from(txHash, 'hex').toString('base64');
|
|
37
|
+
const result = await this.rpcCall('tx', { hash: hashBase64, prove: false });
|
|
38
|
+
if (!result || !result.tx_result) {
|
|
74
39
|
return;
|
|
75
40
|
}
|
|
76
|
-
if (
|
|
77
|
-
log.warn(`Transaction ${txHash} failed on blockchain:
|
|
41
|
+
if (result.tx_result.code !== 0) {
|
|
42
|
+
log.warn(`Transaction ${txHash} failed on blockchain: code=${result.tx_result.code}`);
|
|
78
43
|
return {
|
|
79
44
|
from: "",
|
|
80
45
|
to: "",
|
|
@@ -83,10 +48,10 @@ export class CosmosNetwork {
|
|
|
83
48
|
confirmed: false
|
|
84
49
|
};
|
|
85
50
|
}
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
if (!
|
|
89
|
-
log.warn(`Transaction ${txHash} has no
|
|
51
|
+
const events = result.tx_result.events || [];
|
|
52
|
+
const transferEvent = events.find((e) => e.type === 'transfer');
|
|
53
|
+
if (!transferEvent) {
|
|
54
|
+
log.warn(`Transaction ${txHash} has no transfer event`);
|
|
90
55
|
return {
|
|
91
56
|
from: "",
|
|
92
57
|
to: "",
|
|
@@ -95,15 +60,15 @@ export class CosmosNetwork {
|
|
|
95
60
|
confirmed: false
|
|
96
61
|
};
|
|
97
62
|
}
|
|
98
|
-
const
|
|
63
|
+
const attrs = this.parseEventAttributes(transferEvent.attributes);
|
|
99
64
|
let denom = tokenAddress;
|
|
100
|
-
// Native token - specified denom
|
|
101
65
|
if (tokenAddress === "0x0") {
|
|
102
66
|
denom = this.nativeDenom;
|
|
103
67
|
}
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
68
|
+
const amountStr = attrs.amount || '';
|
|
69
|
+
const amountMatch = amountStr.match(new RegExp(`(\\d+)${denom}`));
|
|
70
|
+
if (!amountMatch) {
|
|
71
|
+
log.warn(`Transaction ${txHash} has no amount for denom ${denom}: ${amountStr}`);
|
|
107
72
|
return {
|
|
108
73
|
from: "",
|
|
109
74
|
to: "",
|
|
@@ -112,33 +77,81 @@ export class CosmosNetwork {
|
|
|
112
77
|
confirmed: false
|
|
113
78
|
};
|
|
114
79
|
}
|
|
115
|
-
const
|
|
116
|
-
const currentBlock =
|
|
117
|
-
const txBlock =
|
|
80
|
+
const blockResult = await this.rpcCall('block');
|
|
81
|
+
const currentBlock = parseInt(blockResult.block.header.height);
|
|
82
|
+
const txBlock = parseInt(result.height);
|
|
118
83
|
const confirmed = (currentBlock - txBlock) >= this.confirmations;
|
|
119
84
|
log.info(`Confirmations ${txHash}: ${currentBlock}, confirmed: ${confirmed}`);
|
|
120
85
|
return {
|
|
121
|
-
from:
|
|
122
|
-
to:
|
|
86
|
+
from: attrs.sender || '',
|
|
87
|
+
to: attrs.recipient || '',
|
|
123
88
|
token: tokenAddress,
|
|
124
|
-
amount: BigInt(
|
|
125
|
-
confirmed
|
|
89
|
+
amount: BigInt(amountMatch[1]),
|
|
90
|
+
confirmed
|
|
126
91
|
};
|
|
127
92
|
}
|
|
128
93
|
async transfer(privateKey, to, value, tokenAddress) {
|
|
129
|
-
// 1) Create wallet/signer
|
|
130
94
|
const wallet = await DirectSecp256k1Wallet.fromKey(Buffer.from(privateKey, 'hex'), this.bech32);
|
|
131
95
|
const [account] = await wallet.getAccounts();
|
|
132
96
|
const sender = account.address;
|
|
133
|
-
|
|
97
|
+
const cometClient = await Tendermint37Client.create({
|
|
98
|
+
execute: async (request) => {
|
|
99
|
+
const response = await proxyFetch(this.rpcUrl, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: { 'Content-Type': 'application/json' },
|
|
102
|
+
body: JSON.stringify(request),
|
|
103
|
+
});
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throw new Error(`Cosmos RPC error: ${response.status}`);
|
|
106
|
+
}
|
|
107
|
+
const json = await response.json();
|
|
108
|
+
if (json.error) {
|
|
109
|
+
throw new Error(JSON.stringify(json.error));
|
|
110
|
+
}
|
|
111
|
+
return json;
|
|
112
|
+
},
|
|
113
|
+
disconnect: () => { }
|
|
114
|
+
});
|
|
134
115
|
const gasPrice = GasPrice.fromString(`${this.gasPrice}${this.nativeDenom}`);
|
|
135
|
-
const client = SigningStargateClient.createWithSigner(
|
|
116
|
+
const client = await SigningStargateClient.createWithSigner(cometClient, wallet, { gasPrice });
|
|
136
117
|
const denom = tokenAddress === "0x0" ? this.nativeDenom : tokenAddress;
|
|
137
|
-
// 3) Build amount (in *base* denom)
|
|
138
118
|
const amount = [{ denom, amount: value.toString() }];
|
|
139
|
-
// CosmosJs simulates tx and do transfer
|
|
140
119
|
const resultAuto = await client.sendTokens(sender, to, amount, "auto");
|
|
141
120
|
return resultAuto.transactionHash;
|
|
142
121
|
}
|
|
122
|
+
parseEventAttributes(attributes) {
|
|
123
|
+
const result = {};
|
|
124
|
+
for (const attr of attributes) {
|
|
125
|
+
try {
|
|
126
|
+
const key = Buffer.from(attr.key, 'base64').toString('utf-8');
|
|
127
|
+
const value = attr.value ? Buffer.from(attr.value, 'base64').toString('utf-8') : '';
|
|
128
|
+
result[key] = value;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
result[attr.key] = attr.value || '';
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
async rpcCall(method, params = {}) {
|
|
137
|
+
const resp = await proxyFetch(this.rpcUrl, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: { 'Content-Type': 'application/json' },
|
|
140
|
+
body: JSON.stringify({
|
|
141
|
+
jsonrpc: '2.0',
|
|
142
|
+
id: 1,
|
|
143
|
+
method,
|
|
144
|
+
params
|
|
145
|
+
})
|
|
146
|
+
});
|
|
147
|
+
if (!resp.ok) {
|
|
148
|
+
throw new Error(`Cosmos RPC error ${resp.status}: ${(await resp.text()).substring(0, 1024)}`);
|
|
149
|
+
}
|
|
150
|
+
const json = await resp.json();
|
|
151
|
+
if (json.error) {
|
|
152
|
+
throw new Error(`Cosmos RPC error: ${JSON.stringify(json.error)}`);
|
|
153
|
+
}
|
|
154
|
+
return json.result;
|
|
155
|
+
}
|
|
143
156
|
}
|
|
144
157
|
//# sourceMappingURL=cosmos.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../src/networks/cosmos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cosmos.js","sourceRoot":"","sources":["../../src/networks/cosmos.ts"],"names":[],"mappings":"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"}
|
package/dist/networks/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { TonNetwork } from './ton.js';
|
|
|
5
5
|
import { CantonNetwork } from './canton.js';
|
|
6
6
|
import { BtcNetwork } from './btc.js';
|
|
7
7
|
import { CosmosNetwork } from "./cosmos.js";
|
|
8
|
+
import { XrpNetwork } from './xrp.js';
|
|
8
9
|
const networkBuilders = {
|
|
9
10
|
"testBTC": (cf) => new BtcNetwork(cf.rpcUrl, 1),
|
|
10
11
|
"testETH": (cf) => new EvmNetwork(cf.rpcUrl, 1),
|
|
@@ -12,6 +13,8 @@ const networkBuilders = {
|
|
|
12
13
|
"testTRX": (cf) => new TrxNetwork(cf.rpcUrl, 10),
|
|
13
14
|
"testSOL": (cf) => new SolNetwork(cf.rpcUrl, 10),
|
|
14
15
|
"testCC": (cf) => new CantonNetwork(cf.rpcUrl, cf.ledgerApiUrl, cf.scanApiUrl, cf.authUrl, cf.clientId, cf.clientSecret, cf.walletAddress, cf.daUtilitiesApiUrl),
|
|
16
|
+
"testXRP": (cf) => new XrpNetwork(cf.rpcUrl, 1),
|
|
17
|
+
"testGNK": (cf) => new CosmosNetwork(cf.rpcUrl, 'ngonka', 'gonka', 0, 1),
|
|
15
18
|
"BTC": (cf) => new BtcNetwork(cf.rpcUrl, 2),
|
|
16
19
|
"ETH": (cf) => new EvmNetwork(cf.rpcUrl, 4),
|
|
17
20
|
"OP": (cf) => new EvmNetwork(cf.rpcUrl, 20),
|
|
@@ -25,7 +28,7 @@ const networkBuilders = {
|
|
|
25
28
|
"TON": (cf) => new TonNetwork(cf.rpcUrl, 20),
|
|
26
29
|
"CC": (cf) => new CantonNetwork(cf.rpcUrl, cf.ledgerApiUrl, cf.scanApiUrl, cf.authUrl, cf.clientId, cf.clientSecret, cf.walletAddress, cf.daUtilitiesApiUrl),
|
|
27
30
|
"GNK": (cf) => new CosmosNetwork(cf.rpcUrl, 'ngonka', 'gonka', 0, 1),
|
|
28
|
-
"
|
|
31
|
+
"XRP": (cf) => new XrpNetwork(cf.rpcUrl, 1),
|
|
29
32
|
};
|
|
30
33
|
export const initNetworks = (configs, filter) => Object.entries(networkBuilders).reduce((acc, [networkName, builder]) => {
|
|
31
34
|
if (configs[networkName]?.rpcUrl && (!filter || filter(configs[networkName]))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/networks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/networks/index.ts"],"names":[],"mappings":"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"}
|
package/dist/networks/ton.js
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Network, TransactionData } from './index.js';
|
|
2
|
+
export declare class XrpNetwork implements Network {
|
|
3
|
+
private readonly rpcUrl;
|
|
4
|
+
private readonly authHeaders;
|
|
5
|
+
private readonly confirmations;
|
|
6
|
+
private readonly nativeAssetDecimals;
|
|
7
|
+
readonly retryDelay: number;
|
|
8
|
+
constructor(rpcUrl: string, confirmations?: number);
|
|
9
|
+
ping(): Promise<void>;
|
|
10
|
+
getDecimals(tokenAddress: string): Promise<number>;
|
|
11
|
+
getTxData(txHash: string, tokenAddress: string, recipientAddress: string): Promise<TransactionData | undefined>;
|
|
12
|
+
transfer(privateKey: string, to: string, value: bigint, tokenAddress: string): Promise<string>;
|
|
13
|
+
private parseTokenAddress;
|
|
14
|
+
private parseTomlDecimals;
|
|
15
|
+
private getCurrentValidatedLedger;
|
|
16
|
+
private rpcCall;
|
|
17
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import Big from 'big.js';
|
|
2
|
+
import { Wallet } from 'xrpl';
|
|
3
|
+
import { log } from '../utils.js';
|
|
4
|
+
import { proxyFetch } from '../proxy.js';
|
|
5
|
+
const DEFAULT_ISSUED_CURRENCY_DECIMALS = 15;
|
|
6
|
+
export class XrpNetwork {
|
|
7
|
+
constructor(rpcUrl, confirmations = 1) {
|
|
8
|
+
this.authHeaders = {};
|
|
9
|
+
this.nativeAssetDecimals = 6;
|
|
10
|
+
this.retryDelay = 10000;
|
|
11
|
+
if (rpcUrl.includes('@')) {
|
|
12
|
+
const [rpcUrlPart, apiKey] = rpcUrl.split('@', 2);
|
|
13
|
+
this.rpcUrl = rpcUrlPart;
|
|
14
|
+
this.authHeaders = { 'x-api-key': apiKey };
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
this.rpcUrl = rpcUrl;
|
|
18
|
+
}
|
|
19
|
+
this.confirmations = confirmations;
|
|
20
|
+
}
|
|
21
|
+
async ping() {
|
|
22
|
+
await this.rpcCall('server_info');
|
|
23
|
+
}
|
|
24
|
+
async getDecimals(tokenAddress) {
|
|
25
|
+
if (tokenAddress === "0x0") {
|
|
26
|
+
return this.nativeAssetDecimals;
|
|
27
|
+
}
|
|
28
|
+
const { issuer, currency } = this.parseTokenAddress(tokenAddress);
|
|
29
|
+
try {
|
|
30
|
+
const accountInfo = await this.rpcCall('account_info', { account: issuer, ledger_index: 'validated' });
|
|
31
|
+
const domainHex = accountInfo?.account_data?.Domain;
|
|
32
|
+
if (!domainHex) {
|
|
33
|
+
log.warn(`XRP issuer ${issuer} has no Domain field, using default decimals ${DEFAULT_ISSUED_CURRENCY_DECIMALS}`);
|
|
34
|
+
return DEFAULT_ISSUED_CURRENCY_DECIMALS;
|
|
35
|
+
}
|
|
36
|
+
const domain = Buffer.from(domainHex, 'hex').toString('utf-8');
|
|
37
|
+
const tomlUrl = `https://${domain}/.well-known/xrp-ledger.toml`;
|
|
38
|
+
const resp = await proxyFetch(tomlUrl);
|
|
39
|
+
if (!resp.ok) {
|
|
40
|
+
log.warn(`Failed to fetch ${tomlUrl}: ${resp.status}, using default decimals`);
|
|
41
|
+
return DEFAULT_ISSUED_CURRENCY_DECIMALS;
|
|
42
|
+
}
|
|
43
|
+
const toml = await resp.text();
|
|
44
|
+
const decimals = this.parseTomlDecimals(toml, currency);
|
|
45
|
+
if (decimals !== null) {
|
|
46
|
+
log.info(`Fetched decimals for ${currency}:${issuer} from ${tomlUrl}: ${decimals}`);
|
|
47
|
+
return decimals;
|
|
48
|
+
}
|
|
49
|
+
log.warn(`No display_decimals found for ${currency} in ${tomlUrl}, using default ${DEFAULT_ISSUED_CURRENCY_DECIMALS}`);
|
|
50
|
+
return DEFAULT_ISSUED_CURRENCY_DECIMALS;
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
log.warn(`Failed to fetch decimals for ${tokenAddress}: ${e}, using default ${DEFAULT_ISSUED_CURRENCY_DECIMALS}`);
|
|
54
|
+
return DEFAULT_ISSUED_CURRENCY_DECIMALS;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async getTxData(txHash, tokenAddress, recipientAddress) {
|
|
58
|
+
const result = await this.rpcCall('tx', { transaction: txHash, binary: false });
|
|
59
|
+
if (!result || result.error || result.status === 'error') {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (result.TransactionType !== 'Payment') {
|
|
63
|
+
log.warn(`Transaction ${txHash} is not a Payment: ${result.TransactionType}`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!result.validated) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const meta = result.meta || result.metaData;
|
|
70
|
+
const currentLedger = await this.getCurrentValidatedLedger();
|
|
71
|
+
const confirmed = currentLedger - result.ledger_index >= this.confirmations;
|
|
72
|
+
if (!meta || meta.TransactionResult !== 'tesSUCCESS') {
|
|
73
|
+
log.warn(`Transaction ${txHash} failed: ${meta?.TransactionResult}`);
|
|
74
|
+
return { from: "", to: "", token: "", amount: 0n, confirmed };
|
|
75
|
+
}
|
|
76
|
+
if (result.Destination !== recipientAddress) {
|
|
77
|
+
log.warn(`Transaction ${txHash} destination ${result.Destination} does not match ${recipientAddress}`);
|
|
78
|
+
return { from: "", to: "", token: "", amount: 0n, confirmed };
|
|
79
|
+
}
|
|
80
|
+
const deliveredAmount = meta.delivered_amount;
|
|
81
|
+
if (deliveredAmount === undefined || deliveredAmount === null) {
|
|
82
|
+
log.warn(`Transaction ${txHash} has no delivered_amount`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
log.info(`Confirmations ${txHash}: ${currentLedger - result.ledger_index}`);
|
|
86
|
+
if (tokenAddress === "0x0") {
|
|
87
|
+
if (typeof deliveredAmount !== 'string') {
|
|
88
|
+
log.warn(`Transaction ${txHash} native delivered_amount is not a string: ${typeof deliveredAmount}`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
from: result.Account,
|
|
93
|
+
to: result.Destination,
|
|
94
|
+
token: tokenAddress,
|
|
95
|
+
amount: BigInt(deliveredAmount),
|
|
96
|
+
confirmed
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (typeof deliveredAmount !== 'object' || !deliveredAmount.value || !deliveredAmount.currency || !deliveredAmount.issuer) {
|
|
100
|
+
log.warn(`Transaction ${txHash} issued delivered_amount is malformed`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const { currency, issuer } = this.parseTokenAddress(tokenAddress);
|
|
104
|
+
if (deliveredAmount.currency !== currency || deliveredAmount.issuer !== issuer) {
|
|
105
|
+
log.warn(`Transaction ${txHash} delivered ${deliveredAmount.currency}:${deliveredAmount.issuer} does not match ${currency}:${issuer}`);
|
|
106
|
+
return { from: "", to: "", token: "", amount: 0n, confirmed };
|
|
107
|
+
}
|
|
108
|
+
const decimals = await this.getDecimals(tokenAddress);
|
|
109
|
+
const amount = BigInt(new Big(deliveredAmount.value)
|
|
110
|
+
.times(new Big(10).pow(decimals))
|
|
111
|
+
.toFixed(0));
|
|
112
|
+
return {
|
|
113
|
+
from: result.Account,
|
|
114
|
+
to: result.Destination,
|
|
115
|
+
token: tokenAddress,
|
|
116
|
+
amount,
|
|
117
|
+
confirmed
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async transfer(privateKey, to, value, tokenAddress) {
|
|
121
|
+
const wallet = Wallet.fromSeed(privateKey);
|
|
122
|
+
const accountInfo = await this.rpcCall('account_info', {
|
|
123
|
+
account: wallet.classicAddress,
|
|
124
|
+
ledger_index: 'validated'
|
|
125
|
+
});
|
|
126
|
+
const feeResult = await this.rpcCall('fee');
|
|
127
|
+
const openLedgerFee = parseInt(feeResult.drops.open_ledger_fee);
|
|
128
|
+
const fee = Math.min(openLedgerFee, 1000).toString();
|
|
129
|
+
const currentLedger = await this.getCurrentValidatedLedger();
|
|
130
|
+
let amount;
|
|
131
|
+
if (tokenAddress === '0x0') {
|
|
132
|
+
amount = value.toString();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const { currency, issuer } = this.parseTokenAddress(tokenAddress);
|
|
136
|
+
const decimals = await this.getDecimals(tokenAddress);
|
|
137
|
+
amount = {
|
|
138
|
+
value: new Big(value.toString())
|
|
139
|
+
.div(new Big(10).pow(decimals))
|
|
140
|
+
.toFixed(),
|
|
141
|
+
currency,
|
|
142
|
+
issuer
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const signed = wallet.sign({
|
|
146
|
+
TransactionType: 'Payment',
|
|
147
|
+
Account: wallet.classicAddress,
|
|
148
|
+
Destination: to,
|
|
149
|
+
Amount: amount,
|
|
150
|
+
Sequence: accountInfo.account_data.Sequence,
|
|
151
|
+
Fee: fee,
|
|
152
|
+
LastLedgerSequence: currentLedger + 20
|
|
153
|
+
});
|
|
154
|
+
await this.rpcCall('submit', { tx_blob: signed.tx_blob });
|
|
155
|
+
return signed.hash;
|
|
156
|
+
}
|
|
157
|
+
parseTokenAddress(tokenAddress) {
|
|
158
|
+
const colonIndex = tokenAddress.indexOf('.');
|
|
159
|
+
if (colonIndex === -1) {
|
|
160
|
+
throw new Error(`Invalid XRP token address format: ${tokenAddress}. Expected "currency:issuer"`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
currency: tokenAddress.substring(0, colonIndex),
|
|
164
|
+
issuer: tokenAddress.substring(colonIndex + 1)
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
parseTomlDecimals(toml, currency) {
|
|
168
|
+
const sections = toml.split('[[CURRENCIES]]');
|
|
169
|
+
for (const section of sections) {
|
|
170
|
+
const codeMatch = section.match(/code\s*=\s*"([^"]+)"/);
|
|
171
|
+
const decimalsMatch = section.match(/display_decimals\s*=\s*(\d+)/);
|
|
172
|
+
if (codeMatch && codeMatch[1] === currency && decimalsMatch) {
|
|
173
|
+
return parseInt(decimalsMatch[1]);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
async getCurrentValidatedLedger() {
|
|
179
|
+
const result = await this.rpcCall('ledger', { ledger_index: 'validated' });
|
|
180
|
+
return result.ledger_index;
|
|
181
|
+
}
|
|
182
|
+
async rpcCall(method, params = {}) {
|
|
183
|
+
const resp = await proxyFetch(this.rpcUrl, {
|
|
184
|
+
method: 'POST',
|
|
185
|
+
headers: {
|
|
186
|
+
'Content-Type': 'application/json',
|
|
187
|
+
...this.authHeaders
|
|
188
|
+
},
|
|
189
|
+
body: JSON.stringify({
|
|
190
|
+
method,
|
|
191
|
+
params: [params]
|
|
192
|
+
})
|
|
193
|
+
});
|
|
194
|
+
if (!resp.ok) {
|
|
195
|
+
throw new Error(`XRP RPC error ${resp.status}: ${(await resp.text()).substring(0, 1024)}`);
|
|
196
|
+
}
|
|
197
|
+
const json = await resp.json();
|
|
198
|
+
return json.result;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=xrp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrp.js","sourceRoot":"","sources":["../../src/networks/xrp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bronlabs/intents-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.117",
|
|
4
4
|
"description": "SDK for Intents DeFi smart contracts",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"defi",
|
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
"tron-format-address": "^0.1.12",
|
|
56
56
|
"tronweb": "^6.0.4",
|
|
57
57
|
"winston": "^3.17.0",
|
|
58
|
-
"ws": "^8.18.3"
|
|
58
|
+
"ws": "^8.18.3",
|
|
59
|
+
"xrpl": "^4.0.0"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@types/big.js": "^6.2.2",
|