diff --git a/.gitignore b/.gitignore index 6162763b..8a454208 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ data/ .vscode/ rocksdb sequencer_runner/data/ -storage.json \ No newline at end of file +storage.json +result diff --git a/Cargo.lock b/Cargo.lock index ece48a52..50bbf3a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,9 +855,10 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -878,6 +879,7 @@ dependencies = [ "sync_wrapper", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -1110,9 +1112,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] @@ -1636,16 +1638,29 @@ dependencies = [ ] [[package]] -name = "data-encoding" -version = "2.10.0" +name = "dashmap" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-encoding-macro" -version = "0.1.19" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8142a83c17aa9461d637e649271eae18bf2edd00e91f2e105df36c3c16355bdb" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -1653,12 +1668,12 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -2102,6 +2117,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "forwarded-header-value" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" +dependencies = [ + "nonempty", + "thiserror 1.0.69", +] + [[package]] name = "futures" version = "0.3.31" @@ -2312,6 +2337,26 @@ dependencies = [ "web-sys", ] +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", +] + [[package]] name = "group" version = "0.13.0" @@ -2376,6 +2421,12 @@ dependencies = [ "ahash 0.8.12", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -2789,7 +2840,7 @@ dependencies = [ "common", "nssa", "nssa_core", - "schemars 1.2.1", + "schemars 1.2.0", "serde", ] @@ -2799,7 +2850,7 @@ version = "0.1.0" dependencies = [ "indexer_service_protocol", "jsonrpsee", - "schemars 1.2.1", + "schemars 1.2.0", "serde_json", ] @@ -3076,7 +3127,7 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tokio-stream", - "tower", + "tower 0.5.2", "tracing", "wasm-bindgen-futures", ] @@ -3100,7 +3151,7 @@ dependencies = [ "serde_json", "thiserror 2.0.17", "tokio", - "tower", + "tower 0.5.2", "url", ] @@ -3140,7 +3191,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", - "tower", + "tower 0.5.2", "tracing", ] @@ -3165,7 +3216,7 @@ dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", - "tower", + "tower 0.5.2", ] [[package]] @@ -3178,7 +3229,7 @@ dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", - "tower", + "tower 0.5.2", "url", ] @@ -3394,7 +3445,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "logos-blockchain-blend-crypto" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "blake2", "logos-blockchain-groth16", @@ -3408,7 +3459,7 @@ dependencies = [ [[package]] name = "logos-blockchain-blend-message" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "blake2", "derivative", @@ -3430,7 +3481,7 @@ dependencies = [ [[package]] name = "logos-blockchain-blend-proofs" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "ed25519-dalek", "generic-array 1.3.5", @@ -3445,7 +3496,7 @@ dependencies = [ [[package]] name = "logos-blockchain-chain-broadcast-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "derivative", @@ -3461,7 +3512,7 @@ dependencies = [ [[package]] name = "logos-blockchain-chain-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "bytes", @@ -3491,7 +3542,7 @@ dependencies = [ [[package]] name = "logos-blockchain-circuits-prover" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "logos-blockchain-circuits-utils", "tempfile", @@ -3500,7 +3551,7 @@ dependencies = [ [[package]] name = "logos-blockchain-circuits-utils" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "dirs", ] @@ -3508,7 +3559,7 @@ dependencies = [ [[package]] name = "logos-blockchain-common-http-client" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "futures", "logos-blockchain-chain-broadcast-service", @@ -3525,7 +3576,7 @@ dependencies = [ [[package]] name = "logos-blockchain-core" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "ark-ff 0.4.2", "bincode", @@ -3533,16 +3584,15 @@ dependencies = [ "bytes", "const-hex", "futures", + "generic-array 1.3.5", "hex", "logos-blockchain-blend-proofs", "logos-blockchain-cryptarchia-engine", "logos-blockchain-groth16", "logos-blockchain-key-management-system-keys", - "logos-blockchain-poc", "logos-blockchain-pol", "logos-blockchain-poseidon2", "logos-blockchain-utils", - "logos-blockchain-utxotree", "multiaddr", "nom 8.0.0", "num-bigint", @@ -3555,7 +3605,7 @@ dependencies = [ [[package]] name = "logos-blockchain-cryptarchia-engine" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "cfg_eval", "logos-blockchain-utils", @@ -3570,7 +3620,7 @@ dependencies = [ [[package]] name = "logos-blockchain-cryptarchia-sync" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "bytes", "futures", @@ -3587,7 +3637,7 @@ dependencies = [ [[package]] name = "logos-blockchain-groth16" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -3605,25 +3655,28 @@ dependencies = [ [[package]] name = "logos-blockchain-http-api-common" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "axum", + "governor", "logos-blockchain-core", "logos-blockchain-key-management-system-keys", "serde", "serde_json", "serde_with", + "tower_governor", ] [[package]] name = "logos-blockchain-key-management-system-keys" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "bytes", "ed25519-dalek", "generic-array 1.3.5", + "logos-blockchain-blend-proofs", "logos-blockchain-groth16", "logos-blockchain-key-management-system-macros", "logos-blockchain-poseidon2", @@ -3643,38 +3696,21 @@ dependencies = [ [[package]] name = "logos-blockchain-key-management-system-macros" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "proc-macro2", "quote", "syn 2.0.111", ] -[[package]] -name = "logos-blockchain-key-management-system-operators" -version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" -dependencies = [ - "async-trait", - "logos-blockchain-blend-proofs", - "logos-blockchain-core", - "logos-blockchain-groth16", - "logos-blockchain-key-management-system-keys", - "logos-blockchain-poseidon2", - "logos-blockchain-utxotree", - "tokio", - "tracing", -] - [[package]] name = "logos-blockchain-key-management-system-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "log", "logos-blockchain-key-management-system-keys", - "logos-blockchain-key-management-system-operators", "overwatch", "serde", "thiserror 2.0.17", @@ -3685,7 +3721,7 @@ dependencies = [ [[package]] name = "logos-blockchain-ledger" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "derivative", "logos-blockchain-blend-crypto", @@ -3695,7 +3731,7 @@ dependencies = [ "logos-blockchain-cryptarchia-engine", "logos-blockchain-groth16", "logos-blockchain-key-management-system-keys", - "logos-blockchain-pol", + "logos-blockchain-mmr", "logos-blockchain-utils", "logos-blockchain-utxotree", "num-bigint", @@ -3706,10 +3742,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "logos-blockchain-mmr" +version = "0.1.0" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" +dependencies = [ + "ark-ff 0.4.2", + "logos-blockchain-groth16", + "logos-blockchain-poseidon2", + "rpds", + "serde", +] + [[package]] name = "logos-blockchain-network-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "futures", @@ -3722,25 +3770,10 @@ dependencies = [ "tracing", ] -[[package]] -name = "logos-blockchain-poc" -version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" -dependencies = [ - "logos-blockchain-circuits-prover", - "logos-blockchain-circuits-utils", - "logos-blockchain-groth16", - "logos-blockchain-witness-generator", - "num-bigint", - "serde", - "serde_json", - "thiserror 2.0.17", -] - [[package]] name = "logos-blockchain-pol" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "logos-blockchain-circuits-prover", "logos-blockchain-circuits-utils", @@ -3756,7 +3789,7 @@ dependencies = [ [[package]] name = "logos-blockchain-poq" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "logos-blockchain-circuits-prover", "logos-blockchain-circuits-utils", @@ -3772,7 +3805,7 @@ dependencies = [ [[package]] name = "logos-blockchain-poseidon2" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -3783,7 +3816,7 @@ dependencies = [ [[package]] name = "logos-blockchain-services-utils" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "futures", @@ -3798,7 +3831,7 @@ dependencies = [ [[package]] name = "logos-blockchain-storage-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "bytes", @@ -3815,7 +3848,7 @@ dependencies = [ [[package]] name = "logos-blockchain-time-service" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "futures", @@ -3833,7 +3866,7 @@ dependencies = [ [[package]] name = "logos-blockchain-utils" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "async-trait", "blake2", @@ -3850,9 +3883,10 @@ dependencies = [ [[package]] name = "logos-blockchain-utxotree" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "ark-ff 0.4.2", + "logos-blockchain-core", "logos-blockchain-groth16", "logos-blockchain-poseidon2", "num-bigint", @@ -3864,7 +3898,7 @@ dependencies = [ [[package]] name = "logos-blockchain-witness-generator" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "tempfile", ] @@ -3872,7 +3906,7 @@ dependencies = [ [[package]] name = "logos-blockchain-zksign" version = "0.1.0" -source = "git+https://github.com/logos-blockchain/logos-blockchain.git#271a97ebd03f21a13e9ca72ef8411fd478960296" +source = "git+https://github.com/logos-blockchain/logos-blockchain.git#451df112f8574aea2840d04fffb7e16e76d24f42" dependencies = [ "logos-blockchain-circuits-prover", "logos-blockchain-circuits-utils", @@ -3902,13 +3936,13 @@ dependencies = [ [[package]] name = "match-lookup" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] @@ -4067,6 +4101,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + [[package]] name = "no_std_strings" version = "0.1.3" @@ -4092,6 +4132,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + [[package]] name = "nssa" version = "0.1.0" @@ -4160,9 +4212,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" @@ -4611,6 +4663,21 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + [[package]] name = "quinn" version = "0.11.9" @@ -4749,6 +4816,15 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -4861,7 +4937,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tokio-util", - "tower", + "tower 0.5.2", "tower-http", "tower-service", "url", @@ -5187,9 +5263,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.2" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" dependencies = [ "borsh", "proptest", @@ -5373,9 +5449,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" dependencies = [ "dyn-clone", "ref-cast", @@ -5386,9 +5462,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +checksum = "4908ad288c5035a8eb12cfdf0d49270def0a268ee162b75eeee0f85d155a7c45" dependencies = [ "proc-macro2", "quote", @@ -5671,7 +5747,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.12.1", "schemars 0.9.0", - "schemars 1.2.1", + "schemars 1.2.0", "serde_core", "serde_json", "serde_with_macros", @@ -5821,6 +5897,15 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.7.3" @@ -6072,30 +6157,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde_core", + "serde", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -6329,6 +6414,17 @@ version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.5.2" @@ -6342,6 +6438,7 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -6357,7 +6454,7 @@ dependencies = [ "http-body", "iri-string", "pin-project-lite", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -6374,6 +6471,22 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" +[[package]] +name = "tower_governor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3790eac6ad3fb8d9d96c2b040ae06e2517aa24b067545d1078b96ae72f7bb9a7" +dependencies = [ + "axum", + "forwarded-header-value", + "governor", + "http 1.4.0", + "pin-project", + "thiserror 1.0.69", + "tower 0.4.13", + "tracing", +] + [[package]] name = "tracing" version = "0.1.43" @@ -6729,14 +6842,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.6", + "webpki-root-certs 1.0.5", ] [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" dependencies = [ "rustls-pki-types", ] diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..a12fbc85 --- /dev/null +++ b/flake.lock @@ -0,0 +1,64 @@ +{ + "nodes": { + "crane": { + "locked": { + "lastModified": 1769737823, + "narHash": "sha256-DrBaNpZ+sJ4stXm+0nBX7zqZT9t9P22zbk6m5YhQxS4=", + "owner": "ipetkov", + "repo": "crane", + "rev": "b2f45c3830aa96b7456a4c4bc327d04d7a43e1ba", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1770019141, + "narHash": "sha256-VKS4ZLNx4PNrABoB0L8KUpc1fE7CLpQXQs985tGfaCU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "cb369ef2efd432b3cdf8622b0ffc0a97a02f3137", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "crane": "crane", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770088046, + "narHash": "sha256-4hfYDnUTvL1qSSZEA4CEThxfz+KlwSFQ30Z9jgDguO0=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "71f9daa4e05e49c434d08627e755495ae222bc34", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..f09d4f77 --- /dev/null +++ b/flake.nix @@ -0,0 +1,96 @@ +{ + description = "Logos Execution Zone"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + crane.url = "github:ipetkov/crane"; + }; + + outputs = + { + self, + nixpkgs, + rust-overlay, + crane, + ... + }: + let + systems = [ + "x86_64-linux" + "aarch64-linux" + "aarch64-darwin" + "x86_64-windows" + ]; + + forAll = nixpkgs.lib.genAttrs systems; + + mkPkgs = + system: + import nixpkgs { + inherit system; + overlays = [ rust-overlay.overlays.default ]; + }; + in + { + packages = forAll ( + system: + let + pkgs = mkPkgs system; + rustToolchain = pkgs.rust-bin.stable.latest.default; + craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + src = ./.; + + commonArgs = { + inherit src; + buildInputs = [ pkgs.openssl ]; + nativeBuildInputs = [ + pkgs.pkg-config + pkgs.clang + pkgs.llvmPackages.libclang.lib + ]; + LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; + }; + + walletFfiPackage = craneLib.buildPackage ( + commonArgs + // { + pname = "logos-execution-zone-wallet-ffi"; + version = "0.1.0"; + cargoExtraArgs = "-p wallet-ffi"; + postInstall = '' + mkdir -p $out/include + cp wallet-ffi/wallet_ffi.h $out/include/ + '' + + pkgs.lib.optionalString pkgs.stdenv.isDarwin '' + install_name_tool -id @rpath/libwallet_ffi.dylib $out/lib/libwallet_ffi.dylib + ''; + } + ); + in + { + wallet = walletFfiPackage; + default = walletFfiPackage; + } + ); + devShells = forAll ( + system: + let + pkgs = mkPkgs system; + walletFfiPackage = self.packages.${system}.wallet; + walletFfiShell = pkgs.mkShell { + inputsFrom = [ walletFfiPackage ]; + }; + in + { + wallet = walletFfiShell; + default = walletFfiShell; + } + ); + }; +} diff --git a/wallet-ffi/wallet_ffi.h b/wallet-ffi/wallet_ffi.h deleted file mode 100644 index 4d282221..00000000 --- a/wallet-ffi/wallet_ffi.h +++ /dev/null @@ -1,679 +0,0 @@ -/** - * NSSA Wallet FFI Bindings - * - * Thread Safety: All functions are thread-safe. The wallet handle can be - * shared across threads, but operations are serialized internally. - * - * Memory Management: - * - Functions returning pointers allocate memory that must be freed - * - Use the corresponding wallet_ffi_free_* function to free memory - * - Never free memory returned by FFI using standard C free() - * - * Error Handling: - * - Functions return WalletFfiError codes - * - On error, call wallet_ffi_get_last_error() for detailed message - * - The error string must be freed with wallet_ffi_free_error_string() - * - * Initialization: - * 1. Call wallet_ffi_init_runtime() before any other function - * 2. Create wallet with wallet_ffi_create_new() or wallet_ffi_open() - * 3. Destroy wallet with wallet_ffi_destroy() when done - */ - - -#ifndef WALLET_FFI_H -#define WALLET_FFI_H - -/* Generated with cbindgen:0.29.2 */ - -#include -#include -#include -#include - -/** - * Error codes returned by FFI functions. - */ -typedef enum WalletFfiError { - /** - * Operation completed successfully - */ - SUCCESS = 0, - /** - * A null pointer was passed where a valid pointer was expected - */ - NULL_POINTER = 1, - /** - * Invalid UTF-8 string - */ - INVALID_UTF8 = 2, - /** - * Wallet handle is not initialized - */ - WALLET_NOT_INITIALIZED = 3, - /** - * Configuration error - */ - CONFIG_ERROR = 4, - /** - * Storage/persistence error - */ - STORAGE_ERROR = 5, - /** - * Network/RPC error - */ - NETWORK_ERROR = 6, - /** - * Account not found - */ - ACCOUNT_NOT_FOUND = 7, - /** - * Key not found for account - */ - KEY_NOT_FOUND = 8, - /** - * Insufficient funds for operation - */ - INSUFFICIENT_FUNDS = 9, - /** - * Invalid account ID format - */ - INVALID_ACCOUNT_ID = 10, - /** - * Tokio runtime error - */ - RUNTIME_ERROR = 11, - /** - * Password required but not provided - */ - PASSWORD_REQUIRED = 12, - /** - * Block synchronization error - */ - SYNC_ERROR = 13, - /** - * Serialization/deserialization error - */ - SERIALIZATION_ERROR = 14, - /** - * Invalid conversion from FFI types to NSSA types - */ - INVALID_TYPE_CONVERSION = 15, - /** - * Invalid Key value - */ - INVALID_KEY_VALUE = 16, - /** - * Internal error (catch-all) - */ - INTERNAL_ERROR = 99, -} WalletFfiError; - -/** - * Opaque pointer to the Wallet instance. - * - * This type is never instantiated directly - it's used as an opaque handle - * to hide the internal wallet structure from C code. - */ -typedef struct WalletHandle { - uint8_t _private[0]; -} WalletHandle; - -/** - * 32-byte array type for AccountId, keys, hashes, etc. - */ -typedef struct FfiBytes32 { - uint8_t data[32]; -} FfiBytes32; - -/** - * Single entry in the account list. - */ -typedef struct FfiAccountListEntry { - struct FfiBytes32 account_id; - bool is_public; -} FfiAccountListEntry; - -/** - * List of accounts returned by wallet_ffi_list_accounts. - */ -typedef struct FfiAccountList { - struct FfiAccountListEntry *entries; - uintptr_t count; -} FfiAccountList; - -/** - * Program ID - 8 u32 values (32 bytes total). - */ -typedef struct FfiProgramId { - uint32_t data[8]; -} FfiProgramId; - -/** - * U128 - 16 bytes little endian - */ -typedef struct FfiU128 { - uint8_t data[16]; -} FfiU128; - -/** - * Account data structure - C-compatible version of nssa Account. - * - * Note: `balance` and `nonce` are u128 values represented as little-endian - * byte arrays since C doesn't have native u128 support. - */ -typedef struct FfiAccount { - struct FfiProgramId program_owner; - /** - * Balance as little-endian [u8; 16] - */ - struct FfiU128 balance; - /** - * Pointer to account data bytes - */ - const uint8_t *data; - /** - * Length of account data - */ - uintptr_t data_len; - /** - * Nonce as little-endian [u8; 16] - */ - struct FfiU128 nonce; -} FfiAccount; - -/** - * Public key info for a public account. - */ -typedef struct FfiPublicAccountKey { - struct FfiBytes32 public_key; -} FfiPublicAccountKey; - -/** - * Public keys for a private account (safe to expose). - */ -typedef struct FfiPrivateAccountKeys { - /** - * Nullifier public key (32 bytes) - */ - struct FfiBytes32 nullifier_public_key; - /** - * Incoming viewing public key (compressed secp256k1 point) - */ - const uint8_t *incoming_viewing_public_key; - /** - * Length of incoming viewing public key (typically 33 bytes) - */ - uintptr_t incoming_viewing_public_key_len; -} FfiPrivateAccountKeys; - -/** - * Result of a transfer operation. - */ -typedef struct FfiTransferResult { - /** - * Transaction hash (null-terminated string, or null on failure) - */ - char *tx_hash; - /** - * Whether the transfer succeeded - */ - bool success; -} FfiTransferResult; - -/** - * Create a new public account. - * - * Public accounts use standard transaction signing and are suitable for - * non-private operations. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `out_account_id`: Output pointer for the new account ID (32 bytes) - * - * # Returns - * - `Success` on successful creation - * - Error code on failure - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `out_account_id` must be a valid pointer to a `FfiBytes32` struct - */ -enum WalletFfiError wallet_ffi_create_account_public(struct WalletHandle *handle, - struct FfiBytes32 *out_account_id); - -/** - * Create a new private account. - * - * Private accounts use privacy-preserving transactions with nullifiers - * and commitments. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `out_account_id`: Output pointer for the new account ID (32 bytes) - * - * # Returns - * - `Success` on successful creation - * - Error code on failure - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `out_account_id` must be a valid pointer to a `FfiBytes32` struct - */ -enum WalletFfiError wallet_ffi_create_account_private(struct WalletHandle *handle, - struct FfiBytes32 *out_account_id); - -/** - * List all accounts in the wallet. - * - * Returns both public and private accounts managed by this wallet. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `out_list`: Output pointer for the account list - * - * # Returns - * - `Success` on successful listing - * - Error code on failure - * - * # Memory - * The returned list must be freed with `wallet_ffi_free_account_list()`. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `out_list` must be a valid pointer to a `FfiAccountList` struct - */ -enum WalletFfiError wallet_ffi_list_accounts(struct WalletHandle *handle, - struct FfiAccountList *out_list); - -/** - * Free an account list returned by `wallet_ffi_list_accounts`. - * - * # Safety - * The list must be either null or a valid list returned by `wallet_ffi_list_accounts`. - */ -void wallet_ffi_free_account_list(struct FfiAccountList *list); - -/** - * Get account balance. - * - * For public accounts, this fetches the balance from the network. - * For private accounts, this returns the locally cached balance. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `account_id`: The account ID (32 bytes) - * - `is_public`: Whether this is a public account - * - `out_balance`: Output for balance as little-endian [u8; 16] - * - * # Returns - * - `Success` on successful query - * - Error code on failure - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - * - `out_balance` must be a valid pointer to a `[u8; 16]` array - */ -enum WalletFfiError wallet_ffi_get_balance(struct WalletHandle *handle, - const struct FfiBytes32 *account_id, - bool is_public, - uint8_t (*out_balance)[16]); - -/** - * Get full public account data from the network. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `account_id`: The account ID (32 bytes) - * - `out_account`: Output pointer for account data - * - * # Returns - * - `Success` on successful query - * - Error code on failure - * - * # Memory - * The account data must be freed with `wallet_ffi_free_account_data()`. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - * - `out_account` must be a valid pointer to a `FfiAccount` struct - */ -enum WalletFfiError wallet_ffi_get_account_public(struct WalletHandle *handle, - const struct FfiBytes32 *account_id, - struct FfiAccount *out_account); - -/** - * Free account data returned by `wallet_ffi_get_account_public`. - * - * # Safety - * The account must be either null or a valid account returned by - * `wallet_ffi_get_account_public`. - */ -void wallet_ffi_free_account_data(struct FfiAccount *account); - -/** - * Get the public key for a public account. - * - * This returns the public key derived from the account's signing key. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `account_id`: The account ID (32 bytes) - * - `out_public_key`: Output pointer for the public key - * - * # Returns - * - `Success` on successful retrieval - * - `KeyNotFound` if the account's key is not in this wallet - * - Error code on other failures - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - * - `out_public_key` must be a valid pointer to a `FfiPublicAccountKey` struct - */ -enum WalletFfiError wallet_ffi_get_public_account_key(struct WalletHandle *handle, - const struct FfiBytes32 *account_id, - struct FfiPublicAccountKey *out_public_key); - -/** - * Get keys for a private account. - * - * Returns the nullifier public key (NPK) and incoming viewing public key (IPK) - * for the specified private account. These keys are safe to share publicly. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `account_id`: The account ID (32 bytes) - * - `out_keys`: Output pointer for the key data - * - * # Returns - * - `Success` on successful retrieval - * - `AccountNotFound` if the private account is not in this wallet - * - Error code on other failures - * - * # Memory - * The keys structure must be freed with `wallet_ffi_free_private_account_keys()`. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - * - `out_keys` must be a valid pointer to a `FfiPrivateAccountKeys` struct - */ -enum WalletFfiError wallet_ffi_get_private_account_keys(struct WalletHandle *handle, - const struct FfiBytes32 *account_id, - struct FfiPrivateAccountKeys *out_keys); - -/** - * Free private account keys returned by `wallet_ffi_get_private_account_keys`. - * - * # Safety - * The keys must be either null or valid keys returned by - * `wallet_ffi_get_private_account_keys`. - */ -void wallet_ffi_free_private_account_keys(struct FfiPrivateAccountKeys *keys); - -/** - * Convert an account ID to a Base58 string. - * - * # Parameters - * - `account_id`: The account ID (32 bytes) - * - * # Returns - * - Pointer to null-terminated Base58 string on success - * - Null pointer on error - * - * # Memory - * The returned string must be freed with `wallet_ffi_free_string()`. - * - * # Safety - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - */ -char *wallet_ffi_account_id_to_base58(const struct FfiBytes32 *account_id); - -/** - * Parse a Base58 string into an account ID. - * - * # Parameters - * - `base58_str`: Null-terminated Base58 string - * - `out_account_id`: Output pointer for the account ID (32 bytes) - * - * # Returns - * - `Success` on successful parsing - * - `InvalidAccountId` if the string is not valid Base58 - * - Error code on other failures - * - * # Safety - * - `base58_str` must be a valid pointer to a null-terminated C string - * - `out_account_id` must be a valid pointer to a `FfiBytes32` struct - */ -enum WalletFfiError wallet_ffi_account_id_from_base58(const char *base58_str, - struct FfiBytes32 *out_account_id); - -/** - * Synchronize private accounts to a specific block. - * - * This scans the blockchain from the last synced block to the specified block, - * updating private account balances based on any relevant transactions. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `block_id`: Target block number to sync to - * - * # Returns - * - `Success` if synchronization completed - * - `SyncError` if synchronization failed - * - Error code on other failures - * - * # Note - * This operation can take a while for large block ranges. The wallet - * internally uses a progress bar which may output to stdout. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - */ -enum WalletFfiError wallet_ffi_sync_to_block(struct WalletHandle *handle, uint64_t block_id); - -/** - * Get the last synced block number. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `out_block_id`: Output pointer for the block number - * - * # Returns - * - `Success` on success - * - Error code on failure - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `out_block_id` must be a valid pointer to a `u64` - */ -enum WalletFfiError wallet_ffi_get_last_synced_block(struct WalletHandle *handle, - uint64_t *out_block_id); - -/** - * Get the current block height from the sequencer. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `out_block_height`: Output pointer for the current block height - * - * # Returns - * - `Success` on success - * - `NetworkError` if the sequencer is unreachable - * - Error code on other failures - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `out_block_height` must be a valid pointer to a `u64` - */ -enum WalletFfiError wallet_ffi_get_current_block_height(struct WalletHandle *handle, - uint64_t *out_block_height); - -/** - * Send a public token transfer. - * - * Transfers tokens from one public account to another on the network. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `from`: Source account ID (must be owned by this wallet) - * - `to`: Destination account ID - * - `amount`: Amount to transfer as little-endian [u8; 16] - * - `out_result`: Output pointer for transfer result - * - * # Returns - * - `Success` if the transfer was submitted successfully - * - `InsufficientFunds` if the source account doesn't have enough balance - * - `KeyNotFound` if the source account's signing key is not in this wallet - * - Error code on other failures - * - * # Memory - * The result must be freed with `wallet_ffi_free_transfer_result()`. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `from` must be a valid pointer to a `FfiBytes32` struct - * - `to` must be a valid pointer to a `FfiBytes32` struct - * - `amount` must be a valid pointer to a `[u8; 16]` array - * - `out_result` must be a valid pointer to a `FfiTransferResult` struct - */ -enum WalletFfiError wallet_ffi_transfer_public(struct WalletHandle *handle, - const struct FfiBytes32 *from, - const struct FfiBytes32 *to, - const uint8_t (*amount)[16], - struct FfiTransferResult *out_result); - -/** - * Register a public account on the network. - * - * This initializes a public account on the blockchain. The account must be - * owned by this wallet. - * - * # Parameters - * - `handle`: Valid wallet handle - * - `account_id`: Account ID to register - * - `out_result`: Output pointer for registration result - * - * # Returns - * - `Success` if the registration was submitted successfully - * - Error code on failure - * - * # Memory - * The result must be freed with `wallet_ffi_free_transfer_result()`. - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - * - `account_id` must be a valid pointer to a `FfiBytes32` struct - * - `out_result` must be a valid pointer to a `FfiTransferResult` struct - */ -enum WalletFfiError wallet_ffi_register_public_account(struct WalletHandle *handle, - const struct FfiBytes32 *account_id, - struct FfiTransferResult *out_result); - -/** - * Free a transfer result returned by `wallet_ffi_transfer_public` or - * `wallet_ffi_register_public_account`. - * - * # Safety - * The result must be either null or a valid result from a transfer function. - */ -void wallet_ffi_free_transfer_result(struct FfiTransferResult *result); - -/** - * Create a new wallet with fresh storage. - * - * This initializes a new wallet with a new seed derived from the password. - * Use this for first-time wallet creation. - * - * # Parameters - * - `config_path`: Path to the wallet configuration file (JSON) - * - `storage_path`: Path where wallet data will be stored - * - `password`: Password for encrypting the wallet seed - * - * # Returns - * - Opaque wallet handle on success - * - Null pointer on error (call `wallet_ffi_get_last_error()` for details) - * - * # Safety - * All string parameters must be valid null-terminated UTF-8 strings. - */ -struct WalletHandle *wallet_ffi_create_new(const char *config_path, - const char *storage_path, - const char *password); - -/** - * Open an existing wallet from storage. - * - * This loads a wallet that was previously created with `wallet_ffi_create_new()`. - * - * # Parameters - * - `config_path`: Path to the wallet configuration file (JSON) - * - `storage_path`: Path where wallet data is stored - * - * # Returns - * - Opaque wallet handle on success - * - Null pointer on error (call `wallet_ffi_get_last_error()` for details) - * - * # Safety - * All string parameters must be valid null-terminated UTF-8 strings. - */ -struct WalletHandle *wallet_ffi_open(const char *config_path, const char *storage_path); - -/** - * Destroy a wallet handle and free its resources. - * - * After calling this function, the handle is invalid and must not be used. - * - * # Safety - * - The handle must be either null or a valid handle from `wallet_ffi_create_new()` or - * `wallet_ffi_open()`. - * - The handle must not be used after this call. - */ -void wallet_ffi_destroy(struct WalletHandle *handle); - -/** - * Save wallet state to persistent storage. - * - * This should be called periodically or after important operations to ensure - * wallet data is persisted to disk. - * - * # Parameters - * - `handle`: Valid wallet handle - * - * # Returns - * - `Success` on successful save - * - Error code on failure - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - */ -enum WalletFfiError wallet_ffi_save(struct WalletHandle *handle); - -/** - * Get the sequencer address from the wallet configuration. - * - * # Parameters - * - `handle`: Valid wallet handle - * - * # Returns - * - Pointer to null-terminated string on success (caller must free with - * `wallet_ffi_free_string()`) - * - Null pointer on error - * - * # Safety - * - `handle` must be a valid wallet handle from `wallet_ffi_create_new` or `wallet_ffi_open` - */ -char *wallet_ffi_get_sequencer_addr(struct WalletHandle *handle); - -/** - * Free a string returned by wallet FFI functions. - * - * # Safety - * The pointer must be either null or a valid string returned by an FFI function. - */ -void wallet_ffi_free_string(char *ptr); - -#endif /* WALLET_FFI_H */