Skip to content

Commit 3e8cda0

Browse files
committed
V3.4.0
- Stellar Address Support: Add support for stellar Contract address.
1 parent 54b38b8 commit 3e8cda0

File tree

86 files changed

+1382
-544
lines changed

Some content is hidden

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

86 files changed

+1382
-544
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 3.4.0
2+
3+
- Stellar Address Support: Add support for stellar Contract address.
4+
15
## 3.3.0
26

37
- Fix substrate key generation from seed (ECDSA, EDDSA).

example/lib/main.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,18 @@ import 'package:example/test/elctrum/mnemonic/mnemonic.dart';
8080
import 'package:example/test/elctrum/v1/v1.dart';
8181
import 'package:example/test/elctrum/v2/v2.dart';
8282
import 'package:example/test/monero/mnemonic/monero_mnemonic.dart';
83-
import 'package:example/test/monero/monero.dart';
8483
import 'package:example/test/schnorrkel/derive.dart';
8584
import 'package:example/test/schnorrkel/schnorrkel_key.dart';
8685
import 'package:example/test/schnorrkel/sign.dart';
8786
import 'package:example/test/schnorrkel/vrf.dart';
8887
import 'package:example/test/secure_storage.dart';
88+
import 'package:example/test/signer/ethereum_test.dart';
89+
import 'package:example/test/signer/tron_test.dart';
90+
import 'package:example/test/signer/xrp_test.dart';
8991
import 'package:example/test/ss58/ss58.dart';
9092
import 'package:example/test/substrate/scale.dart';
9193
import 'package:example/test/substrate/substrate.dart';
94+
import 'package:example/test/ton_mnemonic/ton_mnemonic.dart';
9295
import 'package:example/test/uuid.dart';
9396
import 'package:example/test/wif/wif.dart';
9497
import 'package:flutter/material.dart';
@@ -157,7 +160,12 @@ void _testAll() async {
157160
_test("algorandMnemonic and derive address", algorandMnemonicAndAddressTest);
158161
_test("substrate derive", substrateDeriveTest);
159162
_test("monero mnemonic", moneroMnemonucTest);
160-
_test("monero", moneroTest);
163+
_test("ton mnemonic", tonMnemonic);
164+
_test("sign ethereum", signEthereum);
165+
_test("sign tron", signTron);
166+
_test("sign xrp", signXrp);
167+
168+
// _test("monero", moneroTest);
161169
_test("electrum v2", electrumV2Test);
162170
_test("electrum v1", electrumV1Test);
163171
_test("electrum mnemonic", electrumMnemonicTest);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:blockchain_utils/blockchain_utils.dart';
2+
3+
void signEthereum() {
4+
final signer = ETHSigner.fromKeyBytes(BytesUtils.fromHexString(
5+
"cd23c9f2e2c096ee3be3c4e0e58199800c0036ea27b7cd4e838bbde8b21788b3"));
6+
final message =
7+
BytesUtils.fromHexString("0x84df2267aa318f451199223385516162");
8+
final sign = signer.signProsonalMessage(message);
9+
final verify = signer.toVerifyKey().verifyPersonalMessage(message, sign);
10+
assert(BytesUtils.toHexString(sign) ==
11+
"4b57a6ca5e2f5da5ae9667d69bb61285808b54ed08dacc76d77b02a8e6f6be905bf4f6fce63ff4142af25458c3bb8ecbda4990b76783a35561382096e30082321b");
12+
assert(verify, true);
13+
final publicKey = ETHVerifier.getPublicKey(message, sign);
14+
assert(
15+
BytesUtils.bytesEqual(publicKey?.toBytes(),
16+
signer.toVerifyKey().edsaVerifyKey.publicKey.toBytes()),
17+
true);
18+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'dart:convert';
2+
3+
import 'package:blockchain_utils/blockchain_utils.dart';
4+
5+
void signTron() {
6+
final signer = TronSigner.fromKeyBytes(BytesUtils.fromHexString(
7+
"43985273a3d94eb753fe6acfd7003e88254effce1eb53e2e97b8522558a98038"));
8+
final message = utf8.encode("message");
9+
final sign = signer.signProsonalMessage(message);
10+
final verify = signer.toVerifyKey().verifyPersonalMessage(message, sign);
11+
assert(BytesUtils.toHexString(sign) ==
12+
"fde00bc33d78109bc61de314c1c0526a047e22a2aaae473ca84b32d8aa35ed3e03720e05d614087e3d8c6fae63879755b32aa08818a2d4de66fee1a617a971671b");
13+
assert(verify, true);
14+
final publicKey = TronVerifier.getPublicKey(message, sign);
15+
assert(
16+
BytesUtils.bytesEqual(publicKey?.toBytes(),
17+
signer.toVerifyKey().edsaVerifyKey.publicKey.toBytes()),
18+
true);
19+
}

example/lib/test/signer/xrp_test.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:blockchain_utils/blockchain_utils.dart';
2+
3+
void signXrp() {
4+
const String blob =
5+
"535458001200052200000000240272eb8c201b0272ec4a68400000000000000a732103ef451404c8753525f760059c5f4431181f29d09448856cc8fd867a7346698aae8114440bee336b72b7f4ad58b1b2fd2ba0ce9ba7625288140000000000000000000000000000000000000001f9ea7c04546578747d0e4d52544e4554574f524b2e636f6d7e0a746578742f706c61696ee1f1";
6+
const String sig =
7+
"3044022043b52acacfe98066ade99274ac96d5dab65738b344fed8d78acca1c33894d8a5022021f3dd6caba9c9904cf1347a3440652ba47af844cfb1bfcd7ad878a6dd9a3909";
8+
final signer = XrpSigner.fromKeyBytes(
9+
BytesUtils.fromHexString(
10+
"C63383DAC6B5B043A66B8E1BBBC3CF48E6B170862B7AE36217F516237211E39B"),
11+
EllipticCurveTypes.secp256k1);
12+
13+
assert(BytesUtils.toHexString(signer.sign(BytesUtils.fromHexString(blob))) ==
14+
sig);
15+
const String blob2 =
16+
"535458001200032200000000240272eb8d201b0272eedc20210000000468400000000000000a732103ef451404c8753525f760059c5f4431181f29d09448856cc8fd867a7346698aae8114440bee336b72b7f4ad58b1b2fd2ba0ce9ba76252f9ea7c04546578747d0e4d52544e4554574f524b2e636f6d7e0a746578742f706c61696ee1f1";
17+
const String sig2 =
18+
"3045022100d37aac7c901baa32a5fc1759d41740216264193f85662e186c419e7481f0f7a102202948dfd2f13b724bdc16e71335117b9a644a27f409c4ec905f5568bad96ec680";
19+
final signer2 = XrpSigner.fromKeyBytes(
20+
BytesUtils.fromHexString(
21+
"C63383DAC6B5B043A66B8E1BBBC3CF48E6B170862B7AE36217F516237211E39B"),
22+
EllipticCurveTypes.secp256k1);
23+
assert(
24+
BytesUtils.toHexString(signer2.sign(BytesUtils.fromHexString(blob2))) ==
25+
sig2);
26+
}

example/lib/test/substrate/substrate.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ void substrateDeriveTest() {
1111
final seed = BytesUtils.fromHexString(i["private_key"]);
1212
final coin = SubstrateCoins.values.firstWhere((element) =>
1313
element.name.toLowerCase() ==
14-
(i["coin"] as String).toLowerCase().replaceAll("_", ""));
14+
"${(i["coin"] as String).toLowerCase().replaceAll("_", "")}sr25519");
1515
Substrate w = Substrate.fromPrivateKey(seed, coin);
1616
assert(w.publicKey.compressed.toHex() == i["public_key"]);
1717
assert(w.priveKey.raw.toHex() == i["private_key"]);
@@ -31,7 +31,7 @@ void substrateDeriveTest() {
3131
final secret = (w.priveKey.privKey as Sr25519PrivateKey).secretKey;
3232
final testPrive =
3333
BytesUtils.fromHexString(childInfo["private_key"]).sublist(0, 32);
34-
assert(BytesUtils.bytesEqual(testPrive, secret.key()));
34+
assert(BytesUtils.bytesEqual(testPrive, secret.key()), true);
3535
}
3636
}
3737
}
@@ -41,7 +41,7 @@ void substrateDeriveTest() {
4141
final seed = BytesUtils.fromHexString(i["seed"]);
4242
final coin = SubstrateCoins.values.firstWhere((element) =>
4343
element.name.toLowerCase() ==
44-
(i["coin"] as String).toLowerCase().replaceAll("_", ""));
44+
"${(i["coin"] as String).toLowerCase().replaceAll("_", "")}sr25519");
4545
Substrate w = Substrate.fromSeed(seed, coin);
4646
assert(w.publicKey.compressed.toHex() == i["public_key"]);
4747
assert(w.priveKey.raw.toHex() == i["private_key"]);
@@ -61,7 +61,7 @@ void substrateDeriveTest() {
6161
final secret = (w.priveKey.privKey as Sr25519PrivateKey).secretKey;
6262
final testPrive =
6363
BytesUtils.fromHexString(childInfo["private_key"]).sublist(0, 32);
64-
assert(BytesUtils.bytesEqual(testPrive, secret.key()));
64+
assert(BytesUtils.bytesEqual(testPrive, secret.key()) == true);
6565
}
6666
}
6767
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import 'package:blockchain_utils/blockchain_utils.dart';
2+
3+
void tonMnemonic() {
4+
_test();
5+
_test2();
6+
_test3();
7+
_test4();
8+
}
9+
10+
void _test() {
11+
final mnemonic = [
12+
"current",
13+
"phrase",
14+
"now",
15+
"sea",
16+
"verify",
17+
"chapter",
18+
"rain",
19+
"below",
20+
"office",
21+
"voice",
22+
"trade",
23+
"share",
24+
"inject",
25+
"impulse",
26+
"empower",
27+
"bitter",
28+
"fee",
29+
"half",
30+
"excess",
31+
"oval",
32+
"genuine",
33+
"happy",
34+
"wrong",
35+
"trust"
36+
];
37+
final seed =
38+
TonSeedGenerator(Mnemonic.fromList(mnemonic)).generate(password: "");
39+
final privateKey = Ed25519PrivateKey.fromBytes(
40+
seed.sublist(0, Ed25519KeysConst.privKeyByteLen));
41+
assert(privateKey.publicKey.toHex(withPrefix: false) ==
42+
"cd1fea46e4a59115211ed483161bb315a8e0028ae190b24c1838351dc0bdf040");
43+
}
44+
45+
void _test2() {
46+
final mnemonic = [
47+
"smoke",
48+
"area",
49+
"audit",
50+
"artist",
51+
"tennis",
52+
"owner",
53+
"salute",
54+
"donate",
55+
"hole",
56+
"victory",
57+
"such",
58+
"boost",
59+
"ahead",
60+
"jeans",
61+
"protect",
62+
"decade",
63+
"report",
64+
"float",
65+
"rather",
66+
"sheriff",
67+
"salad",
68+
"supreme",
69+
"acquire",
70+
"bulb"
71+
];
72+
final seed =
73+
TonSeedGenerator(Mnemonic.fromList(mnemonic)).generate(password: "");
74+
final privateKey = Ed25519PrivateKey.fromBytes(
75+
seed.sublist(0, Ed25519KeysConst.privKeyByteLen));
76+
assert(privateKey.toHex() ==
77+
"ab460eb3462747a1e57e75e2c6a3afab420a7a297f53d5258b9b7fe25113cebe");
78+
}
79+
80+
void _test3() {
81+
final mnemonic = [
82+
"woman",
83+
"harvest",
84+
"crawl",
85+
"blind",
86+
"piece",
87+
"portion",
88+
"draft",
89+
"write",
90+
"win",
91+
"coil",
92+
"lawsuit",
93+
"illegal"
94+
];
95+
final seed = TonSeedGenerator(Mnemonic.fromList(mnemonic))
96+
.generate(password: "MRTNETWORK");
97+
final privateKey = Ed25519PrivateKey.fromBytes(
98+
seed.sublist(0, Ed25519KeysConst.privKeyByteLen));
99+
assert(privateKey.toHex() ==
100+
"b91ad008bdf851289acaa77401612674ea3906eba0ca044374ff38f2a170ba85");
101+
}
102+
103+
void _test4() {
104+
final mnemonic = [
105+
"woman",
106+
"harvest",
107+
"crawl",
108+
"blind",
109+
"piece",
110+
"portion",
111+
"draft",
112+
"write",
113+
"win",
114+
"coil",
115+
"lawsuit",
116+
"illegal"
117+
];
118+
final validator = TomMnemonicValidator();
119+
assert(validator.isValid(Mnemonic.fromList(mnemonic)), false);
120+
assert(validator.isValid(Mnemonic.fromList(mnemonic), password: "MRTNETWORK"),
121+
true);
122+
}

