diff --git a/.cargo/config.toml b/.cargo/config.toml index f21b129d0..3a49341d5 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -4,11 +4,6 @@ TS_RS_EXPORT_DIR = { value = "psy_sdk/psy-ts-sdk/packages/psy-sdk/src/types", re [target.wasm32-unknown-unknown] rustflags = [ - "-C", "target-feature=+atomics", "-C", "panic=abort", '--cfg', 'getrandom_backend="js"' ] - -[unstable] -build-std = ["panic_abort", "std"] -# build-std-features = ["panic_immediate_abort"] \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 5de8efa33..2800df9e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1268,7 +1268,7 @@ dependencies = [ [[package]] name = "cf_utils" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -4045,7 +4045,7 @@ dependencies = [ [[package]] name = "kvq" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "ambassador", "anyhow", @@ -4670,7 +4670,7 @@ dependencies = [ [[package]] name = "parth_common" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -4695,7 +4695,7 @@ dependencies = [ [[package]] name = "parth_core" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -4730,7 +4730,7 @@ dependencies = [ [[package]] name = "parth_crypto" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "parth_core", @@ -4789,7 +4789,7 @@ dependencies = [ [[package]] name = "pderive" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "proc-macro2", "quote", @@ -5192,7 +5192,7 @@ dependencies = [ [[package]] name = "pser" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "bincode", @@ -5209,7 +5209,7 @@ dependencies = [ [[package]] name = "psy_api_core" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5245,7 +5245,7 @@ dependencies = [ [[package]] name = "psy_client_common" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5276,7 +5276,7 @@ dependencies = [ [[package]] name = "psy_client_data" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "psy_common" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5330,7 +5330,7 @@ dependencies = [ [[package]] name = "psy_common_circuit" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5360,7 +5360,7 @@ dependencies = [ [[package]] name = "psy_compiler" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "bincode", @@ -5382,7 +5382,7 @@ dependencies = [ [[package]] name = "psy_config" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "indexmap 2.13.0", @@ -5396,7 +5396,7 @@ dependencies = [ [[package]] name = "psy_core" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5426,7 +5426,7 @@ dependencies = [ [[package]] name = "psy_crypto" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5456,7 +5456,7 @@ dependencies = [ [[package]] name = "psy_data" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5493,7 +5493,7 @@ dependencies = [ [[package]] name = "psy_dpn_circuit" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "alloy-primitives", "alloy-signer", @@ -5548,7 +5548,7 @@ dependencies = [ [[package]] name = "psy_dummy_prover" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5588,7 +5588,7 @@ dependencies = [ [[package]] name = "psy_io" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5602,7 +5602,7 @@ dependencies = [ [[package]] name = "psy_network_circuit" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "psy_plonky2_basic_helpers" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "psy_plonky2_circuits" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5691,7 +5691,7 @@ dependencies = [ [[package]] name = "psy_plonky2_common_circuits" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5722,7 +5722,7 @@ dependencies = [ [[package]] name = "psy_prover" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "alloy-primitives", "alloy-signer", @@ -5787,7 +5787,7 @@ dependencies = [ [[package]] name = "psy_provider" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "alloy-primitives", "alloy-signer", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "psy_serialize" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "bytemuck", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "psy_ups_circuit" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "alloy-primitives", "alloy-signer", @@ -5939,7 +5939,7 @@ dependencies = [ [[package]] name = "psy_vm" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", @@ -5966,7 +5966,7 @@ dependencies = [ [[package]] name = "psy_worker_core" version = "0.1.0" -source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=c42e117900676ba839ae4d4d9de362da9008d5cb#c42e117900676ba839ae4d4d9de362da9008d5cb" +source = "git+ssh://git@github.com/QEDProtocol/parth-generic-v1.git?rev=1de704feed5a4b74e6bc046bcbeff630fcac9789#1de704feed5a4b74e6bc046bcbeff630fcac9789" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 3fdbadcb1..50f036430 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,15 +21,15 @@ plonky2 = { git = "https://github.com/PsyProtocol/plonky2-hwa", rev = "1dfe6112c ] } plonky2_maybe_rayon = { git = "https://github.com/PsyProtocol/plonky2-hwa", rev = "1dfe6112c3eca3668c15820755371a8a3e75f934" } -psy_vm = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_vm", default-features = false } -psy_crypto = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_crypto" } -psy_data = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_client_data", default-features = false } -psy_common = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_client_common" } -psy_config = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_config" } -psy_prover = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_prover", default-features = false } -psy_provider = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_provider" } -psy_common_circuit = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_common_circuit", default-features = false } -psy_dpn_circuit = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "c42e117900676ba839ae4d4d9de362da9008d5cb", package = "psy_dpn_circuit", default-features = false } +psy_vm = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_vm", default-features = false } +psy_crypto = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_crypto" } +psy_data = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_client_data", default-features = false } +psy_common = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_client_common" } +psy_config = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_config" } +psy_prover = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_prover", default-features = false } +psy_provider = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_provider" } +psy_common_circuit = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_common_circuit", default-features = false } +psy_dpn_circuit = { git = "ssh://git@github.com/QEDProtocol/parth-generic-v1.git", rev = "1de704feed5a4b74e6bc046bcbeff630fcac9789", package = "psy_dpn_circuit", default-features = false } base64 = "0.22" bincode = { version = "=1.3.3" } diff --git a/Makefile b/Makefile index 0e8e44eb6..dfb9c4f4f 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +PSY_COMPILER_WASM_WORKSPACE ?= ../parth-generic-v1/client_prover/psy_ide +PSY_COMPILER_WASM_CRATE ?= psy_wasm + check: @cargo check --workspace --all-targets --tests --benches --examples --bins @cd psy-ts-sdk/packages/psy-sdk && pnpm install && pnpm type-check @@ -10,5 +13,5 @@ build: wasm-build: @cd psy-rust-sdk && wasm-pack build --target web --out-dir ../psy-ts-sdk/packages/psy-sdk/src/local-web-prover --out-name psy_prover --no-pack --release @cp .github/templates/.gitignore.wasm ./psy-ts-sdk/packages/psy-sdk/src/local-web-prover/.gitignore - @cd ../psy-compiler && wasm-pack build psy-wasm --target web --out-dir $(PWD)/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler --out-name psy_compiler --no-pack --release + @cd $(PSY_COMPILER_WASM_WORKSPACE) && wasm-pack build $(PSY_COMPILER_WASM_CRATE) --target web --out-dir $(PWD)/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler --out-name psy_compiler --no-pack --release @cp .github/templates/.gitignore.wasm ./psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/.gitignore diff --git a/psy-ts-sdk/packages/contract-sdk/src/index.ts b/psy-ts-sdk/packages/contract-sdk/src/index.ts index e0253a101..aaf6f37c0 100644 --- a/psy-ts-sdk/packages/contract-sdk/src/index.ts +++ b/psy-ts-sdk/packages/contract-sdk/src/index.ts @@ -4,8 +4,10 @@ export { AbiConverter } from "./converters/abi-converter"; // Export runtime module export { Contract } from "./runtime/contract"; +export { deployContractWithAbi } from "./runtime/deploy"; export { Signer } from "./runtime/types"; export type { Felt, ISigner, PsyFixedArray, ContractOptions } from "./runtime"; +export type { DeployContractWithAbiOptions, DeployContractWithAbiResult } from "./runtime/deploy"; // Only try to export generated files if they exist // This allows the package to build even before generation diff --git a/psy-ts-sdk/packages/contract-sdk/src/runtime/deploy.ts b/psy-ts-sdk/packages/contract-sdk/src/runtime/deploy.ts new file mode 100644 index 000000000..da024710d --- /dev/null +++ b/psy-ts-sdk/packages/contract-sdk/src/runtime/deploy.ts @@ -0,0 +1,44 @@ +import { + DPNFunctionCircuitDefinition, + IPsyUserProverProvider, + QBCDeployContract, + uploadPendingContractAbi, +} from "@psy/psy-sdk"; + +export interface DeployContractWithAbiOptions { + prover: IPsyUserProverProvider; + deployer: string; + circuitDefinitions: DPNFunctionCircuitDefinition[]; + servicesUrl: string; + abi: unknown; + metadata?: Record; +} + +export interface DeployContractWithAbiResult { + deployHash: string; + deployContract: QBCDeployContract; +} + +export async function deployContractWithAbi({ + prover, + deployer, + circuitDefinitions, + servicesUrl, + abi, + metadata, +}: DeployContractWithAbiOptions): Promise { + const deployContract = await prover.getDeployContractCmd(deployer, circuitDefinitions); + await uploadPendingContractAbi(servicesUrl, { + deployContract, + abi, + metadata, + deployer, + }); + const deployHash = prover.submitDeployContractCmd + ? await prover.submitDeployContractCmd(deployContract) + : await prover.deployContract(deployer, circuitDefinitions); + return { + deployHash, + deployContract, + }; +} diff --git a/psy-ts-sdk/packages/contract-sdk/src/runtime/index.ts b/psy-ts-sdk/packages/contract-sdk/src/runtime/index.ts index bb8ce1a41..44cef5c35 100644 --- a/psy-ts-sdk/packages/contract-sdk/src/runtime/index.ts +++ b/psy-ts-sdk/packages/contract-sdk/src/runtime/index.ts @@ -1,4 +1,6 @@ export { Contract, ContractOptions } from "./contract"; +export { deployContractWithAbi } from "./deploy"; +export type { DeployContractWithAbiOptions, DeployContractWithAbiResult } from "./deploy"; export { RecursiveDecoder } from "./decoder"; export { createMerkleHelper, calculateOffset, keccak256Felt } from "./merkle-helper"; export { diff --git a/psy-ts-sdk/packages/psy-sdk/src/index.ts b/psy-ts-sdk/packages/psy-sdk/src/index.ts index 360b82ea0..557d6ff07 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/index.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/index.ts @@ -26,3 +26,5 @@ export * from "./zksigner"; export * from "./rpc-provider"; export * from "./bridge"; + +export * from "./services"; diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-prover-rpc/types.ts b/psy-ts-sdk/packages/psy-sdk/src/local-prover-rpc/types.ts index 15ebdc212..22621cab1 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-prover-rpc/types.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-prover-rpc/types.ts @@ -155,6 +155,11 @@ interface IPsyUserProverProvider { // User operations registerUser(privateKey: PrivateKey, signType: SignType, fingerprint?: string): Promise; addUser(privateKey: PrivateKey, signType: SignType, fingerprint?: string): Promise; + registerSdkKeyCircuit?( + allowedContractIds: Array, + allowedMethodIds: Array, + expectedTxCount: number | bigint + ): Promise; // switchUser(pkHash: PublicKey): Promise; getZKPublicKey(privateKey: PrivateKey): Promise; getRandomKeypair(): Promise; @@ -162,6 +167,7 @@ interface IPsyUserProverProvider { // Contract deployment deployContract(deployer: string, circuitDefs: DPNFunctionCircuitDefinition[]): Promise; getDeployContractCmd(deployer: string, circuitDefs: DPNFunctionCircuitDefinition[]): Promise; + submitDeployContractCmd?(deployContract: QBCDeployContract): Promise; // Signing and submission // getSigHash(networkMagic: bigint): Promise; diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/build-wasm-binary.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/build-wasm-binary.ts index 3f85a88cd..01f168d0d 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/build-wasm-binary.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/build-wasm-binary.ts @@ -8,10 +8,10 @@ const __dirname = path.dirname(__filename); const wasmPath = path.join(__dirname, "./psy_compiler_bg.wasm"); -function runWasmPack(target: "web" | "nodejs", outDir: string, psyCompilerDir: string) { - const args = ["build", "psy-wasm", "--target", target, "--out-dir", outDir, "--out-name", "psy_compiler", "--no-pack", "--release"]; +function runWasmPack(target: "web" | "nodejs", outDir: string, psyCompilerWorkspace: string, cratePath: string) { + const args = ["build", cratePath, "--target", target, "--out-dir", outDir, "--out-name", "psy_compiler", "--no-pack", "--release"]; const result = spawnSync("wasm-pack", args, { - cwd: psyCompilerDir, + cwd: psyCompilerWorkspace, stdio: "inherit", env: process.env, }); @@ -24,18 +24,28 @@ function runWasmPack(target: "web" | "nodejs", outDir: string, psyCompilerDir: s function ensureWasmArtifacts() { console.log("Building compiler WASM artifacts via wasm-pack..."); - const envCompilerDir = process.env.PSY_COMPILER_DIR?.trim(); - const defaultParthCompilerDir = path.resolve( + const envCompilerDir = process.env.PSY_COMPILER_WASM_WORKSPACE?.trim() || process.env.PSY_COMPILER_DIR?.trim(); + const defaultParthCompilerWorkspace = path.resolve( __dirname, - "../../../../../../parth-generic-v1/client_prover/psy_compiler", + "../../../../../../parth-generic-v1/client_prover/psy_ide", ); const legacyCompilerDir = path.resolve(__dirname, "../../../../../../psy-compiler"); - const psyCompilerDir = envCompilerDir - ? path.resolve(envCompilerDir) - : (fs.existsSync(legacyCompilerDir) ? legacyCompilerDir : defaultParthCompilerDir); + const candidates = [ + envCompilerDir ? path.resolve(envCompilerDir) : null, + defaultParthCompilerWorkspace, + legacyCompilerDir, + ].filter((candidate): candidate is string => Boolean(candidate)); + const compiler = candidates.flatMap((workspace) => [ + { workspace, cratePath: "psy_wasm", cargoToml: path.join(workspace, "psy_wasm", "Cargo.toml") }, + { workspace, cratePath: "psy-wasm", cargoToml: path.join(workspace, "psy-wasm", "Cargo.toml") }, + { workspace, cratePath: ".", cargoToml: path.join(workspace, "Cargo.toml") }, + ]).find((candidate) => fs.existsSync(candidate.cargoToml)); + if (!compiler) { + throw new Error(`Could not find compiler WASM crate. Checked: ${candidates.join(", ")}`); + } const webOutDir = path.resolve(__dirname); - runWasmPack("web", webOutDir, psyCompilerDir); + runWasmPack("web", webOutDir, compiler.workspace, compiler.cratePath); const gitignoreTemplate = path.resolve(__dirname, "../../../../../.github/templates/.gitignore.wasm"); if (fs.existsSync(gitignoreTemplate)) { diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/compiler.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/compiler.ts index 6c28a7df0..456c7dcce 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/compiler.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/compiler.ts @@ -1,4 +1,4 @@ -import { initSync, compile_source, compile_project, interpret_source, interpret_project } from "./psy_compiler"; +import { initSync, compile_source, compile_project } from "./psy_compiler"; import { wasmBinary } from "./wasm-binary"; import type { DPNFunctionCircuitDefinition } from "../local-prover-rpc/types"; import { PsyJSON } from "../utils"; @@ -106,11 +106,19 @@ export function compileProject(input: PsyProjectInput): PsyCompileResult { } export function interpretSource(source: string, request: PsyInterpretRequest): PsyInterpretResult { - ensureInit(); - return PsyJSON.parse(interpret_source(source, PsyJSON.stringify(request))); + void source; + void request; + return { + success: false, + error: "interpretSource is not exposed by the bundled compiler WASM", + }; } export function interpretProject(input: PsyProjectInput, request: PsyInterpretRequest): PsyInterpretResult { - ensureInit(); - return PsyJSON.parse(interpret_project(PsyJSON.stringify(input), PsyJSON.stringify(request))); + void input; + void request; + return { + success: false, + error: "interpretProject is not exposed by the bundled compiler WASM", + }; } diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler.d.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler.d.ts index 03bfc2a92..46ce44144 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler.d.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler.d.ts @@ -1,32 +1,110 @@ /* tslint:disable */ /* eslint-disable */ -export function get_accounts(): string; -export function compile_project(files_json: string): string; -export function read_imt_state(contract_id: number, user_id: number): string; -export function compile_dargo_project(project_json: string): string; -export function init_psy_ide(): void; + +/** + * Call a contract method. Returns JSON with execution result. + */ export function call_contract(caller_id: bigint, contract_id: bigint, method_name: string, args_json: string): string; -export function reset_chain(): void; -export function get_transaction_log(): string; -export function interpret_project(files_json: string, request_json: string): string; -export function read_contract_state(contract_id: bigint, user_id: bigint): string; -export function init_chain(): void; -export function interpret_source(source: string, request_json: string): string; -export function main(): void; + +/** + * Compile a multi-file PSY project. `files_json` accepts either a JSON array + * of `[module_path_parts[], source_text]` pairs or `{ "files": [...] }`. + */ +export function compile_project(files_json: string): string; + +/** + * Compile a multi-file PSY project as an SDK key. Returns JSON. + * + * `files_json` accepts either a JSON array of `[module_path_parts[], + * source_text]` pairs or `{ "files": [...] }`. + * The result includes both DPN bytecode (JSON) and Dapen bytecode (hex CBOR). + */ +export function compile_sdk_key_project(files_json: string): string; + +/** + * Compile a single-file PSY source as an SDK key. Returns JSON. + * + * The result includes both DPN bytecode (JSON) and Dapen bytecode (hex CBOR). + */ +export function compile_sdk_key_source(source: string): string; + +/** + * Compile a single-file PSY source. Returns JSON string. + */ +export function compile_source(source: string): string; + +/** + * Create a user account. Returns JSON. + */ export function create_account(name: string): string; + +/** + * Deploy the last compiled contract. Returns JSON. + */ export function deploy_contract(deployer_id: bigint): string; + +/** + * Get all accounts. Returns JSON array. + */ +export function get_accounts(): string; + +/** + * Get the ABI for a deployed contract. Returns JSON. + */ export function get_contract_abi(contract_id: bigint): string; -export function compile_source(source: string): string; -export function init_logging(): void; + +/** + * Get all deployed contracts. Returns JSON array. + */ export function get_contracts(): string; +/** + * Get the full transaction log. Returns JSON array. + */ +export function get_transaction_log(): string; + +/** + * Initialize the in-memory chain. + */ +export function init_chain(): void; + +export function init_psy_ide(): void; + +/** + * Compile and execute a multi-file PSY project. `files_json` is a JSON array + * of `[module_path_parts[], source_text]` pairs. + */ +export function interpret_project(files_json: string, request_json: string): string; + +/** + * Compile and execute a single-file PSY source. Returns JSON string. + */ +export function interpret_source(source: string, request_json: string): string; + +/** + * Read contract state for a specific user. Returns JSON array of slot values. + */ +export function read_contract_state(contract_id: bigint, user_id: bigint): string; + +/** + * Read IMT (Indexed Merkle Tree) key-value entries for a specific + * user/contract. Returns JSON array of `{key: [u64;4], value: [u64;4]}` + * objects. + */ +export function read_imt_state(contract_id: number, user_id: number): string; + +/** + * Reset the chain (clear all state). + */ +export function reset_chain(): void; + export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { - readonly memory: WebAssembly.Memory; readonly call_contract: (a: bigint, b: bigint, c: number, d: number, e: number, f: number) => [number, number]; - readonly compile_dargo_project: (a: number, b: number) => [number, number]; readonly compile_project: (a: number, b: number) => [number, number]; + readonly compile_sdk_key_project: (a: number, b: number) => [number, number]; + readonly compile_sdk_key_source: (a: number, b: number) => [number, number]; readonly compile_source: (a: number, b: number) => [number, number]; readonly create_account: (a: number, b: number) => [number, number]; readonly deploy_contract: (a: bigint) => [number, number]; @@ -38,37 +116,38 @@ export interface InitOutput { readonly interpret_source: (a: number, b: number, c: number, d: number) => [number, number]; readonly read_contract_state: (a: bigint, b: bigint) => [number, number]; readonly read_imt_state: (a: number, b: number) => [number, number]; - readonly init_logging: () => void; - readonly init_psy_ide: () => void; - readonly main: () => void; readonly init_chain: () => void; readonly reset_chain: () => void; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; - readonly __wbindgen_exn_store: (a: number) => void; - readonly __externref_table_alloc: () => number; - readonly __wbindgen_externrefs: WebAssembly.Table; + readonly init_psy_ide: () => void; + readonly memory: WebAssembly.Memory; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; - readonly __wbindgen_start: () => void; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_externrefs: WebAssembly.Table; + readonly __wbindgen_thread_destroy: (a?: number, b?: number, c?: number) => void; + readonly __wbindgen_start: (a: number) => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; + /** * Instantiates the given `module`, which can either be bytes or * a precompiled `WebAssembly.Module`. * -* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* @param {{ module: SyncInitInput, memory?: WebAssembly.Memory, thread_stack_size?: number }} module - Passing `SyncInitInput` directly is deprecated. +* @param {WebAssembly.Memory} memory - Deprecated. * * @returns {InitOutput} */ -export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; +export function initSync(module: { module: SyncInitInput, memory?: WebAssembly.Memory, thread_stack_size?: number } | SyncInitInput, memory?: WebAssembly.Memory): InitOutput; /** * If `module_or_path` is {RequestInfo} or {URL}, makes a request and * for everything else, calls `WebAssembly.instantiate` directly. * -* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* @param {{ module_or_path: InitInput | Promise, memory?: WebAssembly.Memory, thread_stack_size?: number }} module_or_path - Passing `InitInput` directly is deprecated. +* @param {WebAssembly.Memory} memory - Deprecated. * * @returns {Promise} */ -export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise, memory?: WebAssembly.Memory, thread_stack_size?: number } | InitInput | Promise, memory?: WebAssembly.Memory): Promise; diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler_bg.wasm.d.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler_bg.wasm.d.ts index c3333d97e..2a941763e 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler_bg.wasm.d.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-compiler/psy_compiler_bg.wasm.d.ts @@ -1,9 +1,9 @@ /* tslint:disable */ /* eslint-disable */ -export const memory: WebAssembly.Memory; export const call_contract: (a: bigint, b: bigint, c: number, d: number, e: number, f: number) => [number, number]; -export const compile_dargo_project: (a: number, b: number) => [number, number]; export const compile_project: (a: number, b: number) => [number, number]; +export const compile_sdk_key_project: (a: number, b: number) => [number, number]; +export const compile_sdk_key_source: (a: number, b: number) => [number, number]; export const compile_source: (a: number, b: number) => [number, number]; export const create_account: (a: number, b: number) => [number, number]; export const deploy_contract: (a: bigint) => [number, number]; @@ -15,15 +15,13 @@ export const interpret_project: (a: number, b: number, c: number, d: number) => export const interpret_source: (a: number, b: number, c: number, d: number) => [number, number]; export const read_contract_state: (a: bigint, b: bigint) => [number, number]; export const read_imt_state: (a: number, b: number) => [number, number]; -export const init_logging: () => void; -export const init_psy_ide: () => void; -export const main: () => void; export const init_chain: () => void; export const reset_chain: () => void; -export const __wbindgen_free: (a: number, b: number, c: number) => void; -export const __wbindgen_exn_store: (a: number) => void; -export const __externref_table_alloc: () => number; -export const __wbindgen_externrefs: WebAssembly.Table; +export const init_psy_ide: () => void; +export const memory: WebAssembly.Memory; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; -export const __wbindgen_start: () => void; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_externrefs: WebAssembly.Table; +export const __wbindgen_thread_destroy: (a?: number, b?: number, c?: number) => void; +export const __wbindgen_start: (a: number) => void; diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/provider.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/provider.ts index bb1315284..07da7eb3d 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/provider.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/provider.ts @@ -14,6 +14,7 @@ import { import { ZKPublicKeyInfo } from "../types"; import { PsyJSON } from "../utils"; import { PsyNetworkConfig } from "../config"; +import { CoordinatorEdgeRpcProvider } from "../coord-edge-rpc"; // Synchronous WASM initialization function export function initWasmSync(): void { @@ -30,10 +31,19 @@ export function initWasmSync(): void { export class PsyWasmWebProverProvider implements IPsyUserProverProvider { static wasmServer: WasmRpcServer; + private static wasmCallQueue: Promise = Promise.resolve(); + private readonly coordinatorRpc: CoordinatorEdgeRpcProvider; constructor(rpcConfigJson: PsyNetworkConfig) { const json = PsyJSON.stringify(rpcConfigJson); console.log(`WASM init with config: ${json}`); + const coordinatorUrls = (rpcConfigJson.coordinator_configs ?? []) + .flatMap((coordinator) => coordinator.rpc_url ?? []) + .filter((url): url is string => typeof url === "string" && url.length > 0); + if (coordinatorUrls.length === 0) { + throw new Error("Coordinator RPC URL is not configured"); + } + this.coordinatorRpc = new CoordinatorEdgeRpcProvider(coordinatorUrls); if (!PsyWasmWebProverProvider.wasmServer) { const now = new Date().getTime(); initWasmSync(); @@ -42,6 +52,15 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { } } + private static runWasmCall(call: () => T | Promise): Promise { + const run = PsyWasmWebProverProvider.wasmCallQueue.then(call, call); + PsyWasmWebProverProvider.wasmCallQueue = run.then( + () => undefined, + () => undefined + ); + return run; + } + // async execContractCall(pkHash: string, contractCallArg: ContractCallArgs[]): Promise { // const now = new Date().getTime(); // const json = PsyJSON.stringify(contractCallArg); @@ -53,7 +72,9 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { async execContractCall(pkHash: string, callData: ContractCallData): Promise { const now = new Date().getTime(); const json = PsyJSON.stringify(callData); - const result = await PsyWasmWebProverProvider.wasmServer.exec_contract_call_json(pkHash, json); + const result = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.exec_contract_call_json(pkHash, json) + ); console.log(`execContractCall in ${(new Date().getTime() - now) / 1000} seconds`); return result; } @@ -80,13 +101,17 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { // Local proving operations async startSession(pkHash: PublicKey): Promise { - return PsyWasmWebProverProvider.wasmServer.start_session(pkHash); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.start_session(pkHash) + ); } async proveContractCall(pkHash: PublicKey, contractCallArg: ContractCallArgs): Promise { const now = new Date().getTime(); const json = PsyJSON.stringify(contractCallArg); - const result = await PsyWasmWebProverProvider.wasmServer.prove_contract_call_json(pkHash, json); + const result = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.prove_contract_call_json(pkHash, json) + ); console.log(`proveContractCall in ${(new Date().getTime() - now) / 1000} seconds`); return result; } @@ -94,7 +119,9 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { async proveContractCalls(pkHash: PublicKey, contractCallArgs: ContractCallArgs[]): Promise { const now = new Date().getTime(); const json = PsyJSON.stringify(contractCallArgs); - const result = await PsyWasmWebProverProvider.wasmServer.prove_contract_calls_json(pkHash, json); + const result = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.prove_contract_calls_json(pkHash, json) + ); console.log(`proveContractCalls in ${(new Date().getTime() - now) / 1000} seconds`); return result; } @@ -102,7 +129,9 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { async signAndSubmit(pkHash: PublicKey, signData?: SignData): Promise { const now = new Date().getTime(); const signDataJson = signData ? PsyJSON.stringify(signData) : null; - const result = await PsyWasmWebProverProvider.wasmServer.sign_and_submit(pkHash, signDataJson); + const result = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.sign_and_submit(pkHash, signDataJson) + ); console.log(`signAndSubmit in ${(new Date().getTime() - now) / 1000} seconds`); return result; } @@ -110,27 +139,53 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { // User operations async registerUser(privateKey: PrivateKey, signType: SignType, fingerprint?: string): Promise { - return PsyWasmWebProverProvider.wasmServer.register_user(privateKey.toString(), signType, fingerprint); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.register_user(privateKey.toString(), signType, fingerprint) + ); } async addUser(privateKey: PrivateKey, signType: SignType, fingerprint?: string): Promise { - return PsyWasmWebProverProvider.wasmServer.add_user(privateKey.toString(), signType, fingerprint); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.add_user(privateKey.toString(), signType, fingerprint) + ); + } + + async registerSdkKeyCircuit( + allowedContractIds: Array, + allowedMethodIds: Array, + expectedTxCount: number | bigint + ): Promise { + const contractIds = BigUint64Array.from(allowedContractIds.map((id) => BigInt(id))); + const methodIds = BigUint64Array.from(allowedMethodIds.map((id) => BigInt(id))); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.register_sdk_key_circuit( + contractIds, + methodIds, + BigInt(expectedTxCount), + ) + ); } async getZKPublicKey(privateKey: PrivateKey): Promise { - const json = await PsyWasmWebProverProvider.wasmServer.get_zk_public_key_json(privateKey.toString()); + const json = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.get_zk_public_key_json(privateKey.toString()) + ); return PsyJSON.parse(json); } async getRandomKeypair(): Promise { - const json = await PsyWasmWebProverProvider.wasmServer.get_random_keypair_json(); + const json = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.get_random_keypair_json() + ); return PsyJSON.parse(json); } // Contract deployment async deployContract(deployer: PublicKey, circuitDefs: DPNFunctionCircuitDefinition[]): Promise { const json = PsyJSON.stringify(circuitDefs); - return PsyWasmWebProverProvider.wasmServer.deploy_contract_json(deployer, json); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.deploy_contract_json(deployer, json) + ); } async getDeployContractCmd( @@ -138,17 +193,27 @@ export class PsyWasmWebProverProvider implements IPsyUserProverProvider { circuitDefs: DPNFunctionCircuitDefinition[] ): Promise { const json = PsyJSON.stringify(circuitDefs); - const resultJson = await PsyWasmWebProverProvider.wasmServer.get_deploy_contract_cmd_json(deployer, json); + const resultJson = await PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.get_deploy_contract_cmd_json(deployer, json) + ); return PsyJSON.parse(resultJson); } + async submitDeployContractCmd(deployContract: QBCDeployContract): Promise { + return this.coordinatorRpc.deployContract(deployContract); + } + // Utility methods async ping(message: string): Promise { - return PsyWasmWebProverProvider.wasmServer.ping(message); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.ping(message) + ); } async getResult(id: QHashOut): Promise { - return PsyWasmWebProverProvider.wasmServer.get_result(id.toString()); + return PsyWasmWebProverProvider.runWasmCall(() => + PsyWasmWebProverProvider.wasmServer.get_result(id.toString()) + ); } } diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover.d.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover.d.ts index fe8cc117b..bad5951a7 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover.d.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover.d.ts @@ -208,11 +208,11 @@ export interface InitOutput { readonly wasmrpcserver_start_session: (a: number, b: number, c: number) => any; readonly wasmpsyconfigbuilder_new: () => number; readonly wasmconstants_register_user_fee: () => bigint; - readonly wasm_bindgen__closure__destroy__h2c4258c8d2b8cc65: (a: number, b: number) => void; - readonly wasm_bindgen__closure__destroy__h1cdc65468db77e02: (a: number, b: number) => void; - readonly wasm_bindgen__convert__closures_____invoke__h79f41d0599a7a266: (a: number, b: number, c: any, d: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__hf62534bd39865c13: (a: number, b: number, c: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__h9f5ddc1b79728a99: (a: number, b: number) => void; + readonly wasm_bindgen__closure__destroy__h8f7fd3b973d18c84: (a: number, b: number) => void; + readonly wasm_bindgen__closure__destroy__h92fed71a97f49e1d: (a: number, b: number) => void; + readonly wasm_bindgen__convert__closures_____invoke__h5f6267499c70df5f: (a: number, b: number, c: any, d: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__hf584e72c52736b17: (a: number, b: number, c: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__h711774e7384d6096: (a: number, b: number) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __wbindgen_exn_store: (a: number) => void; diff --git a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover_bg.wasm.d.ts b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover_bg.wasm.d.ts index 54e56662d..f747c87fc 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover_bg.wasm.d.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/local-web-prover/psy_prover_bg.wasm.d.ts @@ -53,11 +53,11 @@ export const wasmrpcserver_sign_and_submit: (a: number, b: number, c: number, d: export const wasmrpcserver_start_session: (a: number, b: number, c: number) => any; export const wasmpsyconfigbuilder_new: () => number; export const wasmconstants_register_user_fee: () => bigint; -export const wasm_bindgen__closure__destroy__h2c4258c8d2b8cc65: (a: number, b: number) => void; -export const wasm_bindgen__closure__destroy__h1cdc65468db77e02: (a: number, b: number) => void; -export const wasm_bindgen__convert__closures_____invoke__h79f41d0599a7a266: (a: number, b: number, c: any, d: any) => void; -export const wasm_bindgen__convert__closures_____invoke__hf62534bd39865c13: (a: number, b: number, c: any) => void; -export const wasm_bindgen__convert__closures_____invoke__h9f5ddc1b79728a99: (a: number, b: number) => void; +export const wasm_bindgen__closure__destroy__h8f7fd3b973d18c84: (a: number, b: number) => void; +export const wasm_bindgen__closure__destroy__h92fed71a97f49e1d: (a: number, b: number) => void; +export const wasm_bindgen__convert__closures_____invoke__h5f6267499c70df5f: (a: number, b: number, c: any, d: any) => void; +export const wasm_bindgen__convert__closures_____invoke__hf584e72c52736b17: (a: number, b: number, c: any) => void; +export const wasm_bindgen__convert__closures_____invoke__h711774e7384d6096: (a: number, b: number) => void; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; export const __wbindgen_exn_store: (a: number) => void; diff --git a/psy-ts-sdk/packages/psy-sdk/src/services/contractAbi.ts b/psy-ts-sdk/packages/psy-sdk/src/services/contractAbi.ts new file mode 100644 index 000000000..294ee465d --- /dev/null +++ b/psy-ts-sdk/packages/psy-sdk/src/services/contractAbi.ts @@ -0,0 +1,61 @@ +import { FetchHTTPClient, IHTTPClient } from "../http"; +import type { QBCDeployContract } from "../types"; +import { PsyJSON } from "../utils"; + +export interface PendingContractAbiUploadInput { + contentHash?: string; + content_hash?: string; + deployContract?: QBCDeployContract; + deploy_contract?: QBCDeployContract; + abi: unknown; + metadata?: Record; + deployer?: string; +} + +export interface PendingContractAbiUploadResult { + content_hash: string; + status: string; +} + +interface ApiEnvelope { + success?: boolean; + data?: T; + error?: string; +} + +export async function uploadPendingContractAbi( + servicesUrl: string, + input: PendingContractAbiUploadInput, + httpClient: IHTTPClient = new FetchHTTPClient() +): Promise { + const contentHash = input.contentHash ?? input.content_hash; + const deployContract = input.deployContract ?? input.deploy_contract; + if (!contentHash && !deployContract) { + throw new Error("uploadPendingContractAbi requires contentHash or deployContract"); + } + + const response = await httpClient.sendRequest({ + url: `${servicesUrl.replace(/\/$/, "")}/api/v1/contract/abi/pending`, + method: "POST", + headers: { "content-type": "application/json" }, + responseType: "json", + body: PsyJSON.stringify({ + content_hash: contentHash, + deploy_contract: deployContract, + abi: input.abi, + metadata: input.metadata, + deployer: input.deployer, + }), + }); + + const envelope = response.body as ApiEnvelope; + if (response.statusCode < 200 || response.statusCode >= 300 || envelope?.success === false) { + throw new Error( + `failed to upload pending contract ABI: HTTP ${response.statusCode} ${envelope?.error ?? PsyJSON.stringify(response.body)}` + ); + } + if (!envelope?.data) { + throw new Error("pending contract ABI upload response missing data"); + } + return envelope.data; +} diff --git a/psy-ts-sdk/packages/psy-sdk/src/services/index.ts b/psy-ts-sdk/packages/psy-sdk/src/services/index.ts new file mode 100644 index 000000000..b20c56893 --- /dev/null +++ b/psy-ts-sdk/packages/psy-sdk/src/services/index.ts @@ -0,0 +1 @@ +export * from "./contractAbi"; diff --git a/psy-ts-sdk/packages/psy-sdk/src/zksigner/memory/signer.ts b/psy-ts-sdk/packages/psy-sdk/src/zksigner/memory/signer.ts index 8208d3539..8e2f43c7c 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/zksigner/memory/signer.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/zksigner/memory/signer.ts @@ -1,5 +1,7 @@ import { getPsyNetworkMagicForNetworkId, NetworkId } from "../../action"; import { ContractCallArgs, ContractCallData, DPNFunctionCircuitDefinition, IPsyUserProverProvider, SignType } from "../../local-prover-rpc"; +import { uploadPendingContractAbi } from "../../services"; +import { QBCDeployContract } from "../../types"; import { IPsyTransactionSigner, TPsyTransactionSignerAbility } from "../types"; class PsyMemoryTransactionSigner implements IPsyTransactionSigner { @@ -50,6 +52,30 @@ class PsyMemoryTransactionSigner implements IPsyTransactionSigner { return this.prover.deployContract(pk_hash, circuitDefs); } + async getDeployContractCmd(pk_hash: string, circuitDefs: DPNFunctionCircuitDefinition[]): Promise { + return this.prover.getDeployContractCmd(pk_hash, circuitDefs); + } + + async deployContractWithAbi( + pk_hash: string, + circuitDefs: DPNFunctionCircuitDefinition[], + servicesUrl: string, + abi: unknown, + metadata?: Record + ): Promise { + const deployContract = await this.getDeployContractCmd(pk_hash, circuitDefs); + await uploadPendingContractAbi(servicesUrl, { + deployContract, + abi, + metadata, + deployer: pk_hash, + }); + if (this.prover.submitDeployContractCmd) { + return this.prover.submitDeployContractCmd(deployContract); + } + return this.deployContract(pk_hash, circuitDefs); + } + getAbilities(): TPsyTransactionSignerAbility[] { return ["sign-hash", "export-private-key-hex"]; } diff --git a/psy-ts-sdk/packages/psy-sdk/src/zksigner/types.ts b/psy-ts-sdk/packages/psy-sdk/src/zksigner/types.ts index b680b8166..ba761dea1 100644 --- a/psy-ts-sdk/packages/psy-sdk/src/zksigner/types.ts +++ b/psy-ts-sdk/packages/psy-sdk/src/zksigner/types.ts @@ -1,5 +1,5 @@ import { ContractCallData, DPNFunctionCircuitDefinition, SignType } from "../local-prover-rpc/types"; -import { ContractCallArgs } from "../types"; +import { ContractCallArgs, QBCDeployContract } from "../types"; type TPsyTransactionSignerAbility = "sign-hash" | "export-private-key-hex"; type TPsyTransactionSignerProviderAbility = "import-private-key" | "add-random-private-key"; @@ -11,6 +11,14 @@ interface IPsyTransactionSigner { // signHash?(hash: QHashOut): Promise; signAndSubmit(pk_hash: string, callData: ContractCallData): Promise; deployContract(pk_hash: string, circuitDefs: DPNFunctionCircuitDefinition[]): Promise; + getDeployContractCmd(pk_hash: string, circuitDefs: DPNFunctionCircuitDefinition[]): Promise; + deployContractWithAbi( + pk_hash: string, + circuitDefs: DPNFunctionCircuitDefinition[], + servicesUrl: string, + abi: unknown, + metadata?: Record + ): Promise; getAbilities(): TPsyTransactionSignerAbility[]; registerUser(privateKeyHex: string, signType: SignType, fingerprint?: string): Promise; addUser(privateKeyHex: string, signType: SignType, fingerprint?: string): Promise;