Skip to content

Commit 93dd652

Browse files
committed
main
1 parent 58b686c commit 93dd652

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+272
-173
lines changed

Diff for: CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
## 0.1.0
22

3-
* TODO: Release.
3+
* TODO: Release.
4+
5+
## 0.2.0
6+
7+
* TODO: Removing inefficient methods.

Diff for: README.md

+12-2
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,21 @@ At least one example has been created for each transaction type, which you can f
5656
final randomPrivate =
5757
XRPPrivateKey.random(algorithm: CryptoAlgorithm.SECP256K1);
5858
final toHex = randomPrivate.toHex();
59+
5960
/// access private key with hex
6061
final private = XRPPrivateKey.fromHex(toHex);
62+
6163
/// accesss publicKey
6264
final publicKey = private.getPublic();
65+
6366
final addressClass = publicKey.toAddress();
67+
6468
/// rpjEqWDFtoin7fFxuw6oQG2onkZkf72hhc
6569
final classicAddress = addressClass.address;
70+
6671
/// X7ZBWLX4XnxEwvQa4sgH11QbhQzuTuGeoZKEb2naE92oNEc
6772
final xAddress = addressClass.toXAddress(isTestNetwork: false);
73+
6874
/// sign with privateKey
6975
final sig = private.sign(...)
7076
@@ -83,7 +89,7 @@ Descriptions for some of these classes are provided below.
8389
signingPubKey: ownerPublic); // Sender's public key
8490
8591
```
86-
- NTF, mint, createOffer, cancelOffer
92+
- NTF, mint, createOffer, acceptOffer
8793

8894
```
8995
// mint token
@@ -128,16 +134,20 @@ Descriptions for some of these classes are provided below.
128134
signingPubKey: ownerPublic,
129135
memos: [memo],
130136
);
137+
131138
// It receives the transaction, the RPC class, and then fulfills the transaction requirements, including the fee amount, account sequence, and the last network ledger sequence.
132139
await autoFill(rpc, escrowCreate);
140+
133141
// At this point, we need to sign the transaction with the sender's account.
134142
// We receive the transaction blob and sign it with the sender's private key.
135143
final sig = owner.sign(escrowCreate.toBlob());
136144
// After completing the signature, we add it to the transaction.
137145
escrowCreate.setSignature(sig);
146+
138147
/// In the final step, we need to send the transaction to the network.
139148
/// We receive another transaction blob that already contains a signature. At this point, we no longer need to include a signature, and we must set the 'forSigning' variable to false.
140149
final trBlob = escrowCreate.toBlob(forSigning: false);
150+
141151
// broadcasting transaction
142152
final result = await rpc.submit(trBlob)
143153
// transaction hash: result.txJson.hash ()
@@ -179,7 +189,7 @@ Descriptions for some of these classes are provided below.
179189
### JSON-RPC
180190
```
181191
/// access devent
182-
final devnetRPC = XRPLRpc.ammDevnet();
192+
final devnetRPC = XRPLRpc.devNet();
183193
184194
/// access testnet
185195
final testnetRPC = XRPLRpc.testNet();

Diff for: example/transactions/amm_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import 'package:xrp_dart/src/xrpl/models/amm/amm_deposit.dart';
1010
import 'package:xrp_dart/src/xrpl/models/amm/amm_vote.dart';
1111
import 'package:xrp_dart/src/xrpl/models/amm/amm_withdraw.dart';
1212
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
13-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
13+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
1414

1515
import '../main.dart';
1616

Diff for: example/transactions/block_hole_account_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
77
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
88
import 'package:xrp_dart/src/xrpl/helper.dart';
99
import 'package:xrp_dart/src/xrpl/models/account/accountset.dart';
10-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
1111
import 'package:xrp_dart/src/xrpl/models/account/set_reqular_key.dart';
1212

1313
final rpc = XRPLRpc.testNet();

Diff for: example/transactions/check_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import 'package:xrp_dart/src/xrpl/models/check/check_cancel.dart';
1111
import 'package:xrp_dart/src/xrpl/models/check/check_cash.dart';
1212
import 'package:xrp_dart/src/xrpl/models/check/check_create.dart';
1313
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
14-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
15-
import 'package:xrp_dart/src/xrpl/models/transaction.dart';
14+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
15+
import 'package:xrp_dart/src/xrpl/models/base/transaction.dart';
1616

1717
import '../main.dart';
1818
import 'issue_token_test.dart';

Diff for: example/transactions/create_ticket_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
77
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
88
import 'package:xrp_dart/src/xrpl/helper.dart';
99
import 'package:xrp_dart/src/xrpl/models/account/accountset.dart';
10-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
1111
import 'package:xrp_dart/src/xrpl/models/ticket/ticket_create.dart';
1212

1313
final rpc = XRPLRpc.testNet();

Diff for: example/transactions/escrow_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:xrp_dart/src/xrpl/helper.dart';
77
import 'package:xrp_dart/src/xrpl/models/escrow_create/escrow_cancel.dart';
88
import 'package:xrp_dart/src/xrpl/models/escrow_create/escrow_create.dart';
99
import 'package:xrp_dart/src/xrpl/models/escrow_create/escrow_finish.dart';
10-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
1111

1212
import 'block_hole_account_test.dart';
1313

Diff for: example/transactions/issue_token_test.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
77
import 'package:xrp_dart/src/xrpl/helper.dart';
88
import 'package:xrp_dart/src/xrpl/models/account/accountset.dart';
99
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
10-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
11-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
12-
import 'package:xrp_dart/src/xrpl/models/trust_set.dart';
10+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
11+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
12+
import 'package:xrp_dart/src/xrpl/models/payment/trust_set.dart';
1313

1414
import '../main.dart';
1515

Diff for: example/transactions/nft_token_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
55
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
66
import 'package:xrp_dart/src/xrpl/helper.dart';
77
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
8-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
8+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
99
import 'package:xrp_dart/src/xrpl/models/nft/nft_accept_offer.dart';
1010
import 'package:xrp_dart/src/xrpl/models/nft/nft_token_burn.dart';
1111
import 'package:xrp_dart/src/xrpl/models/nft/nft_token_cancel_offer.dart';

Diff for: example/transactions/path_set_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
66
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
77
import 'package:xrp_dart/src/xrpl/helper.dart';
88
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
9-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
9+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
1111

1212
import '../main.dart';
1313

Diff for: example/transactions/payment_channel_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'dart:convert';
44
import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
55
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
66
import 'package:xrp_dart/src/xrpl/helper.dart';
7-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
7+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
88
import 'package:xrp_dart/src/xrpl/models/payment_channel/payment_channel_claim.dart';
99
import 'package:xrp_dart/src/xrpl/models/payment_channel/payment_channel_create.dart';
1010
import 'package:xrp_dart/src/xrpl/models/payment_channel/payment_channel_fund.dart';

Diff for: example/transactions/reqular_key_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
66
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
77
import 'package:xrp_dart/src/xrpl/helper.dart';
88
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
9-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
9+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
1111
import 'package:xrp_dart/src/xrpl/models/account/set_reqular_key.dart';
1212

1313
import '../main.dart';

Diff for: example/transactions/simple_transaction_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
44
import 'package:xrp_dart/src/xrpl/helper.dart';
55
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
6-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
6+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
77

88
import '../main.dart';
99

Diff for: example/transactions/transaction_with_memo_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import 'package:xrp_dart/src/crypto/keypair/xrpl_private_key.dart';
55
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
66
import 'package:xrp_dart/src/xrpl/helper.dart';
77
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
8-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
9-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
8+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
9+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
1010

1111
import 'block_hole_account_test.dart';
1212

Diff for: example/transactions/xrpl_multisig_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
66
import 'package:xrp_dart/src/xrpl/helper.dart';
77
import 'package:xrp_dart/src/xrpl/models/account/accountset.dart';
88
import 'package:xrp_dart/src/xrpl/models/currencies/currencies.dart';
9-
import 'package:xrp_dart/src/xrpl/models/memo.dart';
10-
import 'package:xrp_dart/src/xrpl/models/payment.dart';
9+
import 'package:xrp_dart/src/xrpl/models/memo/memo.dart';
10+
import 'package:xrp_dart/src/xrpl/models/payment/payment.dart';
1111
import 'package:xrp_dart/src/xrpl/models/signer_list/signer_list.dart';
1212
import 'package:xrp_dart/src/xrpl/models/account/signers.dart';
1313

Diff for: lib/src/crypto/crypto.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ Uint8List hash512(Uint8List data) {
2222
}
2323

2424
Uint8List hash512Half(Uint8List data) {
25-
return SHA512Digest().process(data).sublist(0, 32);
25+
final sh512 = hash512(data);
26+
return sh512.sublist(0, 32);
2627
}
2728

2829
Uint8List doubleHash(Uint8List buffer) {

Diff for: lib/src/crypto/keypair/ed_curve.dart

+58
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:typed_data';
2+
import 'package:xrp_dart/src/crypto/crypto.dart';
23
import 'package:xrp_dart/src/formating/bytes_num_formating.dart';
34

45
(BigInt, BigInt, BigInt, BigInt) _dblExt(
@@ -247,3 +248,60 @@ class EDPoint {
247248
@override
248249
int get hashCode => Object.hash(x, y);
249250
}
251+
252+
/// get publick key from ED25519 privateKey
253+
(Uint8List, Uint8List, BigInt) getMaterial(Uint8List privateKey) {
254+
final digest = hash512(privateKey);
255+
final a = digest.sublist(0, 32);
256+
final prefix = digest.sublist(32);
257+
a[0] &= 0xF8;
258+
a[31] = (a[31] & 0x7F) | 0x40;
259+
final aB = liteEddianToBigInt(a);
260+
final mul = EDCurve.generator * aB;
261+
final publicKey = mul.encodePoint();
262+
return (publicKey, prefix, aB);
263+
}
264+
265+
String signED(String hexMessage, Uint8List privateKey) {
266+
final mt = getMaterial(privateKey);
267+
final message = hexToBytes(hexMessage);
268+
final combine = Uint8List.fromList([...mt.$2, ...message]);
269+
final hashDigest = hash512(combine);
270+
BigInt r = liteEddianToBigInt(hashDigest);
271+
r = r % EDCurve.order;
272+
273+
final R = EDCurve.generator * r;
274+
final eR = R.encodePoint();
275+
final combine2 = hash512(Uint8List.fromList([...eR, ...mt.$1, ...message]));
276+
final i = liteEddianToBigInt(combine2);
277+
final S = (r + i * mt.$3) % EDCurve.order;
278+
final eRB = liteEddianToBigInt(eR);
279+
final Uint8List encodedDigest = Uint8List.fromList([
280+
...bigIntToLittleEndianBytes(eRB, 32),
281+
...bigIntToLittleEndianBytes(S, 32)
282+
]);
283+
return bytesToHex(encodedDigest);
284+
}
285+
286+
bool verifyEDBlob(String messageHex, String signatureHex, Uint8List publicKey) {
287+
final message = hexToBytes(messageHex);
288+
final signature = hexToBytes(signatureHex);
289+
final decodePublic = EDPoint.decodePoint(publicKey);
290+
int len = signature.length;
291+
if (len.isOdd) {
292+
return false;
293+
}
294+
len = len >> 1;
295+
final eR = liteEddianToBigInt(signature.sublist(0, len));
296+
final S = liteEddianToBigInt(signature.sublist(len));
297+
final eRB = bigIntToLittleEndianBytes(eR, 32);
298+
final R = EDPoint.decodePoint(eRB);
299+
final eA = decodePublic.encodePoint();
300+
final combine = hash512(Uint8List.fromList([...eRB, ...eA, ...message]));
301+
BigInt h = liteEddianToBigInt(combine);
302+
h = h % EDCurve.order;
303+
final A = decodePublic * h;
304+
final left = A + R;
305+
final right = EDCurve.generator * S;
306+
return right == left;
307+
}

Diff for: lib/src/crypto/keypair/xrpl_private_key.dart

+5-44
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class XRPPrivateKey {
2020
XRPAddressUtilities.encodeSeed(hexToBytes(entropy), algorithm);
2121
switch (algorithm) {
2222
case CryptoAlgorithm.ED25519:
23-
final privateKey = _seedToHash(hexToBytes(entropy));
24-
final public = _getMaterial(privateKey);
23+
final privateKey = hash512Half(hexToBytes(entropy));
24+
final public = xrpl.getMaterial(privateKey);
2525
return XRPPrivateKey._(privateKey, public.$1, algorithm);
2626
default:
2727
final privateKey = ec.deriveKeyPair(entropy);
@@ -42,7 +42,7 @@ class XRPPrivateKey {
4242
Uint8List bytes = hexToBytes(privateKey);
4343
if (bytes[0] == CryptoAlgorithm.ED25519.value) {
4444
bytes = bytes.sublist(1);
45-
final public = _getMaterial(bytes);
45+
final public = xrpl.getMaterial(bytes);
4646
return XRPPrivateKey._(bytes, public.$1, CryptoAlgorithm.ED25519);
4747
} else if (bytes[0] != CryptoAlgorithm.SECP256K1.value) {
4848
throw ArgumentError("Invalid prefix");
@@ -68,7 +68,7 @@ class XRPPrivateKey {
6868
final public = ec.pointFromScalar(privateKey, true);
6969
return XRPPrivateKey._(privateKey, public!, CryptoAlgorithm.SECP256K1);
7070
default:
71-
final public = _getMaterial(privateKey);
71+
final public = xrpl.getMaterial(privateKey);
7272
return XRPPrivateKey._(privateKey, public.$1, CryptoAlgorithm.ED25519);
7373
}
7474
}
@@ -87,52 +87,13 @@ class XRPPrivateKey {
8787
String sign(String message) {
8888
switch (algorithm) {
8989
case CryptoAlgorithm.ED25519:
90-
return _signED(message);
90+
return xrpl.signED(message, _privateKey);
9191
default:
9292
return _signSEC(message);
9393
}
9494
}
9595

9696
/// sign with ED25519 cryptography
97-
String _signED(String hexMessage) {
98-
final mt = _getMaterial(_privateKey);
99-
final message = hexToBytes(hexMessage);
100-
final combine = Uint8List.fromList([...mt.$2, ...message]);
101-
final hashDigest = hash512(combine);
102-
BigInt r = xrpl.liteEddianToBigInt(hashDigest);
103-
r = r % xrpl.EDCurve.order;
104-
105-
final R = xrpl.EDCurve.generator * r;
106-
final eR = R.encodePoint();
107-
final combine2 = hash512(Uint8List.fromList([...eR, ...mt.$1, ...message]));
108-
final i = xrpl.liteEddianToBigInt(combine2);
109-
final S = (r + i * mt.$3) % xrpl.EDCurve.order;
110-
final eRB = xrpl.liteEddianToBigInt(eR);
111-
final Uint8List encodedDigest = Uint8List.fromList([
112-
...xrpl.bigIntToLittleEndianBytes(eRB, 32),
113-
...xrpl.bigIntToLittleEndianBytes(S, 32)
114-
]);
115-
return bytesToHex(encodedDigest);
116-
}
117-
118-
static Uint8List _seedToHash(Uint8List seed) {
119-
final seedHash = hash512(seed);
120-
final privateKey = seedHash.sublist(0, 32);
121-
return privateKey;
122-
}
123-
124-
/// get publick key from ED25519 privateKey
125-
static (Uint8List, Uint8List, BigInt) _getMaterial(Uint8List privateKey) {
126-
final digest = hash512(privateKey);
127-
final a = digest.sublist(0, 32);
128-
final prefix = digest.sublist(32);
129-
a[0] &= 0xF8;
130-
a[31] = (a[31] & 0x7F) | 0x40;
131-
final aa = xrpl.liteEddianToBigInt(a);
132-
final mul = xrpl.EDCurve.generator * aa;
133-
final publicKey = mul.encodePoint();
134-
return (publicKey, prefix, aa);
135-
}
13697
13798
final Uint8List _privateKey;
13899
final Uint8List _publicKey;

0 commit comments

Comments
 (0)