example/macos/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@
227227
isa = PBXProject;
228228
attributes = {
229229
LastSwiftUpdateCheck = 0920;
230-
LastUpgradeCheck = 1430;
230+
LastUpgradeCheck = 1510;
231231
ORGANIZATIONNAME = "";
232232
TargetAttributes = {
233233
331C80D4294CF70F00263BE5 = {

example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1430"
3+
LastUpgradeVersion = "1510"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

example/pubspec.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,18 +193,18 @@ packages:
193193
dependency: transitive
194194
description:
195195
name: material_color_utilities
196-
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
196+
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
197197
url: "https://pub.dev"
198198
source: hosted
199-
version: "0.8.0"
199+
version: "0.11.1"
200200
meta:
201201
dependency: transitive
202202
description:
203203
name: meta
204-
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
204+
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
205205
url: "https://pub.dev"
206206
source: hosted
207-
version: "1.12.0"
207+
version: "1.15.0"
208208
mime:
209209
dependency: transitive
210210
description:

example/test/test_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// ignore_for_file: avoid_print
1+
// // ignore_for_file: avoid_print
22

33
import 'package:example/test/address/ada_shelly/ada_shelly.dart';
44
import 'package:example/test/address/algo/algo.dart';

lib/base32/base32.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
OF THE POSSIBILITY OF SUCH DAMAGE.
5353
*/
5454

55+
import 'package:blockchain_utils/helper/helper.dart';
5556
import 'package:blockchain_utils/utils/utils.dart';
5657
import 'package:blockchain_utils/exception/exception.dart';
5758

@@ -117,14 +118,14 @@ class _Base32Utils {
117118
if (char == '=') {
118119
return;
119120
}
120-
final symbol = (_Base32Const._b32rev[alphabet]![char] ?? 0) & 0xff;
121+
final symbol = (_Base32Const._b32rev[alphabet]![char] ?? 0) & mask8;
121122
shift -= 5;
122123
if (shift > 0) {
123-
carry |= (symbol << shift) & 0xff;
124+
carry |= (symbol << shift) & mask8;
124125
} else if (shift < 0) {
125126
decoded.add(carry | (symbol >> -shift));
126127
shift += 8;
127-
carry = (symbol << shift) & 0xff;
128+
carry = (symbol << shift) & mask8;
128129
} else {
129130
decoded.add(carry | symbol);
130131
shift = 8;
@@ -228,6 +229,8 @@ class Base32Encoder {
228229
/// Encode the provided List<int> of bytes into a Base32 encoded string.
229230
/// Optionally, you can specify a custom alphabet for encoding.
230231
static String encodeBytes(List<int> data, [String? customAlphabet]) {
232+
data = data.asImmutableBytes;
233+
231234
/// Encode the input bytes in Base32.
232235
String encoded = StringUtils.decode(
233236
_Base32Utils._b32encode(_Base32Const.alphabet, data));

lib/base58/base58_base.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:blockchain_utils/base58/base58_ex.dart';
22
import 'package:blockchain_utils/crypto/quick_crypto.dart';
33
import 'package:blockchain_utils/exception/exception.dart';
4+
import 'package:blockchain_utils/helper/helper.dart';
45
import 'package:blockchain_utils/utils/utils.dart';
56

67
enum Base58Alphabets {
@@ -93,6 +94,7 @@ class Base58Encoder {
9394
/// A Base58 encoded string of the input dataBytes with a checksum.
9495
static String checkEncode(List<int> dataBytes,
9596
[Base58Alphabets base58alphabets = Base58Alphabets.bitcoin]) {
97+
dataBytes = dataBytes.asImmutableBytes;
9698
final checksum = Base58Utils.computeChecksum(dataBytes);
9799
final dataWithChecksum = List<int>.from([...dataBytes, ...checksum]);
98100
return encode(dataWithChecksum, base58alphabets);
@@ -101,7 +103,7 @@ class Base58Encoder {
101103

102104
/// A utility class for decoding Base58 encoded strings into List<int> data using a specified alphabet.
103105
class Base58Decoder {
104-
/// Decode the provided Base58 encoded [dataStr] into a List<int> of data bytes using the specified [base58alphabets].
106+
/// Decode the provided Base58 encoded [data] into a List<int> of data bytes using the specified [base58alphabets].
105107
///
106108
/// Parameters:
107109
/// - data: The Base58 encoded string to be decoded.
@@ -114,7 +116,7 @@ class Base58Decoder {
114116
final alphabet = Base58Const.alphabets[base58alphabets]!;
115117
var val = BigInt.zero;
116118

117-
for (var i = 0; i < data.length; i++) {
119+
for (int i = 0; i < data.length; i++) {
118120
final c = data[data.length - 1 - i];
119121
final charIndex = alphabet.indexOf(c);
120122
if (charIndex == -1) {

0 commit comments

Comments
 (0)