Skip to content

Commit 315f02c

Browse files
authored
Project Ignition (#1)
* kos-types init * makefile && cargo fmt * kos-crypto * init sdk * init wallet * kos package * web demo example * error for JsValue * bytes from hex * pubkey recovery and wasm export * secp256k1 sign * JsError to Error for generate mnemonic * ed25519 sign error type * refactor secret/pubkey to keypair && add KLV partial * http_get utils * bigint type with wasm support * klever get account request * klever models * wallet get balance * add klever broadcast * use node endpoint for KLV balance * option node + toString boradcast * sign/broadcast example with KLV * add logger * add hash type && feat serialize * sdk broadcast model * numtrait bignum * kos-proto init build klever/tron proto files with helpers * black2b256 hasher * wallet refactor sign/send/broadcast && new enum models * bignumber from string * update example with wallet refactor * build proto wildcard && options * include tron serde * http user agent && timeout * cfg reqwest config not supported for wasm... * tron get balance request * preserver field names && trx options * TRX fix proto sign and broadcast message * add chain code map to api enum * hash helpers * relocate chains src * sha512 * cipher and serde * vectorize and cipher errors * break encrypt/decrypt & pem encoding * wallet lock/unlock & import/export * cipher checksum * skip lock/unlock if not needed * wallet key && improve lock/unlock process * implement CBC&CFB options for encrypt/decrypt * wallet manager * kos-crypto chiper pub use for kos * use cbor encode allow structure upgrade * mnemonic with index * Validate Mnemonic and allow none type for default * Default Mnemonic/Refactor LockUnlock/Add Tests
1 parent 0d486ca commit 315f02c

Some content is hidden

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

58 files changed

+6575
-2
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ Cargo.lock
1111

1212
# These are backup files generated by rustfmt
1313
**/*.rs.bk
14+
15+
package-lock.json

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "packages/kos-proto/proto/tron"]
2+
path = packages/kos-proto/proto/tron
3+
url = https://github.com/tronprotocol/protocol

.vscode/settings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
"./packages/kos-crypto/Cargo.toml",
44
"./packages/kos-sdk/Cargo.toml",
55
"./packages/kos-types/Cargo.toml",
6-
"./packages/kos/Cargo.toml"
6+
"./packages/kos/Cargo.toml",
7+
"./packages/kos-sdk/Cargo.toml",
8+
"./packages/kos-utils/Cargo.toml"
79
]
810
}

Cargo.toml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
[workspace]
2+
# https://doc.rust-lang.org/edition-guide/rust-2021/default-cargo-resolver.html#details
3+
resolver = "2"
4+
members = [
5+
"packages/kos-types",
6+
"packages/kos",
7+
"packages/kos-crypto",
8+
"packages/kos-sdk",
9+
]
10+
11+
[profile.release]
12+
# This makes the compiled code faster and smaller, but it makes compiling slower,
13+
# so it's only enabled in release mode.
14+
# lto = true
15+
16+
[workspace.package]
17+
authors = ["Klever <[email protected]>"]
18+
edition = "2021"
19+
homepage = "https://klever.org/"
20+
license = "Apache-2.0"
21+
repository = "https://github.com/kleverio/kos-rs"
22+
rust-version = "1.69.0"
23+
version = "0.1.0"
24+
25+
[workspace.dependencies]
26+
bech32 = "0.9.1"
27+
base58 = "0.2.0"
28+
sha2 = { version = "0.10" }
29+
sha3 = { version = "0.10" }
30+
hmac = { version = "0.12" }
31+
secp256k1 = { version = "0.27", features = ["recovery", "rand"] }
32+
ed25519-dalek = { version = "1" }
33+
coins-bip32 = { version = "0.8", default-features = false }
34+
coins-bip39 = { version = "0.8", default-features = false, features = ["english"] }
35+
bytes = { version = "1.4.0", default-features = false }
36+
elliptic-curve = { version = "0.13.4", default-features = false }
37+
hex = { version = "0.4.3", default-features = false }
38+
rand = "0.8"
39+
zeroize = { version = "1.5", features = ["derive"] }
40+
41+
prost = "0.11"
42+
prost-types = "0.11"
43+
pbjson = { version = "0.5", git = "https://github.com/klever-io/pbjson" }
44+
pbjson-types = { version = "0.5", git = "https://github.com/klever-io/pbjson" }
45+
pbjson-build = { version = "0.5", git = "https://github.com/klever-io/pbjson" }
46+
47+
reqwest = { version = "0.11", feature = ["blocking", "json"] }
48+
wasm-bindgen = "0.2"
49+
enum_delegate = "0.2"
50+
serde = { version = "1.0", default-features = false }
51+
serde_json = "1.0"
52+
log = "0.4"
53+
54+
55+
kos-types = { version = "0.1.0", path = "./packages/kos-types", default-features = false }
56+
kos-crypto = { version = "0.1.0", path = "./packages/kos-crypto", default-features = false }
57+
kos-sdk = { version = "0.1.0", path = "./packages/kos-sdk", default-features = false }
58+
kos-utils = { version = "0.1.0", path = "./packages/kos-utils", default-features = false }
59+
kos-proto = { version = "0.1.0", path = "./packages/kos-proto", default-features = false }

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.PHONY: all fmt webpack webpack-npm
2+
3+
all: fmt
4+
cargo build
5+
6+
fmt:
7+
cargo fmt --all -- --check
8+
9+
webpack:
10+
wasm-pack build --target web --out-dir ./demo/kos ./packages/kos
11+
12+
webpack-npm:
13+
wasm-pack build --target bundler --out-dir ../../demo/kos ./packages/kos
14+

demo/js/index.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
const API = "https://api.testnet.klever.finance"
2+
const NODE = "https://node.testnet.klever.finance"
3+
function debugWallet(tag, w) {
4+
let data = JSON.stringify({chain: w.getChain(), baseChain: w.getBaseChain().getName(), address: w.getAddress(), privateKey: w.getPrivateKey(), publicKey: w.getPublicKey(), mnemonic: w.getMnemonic(), path: w.getPath()})
5+
document.getElementById("demo").innerHTML += "<br><b>"+tag+":</b>"+data+"<br>";
6+
console.log(tag, data);
7+
}
8+
9+
// import kos to window on load
10+
import("../kos/kos.js").then((kos) => {
11+
window.kos = kos;
12+
});
13+
14+
// wait for kos to be loaded
15+
function waitForKOS() {
16+
return new Promise(load)
17+
function load(resolve, reject) {
18+
if (typeof window.kos !== "undefined")
19+
resolve(window.kos);
20+
else
21+
setTimeout(load.bind(this, resolve, reject), 250);
22+
};
23+
}
24+
25+
async function deriveAccounts(){
26+
console.log("loading kos...");
27+
const kos = await waitForKOS();
28+
console.log("loaded kos", kos);
29+
30+
try {
31+
[
32+
{chain: kos.Chain.TRX, model: kos.TRX},
33+
{chain: kos.Chain.KLV, model: kos.KLV},
34+
].forEach((d) => {
35+
// create new wallet from mnemonic
36+
let w1 = kos.Wallet.fromMnemonic(
37+
d.chain,
38+
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
39+
d.model.getPath(0),
40+
);
41+
debugWallet("mnemonic", w1);
42+
43+
// create a random wallet
44+
let w2 = new kos.Wallet(d.chain);
45+
debugWallet("random", w2);
46+
});
47+
} catch (e) {
48+
document.body.innerHTML += "<br><br><br><b>error:</b>"+e+"<br>";
49+
}
50+
}
51+
52+
deriveAccounts();
53+
54+
window.onload = function(){
55+
var button = document.getElementById('btnSendKLV');
56+
button.onclick = function() {
57+
sendKLV("klv1usdnywjhrlv4tcyu6stxpl6yvhplg35nepljlt4y5r7yppe8er4qujlazy", "klv1x2ejsdqz8uccl7htu4cef63z0cqnydhkd8g36tgk6qdv94hu7syqms3spm", 10)
58+
};
59+
}
60+
61+
async function sendKLV(address, to, amount, token = "KLV") {
62+
const kos = window.kos;
63+
let klvWallet = kos.Wallet.fromMnemonic(
64+
kos.Chain.KLV,
65+
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
66+
kos.KLV.getPath(0),
67+
);
68+
69+
klvWallet.setNodeUrl(NODE);
70+
71+
const tx = await klvWallet.send(to, kos.BigNumber.fromString("10"));
72+
73+
await signAndBroadcast(tx, klvWallet);
74+
}
75+
76+
async function signAndBroadcast(tx, wallet) {
77+
try {
78+
console.log({tx: tx.toString()});
79+
const toSend = wallet.sign(tx);
80+
console.log({txSigned: toSend.toString()});
81+
const result = await wallet.broadcast(toSend);
82+
console.log("TXHash:", result.hash().toString());
83+
}catch(e){
84+
console.log(e)
85+
}
86+
}

demo/package.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"scripts": {
3+
"serve": "webpack-dev-server",
4+
"build": "rimraf dist pkg && webpack",
5+
"start": "rimraf dist pkg && webpack-dev-server --hot",
6+
"test": "cargo test && wasm-pack test --headless"
7+
},
8+
"devDependencies": {
9+
"@wasm-tool/wasm-pack-plugin": "^1.1.0",
10+
"copy-webpack-plugin": "^5.0.3",
11+
"http-server": "^14.1.1",
12+
"rimraf": "^3.0.0",
13+
"rust-wasm-loader": "^0.2.0",
14+
"webpack": "^4.46.0",
15+
"webpack-cli": "^3.1.2",
16+
"webpack-dev-server": "^3.1.10"
17+
}
18+
}

demo/static/index.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en-US">
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>KOS-Rust example</title>
6+
</head>
7+
<body>
8+
<script src="index.js"></script>
9+
10+
<button id="btnSendKLV">Send KLV</button>
11+
12+
<p id="demo"></p>
13+
</body>
14+
</html>

demo/webpack.config.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const path = require("path");
2+
const CopyPlugin = require("copy-webpack-plugin");
3+
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
4+
5+
const dist = path.resolve(__dirname, "dist");
6+
7+
module.exports = {
8+
mode: "production",
9+
entry: "./js/index.js",
10+
output: {
11+
path: dist,
12+
filename: "index.js"
13+
},
14+
devServer: {
15+
contentBase: dist,
16+
},
17+
plugins: [
18+
new CopyPlugin([
19+
path.resolve(__dirname, "static")
20+
]),
21+
22+
new WasmPackPlugin({
23+
crateDirectory: path.resolve(__dirname, 'kos'),
24+
}),
25+
]
26+
};

packages/kos-crypto/Cargo.toml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[package]
2+
name = "kos-crypto"
3+
version = { workspace = true }
4+
authors = { workspace = true }
5+
edition = { workspace = true }
6+
homepage = { workspace = true }
7+
license = { workspace = true }
8+
repository = { workspace = true }
9+
rust-version = { workspace = true }
10+
11+
[dependencies]
12+
kos-types = { workspace = true, features = ["serde"] }
13+
serde = { workspace = true, features = ["derive"] }
14+
log = { workspace = true }
15+
wasm-bindgen = { workspace = true }
16+
rand = { workspace = true }
17+
zeroize = { workspace = true }
18+
coins-bip32 = { workspace = true }
19+
coins-bip39 = { workspace = true }
20+
hex = { workspace = true }
21+
sha2 = { workspace = true }
22+
sha3 = { workspace = true }
23+
hmac = { workspace = true }
24+
secp256k1 = { workspace = true, features = ["rand", "serde"] }
25+
ed25519-dalek = { workspace = true, features = ["serde"] }
26+
aes-gcm = "0.10"
27+
aes = { version = "0.8" }
28+
cfb-mode = "0.8"
29+
cbc = { version = "0.1", feature = ["block-padding", "std"] }
30+
pem = "2"
31+
pbkdf2 = { version = "0.12", features = ["simple"] }

0 commit comments

Comments
 (0)