From 42969975eb108264c30e041aa2601586d4d5ae94 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 13 Dec 2022 16:39:42 +0100 Subject: [PATCH 01/37] refacto: better error log in the vm --- deku-p/src/core/protocol/protocol.ml | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/deku-p/src/core/protocol/protocol.ml b/deku-p/src/core/protocol/protocol.ml index 83c8c4178..3008487c8 100644 --- a/deku-p/src/core/protocol/protocol.ml +++ b/deku-p/src/core/protocol/protocol.ml @@ -99,17 +99,20 @@ let apply_operation ~current_level protocol operation : (Address.to_b58 address))) in let result () = - let%some ledger = - if operation.tickets = [] then Some ledger + let%ok ledger = + if operation.tickets = [] then Ok ledger else Ledger.with_ticket_table ledger (fun ~get_table ~set_table -> let tickets = operation.tickets in - let%some _, table = + let result = Ticket_table.take_tickets ~sender ~ticket_ids:tickets (get_table ()) - |> Result.to_option in - Some (set_table table)) + match result with + | Ok (_, table) -> Ok (set_table table) + | Error err -> ( + match err with + | `Insufficient_funds -> Error "Insufficient_funds")) in let source = sender in match @@ -125,17 +128,20 @@ let apply_operation ~current_level protocol operation : |> Env.finalize) with | Ok (vm_state, ledger) -> - Some (ledger, Some receipt, vm_state, None) - | Error _ -> None + Ok (ledger, Some receipt, vm_state, None) + | Error err -> Error err in match result () with - | Some result -> result - | None -> + | Ok result -> result + | Error err -> ( ledger, Some receipt, vm_state, - Some (Failure "Error while executing external vm transaction") - )) + Some + (Failure + (Format.sprintf + "Error while executing external vm transaction : %s" + err)) )) | Operation_noop { sender = _ } -> (ledger, None, vm_state, None) | Operation_withdraw { sender; owner; amount; ticket_id } -> ( match From 9aecf842dd6e6a8305120658bd1b5368326b0605 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Fri, 16 Dec 2022 09:46:44 -0500 Subject: [PATCH 02/37] refactor: print source location on wasm errors --- deku-c/wasm-vm-ocaml/env.ml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/deku-c/wasm-vm-ocaml/env.ml b/deku-c/wasm-vm-ocaml/env.ml index 0fd39daa4..cb563d84f 100644 --- a/deku-c/wasm-vm-ocaml/env.ml +++ b/deku-c/wasm-vm-ocaml/env.ml @@ -49,9 +49,14 @@ let rec execute t ~operation_hash ~tickets ~operation = | Imports.Type_error -> Error "type_error" | Ticket_table.Table error -> Error (Ticket_table.show_error error) - | ( Wasm.Eval.Crash _ | Wasm.Eval.Exhaustion _ | Wasm.Eval.Link _ - | Wasm.Eval.Trap _ ) as exn -> - Error (Printexc.to_string exn) + | Wasm.Eval.Crash (source_region, message) + | Wasm.Eval.Exhaustion (source_region, message) + | Wasm.Eval.Link (source_region, message) + | Wasm.Eval.Trap (source_region, message) -> + Error + (Format.sprintf "%s: %s" + (Wasm.Source.string_of_region source_region) + message) | e -> raise e); effc = (fun (type a) (eff : a t) -> From 679d6bb37f228496156ae38c339c20445cae9c48 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Fri, 16 Dec 2022 11:08:01 -0500 Subject: [PATCH 03/37] fix: only use ligo on x86_64-linux --- nix/deku-p/default.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nix/deku-p/default.nix b/nix/deku-p/default.nix index d273db191..2d8f3cf15 100644 --- a/nix/deku-p/default.nix +++ b/nix/deku-p/default.nix @@ -39,7 +39,11 @@ static = true; }; - ligo = inputs.ligo.packages.${system}.ligoLight; + ligo = + # TODO: support ligo on more systems in our flake + if system == "x86_64-linux" + then inputs.ligo.packages.${system}.ligoLight + else pkgs.hello; docker = pkgs.callPackage ./docker.nix {inherit deku ligo;}; in { From ba60ca21b7a2e13b8f3eb798712c200fd569b36e Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Thu, 15 Dec 2022 22:51:40 -0300 Subject: [PATCH 04/37] fix: make networking synchronous - this will prevent send_blocks flooding --- deku-p/src/core/bin/node/node.ml | 24 ++++++++++++++-------- deku-p/src/core/network/network_manager.ml | 15 ++++++-------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/deku-p/src/core/bin/node/node.ml b/deku-p/src/core/bin/node/node.ml index 30b937985..031d12a98 100644 --- a/deku-p/src/core/bin/node/node.ml +++ b/deku-p/src/core/bin/node/node.ml @@ -29,12 +29,14 @@ let write_chain ~chain node = node.dump chain; node.chain <- chain -let send_blocks ~sw ~connection ~above node = +let send_blocks ~connection ~above node = match node.indexer with | Some indexer -> - Eio.Fiber.fork ~sw @@ fun () -> let rec send_while level = let level = Level.next level in + Logs.info (fun m -> + m "Sending block %a at time %.3f" Level.pp level + (Unix.gettimeofday ())); match Block_storage.find_block_and_votes_by_level ~level indexer with | Some network -> let (Network_message { raw_header; raw_content }) = network in @@ -47,7 +49,16 @@ let send_blocks ~sw ~connection ~above node = | None -> () let rec handle_chain_actions ~sw ~env ~actions node = - List.iter (fun action -> handle_chain_action ~sw ~env ~action node) actions + List.iter + (fun action -> + let on_error exn = + Logs.err (fun m -> + m "chain/action: action %a, exception %s" Chain.pp_action action + (Printexc.to_string exn)) + in + Eio.Fiber.fork_sub ~sw ~on_error @@ fun sw -> + handle_chain_action ~sw ~env ~action node) + actions and handle_chain_action ~sw ~env ~action node = let open Chain in @@ -61,18 +72,13 @@ and handle_chain_action ~sw ~env ~action node = Network_manager.request ~raw_header ~raw_content node.network | Chain_fragment { fragment } -> handle_chain_fragment ~sw ~env ~fragment node | Chain_save_block { block; network } -> ( - let on_error exn = - Logs.err (fun m -> - m "database/sqlite: exception %s" (Printexc.to_string exn)) - in match node.indexer with | Some indexer -> - Eio.Fiber.fork_sub ~sw ~on_error @@ fun _sw -> let (Block { level; _ }) = block in Block_storage.save_block_and_votes ~level ~network indexer | None -> ()) | Chain_send_blocks { connection; above } -> - send_blocks ~sw ~connection ~above node + Eio.Fiber.fork ~sw @@ fun () -> send_blocks ~connection ~above node | Chain_commit { current_level; diff --git a/deku-p/src/core/network/network_manager.ml b/deku-p/src/core/network/network_manager.ml index f04a9a39f..e721d4aa2 100644 --- a/deku-p/src/core/network/network_manager.ml +++ b/deku-p/src/core/network/network_manager.ml @@ -38,10 +38,8 @@ let close_connection ~connection_id network = let with_connection ~on_connection ~on_request ~on_message network k = let connection_id = create_connection network in - let handler ~sw connection = - let write message = - Eio.Fiber.fork ~sw @@ fun () -> Connection.write connection message - in + let handler connection = + let write message = Connection.write connection message in let on_message message = match message with | Network_message.Message { raw_header; raw_content } -> @@ -62,7 +60,7 @@ let with_connection ~on_connection ~on_request ~on_message network k = let handler connection = Fun.protect ~finally:(fun () -> close_connection ~connection_id network) - (fun () -> Eio.Switch.run @@ fun sw -> handler ~sw connection) + (fun () -> handler connection) in k handler @@ -112,15 +110,14 @@ let connect ~net ~clock ~nodes ~on_connection ~on_request ~on_message network = nodes let send ~message ~write = - (* write always includes a fork *) try write message with exn -> Logs.warn (fun m -> m "write.error: %s" (Printexc.to_string exn)) let broadcast message network = - Key_hash.Map.iter - (fun _connection write -> send ~message ~write) - network.connected_to + Eio.Fiber.List.iter + (fun (_connection, write) -> send ~message ~write) + (Key_hash.Map.bindings network.connected_to) let request ~raw_header ~raw_content network = let request = Network_message.request ~raw_header ~raw_content in From de254288bd3a71af5ee6a29b66b5db22154838f8 Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Fri, 16 Dec 2022 10:44:37 -0300 Subject: [PATCH 05/37] rejoin: apply all blocks accepted during reload --- deku-p/src/core/bin/node/node.ml | 43 ++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/deku-p/src/core/bin/node/node.ml b/deku-p/src/core/bin/node/node.ml index 031d12a98..e496c42ae 100644 --- a/deku-p/src/core/bin/node/node.ml +++ b/deku-p/src/core/bin/node/node.ml @@ -48,19 +48,17 @@ let send_blocks ~connection ~above node = send_while above | None -> () -let rec handle_chain_actions ~sw ~env ~actions node = - List.iter +let rec apply_chain_actions ~sw ~env ~actions node = + Eio.Fiber.List.iter (fun action -> - let on_error exn = + try apply_chain_action ~sw ~env ~action node + with exn -> Logs.err (fun m -> m "chain/action: action %a, exception %s" Chain.pp_action action - (Printexc.to_string exn)) - in - Eio.Fiber.fork_sub ~sw ~on_error @@ fun sw -> - handle_chain_action ~sw ~env ~action node) + (Printexc.to_string exn))) actions -and handle_chain_action ~sw ~env ~action node = +and apply_chain_action ~sw ~env ~action node = let open Chain in match action with | Chain_timeout { until } -> start_timeout ~sw ~env ~until node @@ -70,7 +68,7 @@ and handle_chain_action ~sw ~env ~action node = Network_manager.send ~connection ~raw_header ~raw_content node.network | Chain_send_request { raw_header; raw_content } -> Network_manager.request ~raw_header ~raw_content node.network - | Chain_fragment { fragment } -> handle_chain_fragment ~sw ~env ~fragment node + | Chain_fragment { fragment } -> apply_chain_fragment ~sw ~env ~fragment node | Chain_save_block { block; network } -> ( match node.indexer with | Some indexer -> @@ -98,8 +96,7 @@ and handle_chain_action ~sw ~env ~action node = (* FIXME: this is probably an indication of bad abstraction but being lazy right now *) (* failwith "Node was not initialized with Tezos interop enabled.") *) -and handle_chain_fragment ~sw ~env ~fragment node = - Eio.Fiber.fork ~sw @@ fun () -> +and apply_chain_fragment ~sw ~env ~fragment node = let identity = node.identity in let default_block_size = node.default_block_size in let outcome = @@ -111,10 +108,9 @@ and handle_chain_fragment ~sw ~env ~fragment node = and on_chain_outcome ~sw ~env ~current ~outcome node = let identity = node.identity in - let chain, actions = Chain.apply ~identity ~current ~outcome node.chain in write_chain ~chain node; - handle_chain_actions ~sw ~env ~actions node + apply_chain_actions ~sw ~env ~actions node and start_timeout ~sw ~env ~until node = node.cancel (); @@ -137,18 +133,26 @@ and on_timeout ~sw ~env ~current node = let identity = node.identity in let chain, actions = Chain.timeout ~identity ~current node.chain in write_chain ~chain node; - handle_chain_actions ~sw ~env ~actions node + apply_chain_actions ~sw ~env ~actions node + +let fork_sub ~sw msg f = + let on_error exn = + Logs.err (fun m -> m "%s: exception %s" msg (Printexc.to_string exn)) + in + Eio.Fiber.fork_sub ~sw ~on_error f let on_network_message ~sw ~env ~raw_header ~raw_content node = + fork_sub ~sw "node/message" @@ fun sw -> let chain, fragment = Chain.incoming ~raw_header ~raw_content node.chain in write_chain ~chain node; match fragment with - | Some fragment -> handle_chain_fragment ~sw ~env ~fragment node + | Some fragment -> apply_chain_fragment ~sw ~env ~fragment node | None -> () let on_network_request ~sw ~env ~connection ~raw_header ~raw_content node = + fork_sub ~sw "node/request" @@ fun sw -> let fragment = Chain.request ~connection ~raw_header ~raw_content in - handle_chain_fragment ~sw ~env ~fragment node + apply_chain_fragment ~sw ~env ~fragment node let make ~identity ~default_block_size ~dump ~chain ~indexer = let network = Network_manager.make ~identity in @@ -177,6 +181,7 @@ let to_tezos_operation transaction = | _ -> None let handle_tezos_operation ~sw ~env ~operation node = + fork_sub ~sw "node/tezos" @@ fun sw -> let Tezos_interop.{ hash; transactions } = operation in let operations = List.filter_map to_tezos_operation transactions in let tezos_operation = Tezos_operation.make hash operations in @@ -184,13 +189,13 @@ let handle_tezos_operation ~sw ~env ~operation node = Chain.incoming_tezos_operation ~tezos_operation node.chain in write_chain ~chain node; - handle_chain_actions ~sw ~env ~actions node + apply_chain_actions ~sw ~env ~actions node let reload ~sw ~env node = let current = current () in let chain, actions = Chain.reload ~current node.chain in write_chain ~chain node; - handle_chain_actions ~sw ~env ~actions node + apply_chain_actions ~sw ~env ~actions node let start ~sw ~env ~port ~nodes ~tezos node = let on_connection ~connection = @@ -223,9 +228,9 @@ let start ~sw ~env ~port ~nodes ~tezos node = | None -> ()); let net = Eio.Stdenv.net env in let clock = Eio.Stdenv.clock env in + let () = reload ~sw ~env node in Eio.Fiber.all [ - (fun () -> reload ~sw ~env node); (fun () -> Network_manager.listen ~net ~clock ~port ~on_connection ~on_message ~on_request node.network); From e153d3317cb507ccba68880805bc1cd4b9595a36 Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Fri, 16 Dec 2022 12:29:06 -0300 Subject: [PATCH 06/37] network: keep stack of connections on manager --- deku-p/src/core/network/network_manager.ml | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/deku-p/src/core/network/network_manager.ml b/deku-p/src/core/network/network_manager.ml index e721d4aa2..0d5af71c4 100644 --- a/deku-p/src/core/network/network_manager.ml +++ b/deku-p/src/core/network/network_manager.ml @@ -3,12 +3,14 @@ open Deku_concepts open Deku_gossip open Network_protocol +type write = Network_message.message -> unit + type network = { identity : Identity.t; mutable connection_id : Connection_id.t; (* TODO: Hashtbl would do a great job here *) - mutable connections : (Network_message.message -> unit) Connection_id.Map.t; - mutable connected_to : (Network_message.message -> unit) Key_hash.Map.t; + mutable connections : write Connection_id.Map.t; + mutable connected_to : (write * write list) Key_hash.Map.t; } type t = network @@ -30,11 +32,25 @@ let set_connection ~connection_id ~owner ~write network = let key_hash = Key_hash.of_key owner in network.connections <- Connection_id.Map.add connection_id write network.connections; - network.connected_to <- Key_hash.Map.add key_hash write network.connected_to - -let close_connection ~connection_id network = + network.connected_to <- + Key_hash.Map.update key_hash + (function + | Some (current_write, writes) -> Some (write, current_write :: writes) + | None -> Some (write, [])) + network.connected_to + +let close_connection ~connection_id ~owner network = + let key_hash = Key_hash.of_key owner in network.connections <- - Connection_id.Map.remove connection_id network.connections + Connection_id.Map.remove connection_id network.connections; + network.connected_to <- + Key_hash.Map.update key_hash + (function + | Some (_current_write, []) -> None + | Some (_current_write, previous_write :: writes) -> + Some (previous_write, writes) + | None -> None) + network.connected_to let with_connection ~on_connection ~on_request ~on_message network k = let connection_id = create_connection network in @@ -58,8 +74,9 @@ let with_connection ~on_connection ~on_request ~on_message network k = loop () in let handler connection = + let owner = Connection.owner connection in Fun.protect - ~finally:(fun () -> close_connection ~connection_id network) + ~finally:(fun () -> close_connection ~connection_id ~owner network) (fun () -> handler connection) in k handler @@ -116,7 +133,7 @@ let send ~message ~write = let broadcast message network = Eio.Fiber.List.iter - (fun (_connection, write) -> send ~message ~write) + (fun (_connection, (write, _writes)) -> send ~message ~write) (Key_hash.Map.bindings network.connected_to) let request ~raw_header ~raw_content network = From 8e74e279685403b9285a10f26f7d9562e64a7cf7 Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Fri, 16 Dec 2022 14:05:29 -0300 Subject: [PATCH 07/37] gossip: avoid storing current state of messages - this avoid the need to handle intermediary states --- deku-p/src/core/gossip/message_pool.ml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deku-p/src/core/gossip/message_pool.ml b/deku-p/src/core/gossip/message_pool.ml index 1ac517360..63b01c038 100644 --- a/deku-p/src/core/gossip/message_pool.ml +++ b/deku-p/src/core/gossip/message_pool.ml @@ -35,7 +35,9 @@ let message_state_encoding = let encoding = let open Data_encoding in conv - (fun (Message_pool { current; by_level }) -> (current, by_level)) + (* TOOD: maybe store by_level information? Problematic with intermediary states *) + (fun (Message_pool { current; by_level = _ }) -> + (current, Level.Map.empty)) (fun (current, by_level) -> Message_pool { current; by_level }) (tup2 Level.encoding (Level.Map.encoding (Message_hash.Map.encoding message_state_encoding))) From 91b390495e052fa02248b8ca545dd3dd99da5f95 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 29 Nov 2022 11:43:16 +0100 Subject: [PATCH 08/37] test: origination --- examples/tests/.gitignore | 1 + examples/tests/package.json | 21 +++++ examples/tests/src/index.ts | 31 ++++++++ examples/tests/src/origination.ts | 29 +++++++ examples/tests/src/utils.ts | 67 ++++++++++++++++ examples/tests/tsconfig.json | 7 ++ package.json | 1 + yarn.lock | 124 ++++++++++++++++++++++++++++++ 8 files changed, 281 insertions(+) create mode 100644 examples/tests/.gitignore create mode 100644 examples/tests/package.json create mode 100644 examples/tests/src/index.ts create mode 100644 examples/tests/src/origination.ts create mode 100644 examples/tests/src/utils.ts create mode 100644 examples/tests/tsconfig.json diff --git a/examples/tests/.gitignore b/examples/tests/.gitignore new file mode 100644 index 000000000..77738287f --- /dev/null +++ b/examples/tests/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/examples/tests/package.json b/examples/tests/package.json new file mode 100644 index 000000000..f41ac44b5 --- /dev/null +++ b/examples/tests/package.json @@ -0,0 +1,21 @@ +{ + "name": "deku-tester", + "description": "Test several aspects of deku", + "version": "1.0.0", + "main": "dist/index.js", + "license": "MIT", + "bin": { + "deku-tester": "dist/index.js" + }, + "dependencies": { + "@marigold-dev/deku": "0.1.3", + "@taquito/signer": "^14.1.0", + "commander": "^9.4.1" + }, + "devDependencies": { + "typescript": "^4.8.4" + }, + "scripts": { + "build": "tsc --project ." + } +} diff --git a/examples/tests/src/index.ts b/examples/tests/src/index.ts new file mode 100644 index 000000000..af6ae8f1a --- /dev/null +++ b/examples/tests/src/index.ts @@ -0,0 +1,31 @@ +import { Command, Option } from "commander"; +import { handleResult } from "./utils"; +import Origination from "./origination"; + +const program = new Command(); + +program.name("e2e tests").version("0.1.0"); + +program + .command("origination") + .addOption( + new Option("-d, --dekuRpc ") + .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") + .env("DEKU_RPC") + ) + .addOption( + new Option("-l, --ligoRpc ") + .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") + .env("LIGO_RPC") + ) + .addOption( + new Option("-s, --secret ") + .default( + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" + ) + .env("USER_SECRET") + ) + .action(handleResult(Origination.run)); + +program.parse(); diff --git a/examples/tests/src/origination.ts b/examples/tests/src/origination.ts new file mode 100644 index 000000000..36a8cff94 --- /dev/null +++ b/examples/tests/src/origination.ts @@ -0,0 +1,29 @@ +import { DekuCClient, fromMemorySigner } from "@marigold-dev/deku"; +import { InMemorySigner } from "@taquito/signer"; +import { code, initialStorage, wait } from "./utils"; + +const run = async ({ dekuRpc, ligoRpc, secret }): Promise => { + const signer = new InMemorySigner(secret); + const dekuSigner = fromMemorySigner(signer); + const deku = new DekuCClient({ dekuRpc, ligoRpc, dekuSigner }); + // Originate a contract + const { operation, address } = await deku.originateLigo({ + kind: "jsligo", + code, + initialStorage, + }); + // The operation should be included + await wait(dekuRpc, operation); + // Retrieve the state of the contract + const contract = deku.contract(address); + const state = await contract.getState(); + // The contract should have a state + if (state === null) throw `The contract ${address} has an empty state`; + if (state !== initialStorage) + throw `Invalid initial storage ${state}, expected ${initialStorage}`; + return address; +}; + +export default { + run, +}; diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts new file mode 100644 index 000000000..36d125f38 --- /dev/null +++ b/examples/tests/src/utils.ts @@ -0,0 +1,67 @@ +/** + * Exit the program when the promise raises an exception + * @param promise + * @returns exit(1) is the promise failed, exit(0) otherwise + */ +export const handleResult = (promise) => (params) => + promise(params) + .then(console.log) + .catch((err) => { + console.error(err); + process.exit(1); + }); + +/** + * Wait for an operation to be included + * @param dekuRpc the rpc of the deku node + * @param operation the operation hash to wait + * @param tries the number of try before admitting the operation is not included + * @returns void if success, raises an exception otherwise + */ +export const wait = async ( + dekuRpc: string, + operation, + tries = 10 +): Promise => { + if (tries <= 0) throw `The operation ${operation} has not been applied`; + const res = await fetch(`${dekuRpc}/api/v1/operations/${operation}`); + if (res.ok) return; + await new Promise((resolve) => setTimeout(resolve, 1000)); // 1000 is approximately the time for one block + return wait(dekuRpc, operation, tries - 1); +}; + +/** + * Initial storage of the following contract + */ +export const initialStorage = 0; + +/** + * Counter example with 3 entrypoints: + * - Increment(int) to increment the counter + * - Decrement(int) to decrement the counter + * - Reset() to reset to 0 the counter + */ +export const code = ` +type storage = int; + +const empty: storage = 0; + +type parameter = + | ["Increment", int] + | ["Decrement", int] + | ["Reset"]; + +const increment = (storage: storage, delta: int) => storage + delta; +const decrement = (storage: storage, delta: int) => storage - delta; +const reset = () => empty; + +const main = (action: parameter, storage: storage) : [list, storage] => { + return [ + list([]), + (match(action, { + Increment: delta => increment(storage, delta), + Decrement: delta => decrement(storage, delta), + Reset: () => reset(), + })) + ] +}`; diff --git a/examples/tests/tsconfig.json b/examples/tests/tsconfig.json new file mode 100644 index 000000000..5219268b0 --- /dev/null +++ b/examples/tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "outDir": "dist" + }, + "include": ["src/*"] +} diff --git a/package.json b/package.json index 5c9cd7942..ae1fec72f 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "examples/deku-p-nodejs", "examples/deku-p-react", "examples/number-go-up", + "examples/tests", "website" ], "scripts": { diff --git a/yarn.lock b/yarn.lock index f1ab36d03..cc559c815 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4629,6 +4629,15 @@ resolved "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz" integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + "@stablelib/int@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz" @@ -4652,6 +4661,16 @@ "@stablelib/x25519" "^1.0.3" "@stablelib/xsalsa20" "^1.0.2" +"@stablelib/pbkdf2@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/pbkdf2/-/pbkdf2-1.0.1.tgz#ba4d4379385db3ca46fb48e504ff7933c451be1d" + integrity sha512-d5jwK6jW1DkMyzqY8D1Io+fRXcsUVr95lk5LKX9ghaUdAITTc1ZL0bff+R0IrwSixbHluxhnivG7vDw59AZ/Nw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + "@stablelib/poly1305@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz" @@ -4983,6 +5002,14 @@ dependencies: axios "^0.26.0" +"@taquito/http-utils@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/http-utils/-/http-utils-15.0.0.tgz#b7fe912972394162705dd322605a52073670e2fb" + integrity sha512-caOofYWZzbxti1s1t3ObkRL4Ph8DpAWWY/staI1IiZJ/g/XX8FDtS71tE+IwBLXwH0kYqP0bNhTGPP04ebEHpQ== + dependencies: + "@vespaiach/axios-fetch-adapter" "^0.3.1" + axios "^0.26.0" + "@taquito/ledger-signer@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/ledger-signer/-/ledger-signer-14.0.0.tgz" @@ -5010,6 +5037,14 @@ "@taquito/utils" "^14.0.0" bignumber.js "^9.0.2" +"@taquito/local-forging@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/local-forging/-/local-forging-15.0.0.tgz#d12084e4fb916e78124c181ef0b7e6181d53a678" + integrity sha512-8QLut19U03Tsm59RjrSZOlLZx5mglQjQFt5No1VzWfNsXv7mytmn8SlvqFxyt8hyTlm1RM1NdJJ1oO1h1A/BRQ== + dependencies: + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + "@taquito/michel-codec@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-13.0.1.tgz" @@ -5020,6 +5055,11 @@ resolved "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-14.0.0.tgz" integrity sha512-ftnBvUVddlHBqvQbGPHEb26KrS4lIcaZ1eIpYJWiz+akb4Pcfyq7j/OEsDZbB7Pl2FP9hqu7ZygOF34zY6Lrtw== +"@taquito/michel-codec@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/michel-codec/-/michel-codec-15.0.0.tgz#f05be1fa3811cbd2bfcb16ca2e84c602afae6824" + integrity sha512-pfnrXVSkGeeVNx7MYHTeu79iU4lGynym/7+8QbD/O28LWob8PUrwpt+jaAxsVDdNOYtKz+LO1E4FpC348tHO6Q== + "@taquito/michelson-encoder@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-13.0.1.tgz" @@ -5040,6 +5080,16 @@ bignumber.js "^9.0.2" fast-json-stable-stringify "^2.1.0" +"@taquito/michelson-encoder@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/michelson-encoder/-/michelson-encoder-15.0.0.tgz#8fc3492a22404ae8a8b1907a43bf10745e1b973b" + integrity sha512-TxmWCgZBuA7SrNPSN+xfeeovDGU5H5sXyXcgL3KwYfeILaWiWr1MbI9n8xV7ewJZSC9svor6/osz7Y04+TIpgw== + dependencies: + "@taquito/rpc" "^15.0.0" + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + fast-json-stable-stringify "^2.1.0" + "@taquito/remote-signer@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/remote-signer/-/remote-signer-14.0.0.tgz" @@ -5070,6 +5120,15 @@ "@taquito/utils" "^14.0.0" bignumber.js "^9.0.2" +"@taquito/rpc@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/rpc/-/rpc-15.0.0.tgz#096ac942be0d5d3bc5f7ad4f3dbe4b15dd1d1e12" + integrity sha512-z5oPSD2QDhLqU9scA4Pof2+DUaK9P3oDWeCqr6/JAOlt1DwDwYsHj84d4UVmpjP/DrTj4Sp1IyY7I9KpNNLlGQ== + dependencies: + "@taquito/http-utils" "^15.0.0" + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + "@taquito/sapling@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/sapling/-/sapling-14.0.0.tgz" @@ -5115,6 +5174,39 @@ pbkdf2 "^3.1.2" typedarray-to-buffer "^4.0.0" +"@taquito/signer@^14.1.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@taquito/signer/-/signer-14.2.0.tgz#a65d122c08bfbdc356ea7fe2ee0f044918e4733d" + integrity sha512-WSJ75F3eRE1YEQ1A3j1vqHWG59Ha8hoP1j+eF+e0JTIpvYJoQu8YV4uuoO0yd7zPMSFpbGZI3NwhfNltpCmwiQ== + dependencies: + "@stablelib/blake2b" "^1.0.1" + "@stablelib/ed25519" "^1.0.3" + "@stablelib/hmac" "^1.0.1" + "@stablelib/nacl" "^1.0.4" + "@stablelib/pbkdf2" "^1.0.1" + "@stablelib/sha512" "^1.0.1" + "@taquito/taquito" "*" + "@taquito/utils" "*" + "@types/bn.js" "^5.1.1" + bip39 "^3.0.4" + elliptic "^6.5.4" + pbkdf2 "^3.1.2" + typedarray-to-buffer "^4.0.0" + +"@taquito/taquito@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/taquito/-/taquito-15.0.0.tgz#5bde81d8e81a25dcf7039e08b22eccad73e631c8" + integrity sha512-pYs/hBbjapR/wN+gLhQQYEbL3D7WZXsR/+cb5oCN67vhKwyXkDuBJIEpWIoFGNcwJn0eGFGkUjfngE1bUyMypA== + dependencies: + "@taquito/http-utils" "^15.0.0" + "@taquito/local-forging" "^15.0.0" + "@taquito/michel-codec" "^15.0.0" + "@taquito/michelson-encoder" "^15.0.0" + "@taquito/rpc" "^15.0.0" + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + rxjs "^6.6.3" + "@taquito/taquito@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/taquito/-/taquito-13.0.1.tgz" @@ -5172,6 +5264,21 @@ bignumber.js "^9.0.2" crypto-js "^4.1.1" +"@taquito/utils@*", "@taquito/utils@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/utils/-/utils-15.0.0.tgz#1d9cf577dd3b4709a5100976d790d0e5fc04d346" + integrity sha512-15Eq3YarC3HuZY8fmAEmtZaFglMIHjRVeR7l4fd8NJK6EdDZydJ00o40JMof9mhSy6A5atm15IHLD5sfdfx5lg== + dependencies: + "@stablelib/blake2b" "^1.0.1" + "@stablelib/ed25519" "^1.0.3" + "@types/bs58check" "^2.1.0" + bignumber.js "^9.1.0" + blakejs "^1.2.1" + bs58check "^2.1.2" + buffer "^6.0.3" + elliptic "^6.5.4" + typedarray-to-buffer "^4.0.0" + "@taquito/utils@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/utils/-/utils-13.0.1.tgz" @@ -5335,6 +5442,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" @@ -6035,6 +6149,11 @@ resolved "https://registry.npmjs.org/@tzstamp/helpers/-/helpers-0.3.4.tgz" integrity sha512-UM/Sd15xy5EBKJx5UZL/D2H1YETJxyTnbnmEO9zXiTTQ6DAlBuKdsihhspHqymySEznCRO9b6dHkaPkQsqM6Vg== +"@vespaiach/axios-fetch-adapter@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@vespaiach/axios-fetch-adapter/-/axios-fetch-adapter-0.3.1.tgz#b0c08167bec9cc558f578a1b9ccff52ead1cf1cb" + integrity sha512-+1F52VWXmQHSRFSv4/H0wtnxfvjRMPK5531e880MIjypPdUSX6QZuoDgEVeCE1vjhzDdxCVX7rOqkub7StEUwQ== + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" @@ -7005,6 +7124,11 @@ bignumber.js@^9.0.2: resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== +bignumber.js@^9.1.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + bin-links@^3.0.0: version "3.0.3" resolved "https://registry.npmjs.org/bin-links/-/bin-links-3.0.3.tgz" From 9becd11465135fa0f023caa3f6c87de0170b211d Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 29 Nov 2022 13:49:06 +0100 Subject: [PATCH 09/37] test: invokation --- examples/tests/src/index.ts | 46 ++++++++++++++++++++++++++++++++ examples/tests/src/invokation.ts | 35 ++++++++++++++++++++++++ examples/tests/src/utils.ts | 45 ++++++++++++++++++++++++++----- 3 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 examples/tests/src/invokation.ts diff --git a/examples/tests/src/index.ts b/examples/tests/src/index.ts index af6ae8f1a..04c24fa2b 100644 --- a/examples/tests/src/index.ts +++ b/examples/tests/src/index.ts @@ -1,6 +1,7 @@ import { Command, Option } from "commander"; import { handleResult } from "./utils"; import Origination from "./origination"; +import Invokation from "./invokation"; const program = new Command(); @@ -28,4 +29,49 @@ program ) .action(handleResult(Origination.run)); +program + .command("origination") + .addOption( + new Option("-d, --dekuRpc ") + .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") + .env("DEKU_RPC") + ) + .addOption( + new Option("-l, --ligoRpc ") + .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") + .env("LIGO_RPC") + ) + .addOption( + new Option("-s, --secret ") + .default( + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" + ) + .env("USER_SECRET") + ) + .action(handleResult(Origination.run)); + +program + .command("invokation") + .addOption( + new Option("-d, --dekuRpc ") + .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") + .env("DEKU_RPC") + ) + .addOption( + new Option("-l, --ligoRpc ") + .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") + .env("LIGO_RPC") + ) + .addOption( + new Option("-s, --secret ") + .default( + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", + "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" + ) + .env("USER_SECRET") + ) + .argument("", "address of the deku wasm contract") + .action(handleResult(Invokation.run)); + program.parse(); diff --git a/examples/tests/src/invokation.ts b/examples/tests/src/invokation.ts new file mode 100644 index 000000000..4c5d2b9d1 --- /dev/null +++ b/examples/tests/src/invokation.ts @@ -0,0 +1,35 @@ +import { DekuCClient, fromMemorySigner } from "@marigold-dev/deku"; +import { InMemorySigner } from "@taquito/signer"; +import { decrement, increment, initialStorage, reset, wait } from "./utils"; + +const run = async (address, { secret, dekuRpc, ligoRpc }): Promise => { + const signer = new InMemorySigner(secret); + const dekuSigner = fromMemorySigner(signer); + const deku = new DekuCClient({ dekuRpc, ligoRpc, dekuSigner }); + // Get the contract + const contract = deku.contract(address); + const initial = await contract.getState(); + // increment the state + const op1 = await contract.invokeRaw(increment(2)); + await wait(dekuRpc, op1); + const state1 = await contract.getState(); + if (initial + 2 !== state1) + throw "Increment did not worked, the state is not updated."; + // decrement the state + const op2 = await contract.invokeRaw(decrement(1)); + await wait(dekuRpc, op2); + const state2 = await contract.getState(); + if (state1 - 1 !== state2) + throw "Decrement did not worked, the state is not updated."; + // reset the state + const op3 = await contract.invokeRaw(reset()); + await wait(dekuRpc, op3); + const state3 = await contract.getState(); + if (state3 !== initialStorage) + throw "Reset did not worked, the state is not updated."; + return "Contract updated as expected"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts index 36d125f38..dd108b880 100644 --- a/examples/tests/src/utils.ts +++ b/examples/tests/src/utils.ts @@ -3,13 +3,15 @@ * @param promise * @returns exit(1) is the promise failed, exit(0) otherwise */ -export const handleResult = (promise) => (params) => - promise(params) - .then(console.log) - .catch((err) => { - console.error(err); - process.exit(1); - }); +export const handleResult = + (promise) => + (...params) => + promise(...params) + .then(console.log) + .catch((err) => { + console.error(err); + process.exit(1); + }); /** * Wait for an operation to be included @@ -65,3 +67,32 @@ const main = (action: parameter, storage: storage) : [list, storage] })) ] }`; + +/** + * Increment entrypoint + * michelson: (Left (Right n)) + * @param n the delta to increment + * @returns the payload of the operation + */ +export const increment = (n) => [ + "Union", + ["Left", ["Union", ["Right", ["Int", n.toString()]]]], +]; + +/** + * Decrement entrypoint + * michelson: (Left (Left n)) + * @param n the delta to decrement + * @returns the payload of the operation + */ +export const decrement = (n) => [ + "Union", + ["Left", ["Union", ["Left", ["Int", n.toString()]]]], +]; + +/** + * Reset the state of the contract + * michelson: (Right Unit) + * @returns the payload of the operation + */ +export const reset = () => ["Union", ["Right", ["Unit"]]]; From 4496fa011db9b3d568b0a913db7c27e2d57bd6af Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 29 Nov 2022 14:01:15 +0100 Subject: [PATCH 10/37] test: making progress --- examples/tests/package.json | 1 + examples/tests/src/defaults.ts | 21 +++++ examples/tests/src/deposit.ts | 31 +++++++ examples/tests/src/index.ts | 129 +++++++++++++++++++++++--- examples/tests/src/invokation.ts | 2 +- examples/tests/src/is-sync.ts | 28 ++++++ examples/tests/src/making-progress.ts | 20 ++++ examples/tests/src/transfer.ts | 55 +++++++++++ examples/tests/src/utils.ts | 2 + 9 files changed, 273 insertions(+), 16 deletions(-) create mode 100644 examples/tests/src/defaults.ts create mode 100644 examples/tests/src/deposit.ts create mode 100644 examples/tests/src/is-sync.ts create mode 100644 examples/tests/src/making-progress.ts create mode 100644 examples/tests/src/transfer.ts diff --git a/examples/tests/package.json b/examples/tests/package.json index f41ac44b5..8f2b7655b 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -10,6 +10,7 @@ "dependencies": { "@marigold-dev/deku": "0.1.3", "@taquito/signer": "^14.1.0", + "@taquito/taquito": "^14.2.0", "commander": "^9.4.1" }, "devDependencies": { diff --git a/examples/tests/src/defaults.ts b/examples/tests/src/defaults.ts new file mode 100644 index 000000000..14d25e635 --- /dev/null +++ b/examples/tests/src/defaults.ts @@ -0,0 +1,21 @@ +export const DEKU_RPC = "https://deku-canonical-vm0.deku-v1.marigold.dev"; +export const DEKU_RPC_0 = "https://deku-canonical-vm0.deku-v1.marigold.dev"; +export const DEKU_RPC_1 = "https://deku-canonical-vm1.deku-v1.marigold.dev"; +export const DEKU_RPC_2 = "https://deku-canonical-vm2.deku-v1.marigold.dev"; +export const DEKU_RPC_3 = "https://deku-canonical-vm3.deku-v1.marigold.dev"; +export const LIGO_RPC = "http://0.0.0.0:9090"; +export const TEZOS_RPC = "https://rpc.tzkt.io/ghostnet"; +// This account does not have any tickets on deku +export const EMPTY_SECRET = + "edsk3QoqBuvdamxouPhin7swCvkQNgq4jP5KZPbwWNnwdZpSpJiEbq"; +// Have some tez on tezos +export const EVE_SECRET = + "edskRubBsVKzfE3rH7GXWb71UewQXDYd2ZDzW8818RWL9mQbRop4V8rJwcjmFRgMApJ1m7ygWPWEum4VtK2VxLokWu7iJAiDM9"; +// Only have 10 tickets used for the transfer test +export const BOB_SECRET = + "edsk3gHBUthmmz15K3v1AcQYw6bXv9XjARWXQV4yLJcUiHtR6MNLhG"; +// receive the 10 tickets from bob and send him back +export const ALICE_SECRET = + "edsk43xJ9tDYyJEuSP4cAbc1xSK3zKdCh8V5yHqd1PmNFhhwM7ksH5"; +export const DEKU_COUNTER_CONTRACT = "DK1CAA1DVcxfwRgRMhXX4puag48kgfPtfkJq"; +export const DUMMY_TICKET_CONTRACT = "KT1WqDmVx6AEB4V4MFoTjSKKt9XhvvihrVJC"; diff --git a/examples/tests/src/deposit.ts b/examples/tests/src/deposit.ts new file mode 100644 index 000000000..270f04bce --- /dev/null +++ b/examples/tests/src/deposit.ts @@ -0,0 +1,31 @@ +import { DekuPClient } from "@marigold-dev/deku"; +import { InMemorySigner } from "@taquito/signer"; +import { TezosToolkit } from "@taquito/taquito"; + +const run = async ({ dekuRpc, secret, tezosRpc, ticketer }) => { + const signer = new InMemorySigner(secret); + const deku = new DekuPClient({ dekuRpc }); + const tezos = new TezosToolkit(tezosRpc); + tezos.setProvider({ signer }); + const address = await signer.publicKeyHash(); + const { consensus } = await deku.info(); + const data = "0x0505050505"; + const contract = await tezos.contract.at(ticketer); + // Get the previous balance on deku side + const previousBalance = await deku.getBalance(address, { ticketer, data }); + // Mint some tickets to deku and wait for it to be included + const operation = await contract.methods + .mint_to_deku(consensus, address, 10, data) + .send(); + await operation.confirmation(3); + // Get the new balance on deku side. + const nextBalance = await deku.getBalance(address, { ticketer, data }); + // The balance should have been incremented. + if (previousBalance + 10 !== nextBalance) + throw `The balance of ${address} for ticket ${ticketer} of data ${data} has not been updated`; + return "Balance updated success"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/index.ts b/examples/tests/src/index.ts index 04c24fa2b..06dbfe2f2 100644 --- a/examples/tests/src/index.ts +++ b/examples/tests/src/index.ts @@ -2,6 +2,25 @@ import { Command, Option } from "commander"; import { handleResult } from "./utils"; import Origination from "./origination"; import Invokation from "./invokation"; +import MakingProgress from "./making-progress"; +import IsSync from "./is-sync"; +import Deposit from "./deposit"; +import Transfer from "./transfer"; +import { + ALICE_SECRET, + BOB_SECRET, + DEKU_COUNTER_CONTRACT, + DEKU_RPC, + DEKU_RPC_0, + DEKU_RPC_1, + DEKU_RPC_2, + DEKU_RPC_3, + DUMMY_TICKET_CONTRACT, + EMPTY_SECRET, + EVE_SECRET, + LIGO_RPC, + TEZOS_RPC, +} from "./defaults"; const program = new Command(); @@ -33,21 +52,18 @@ program .command("origination") .addOption( new Option("-d, --dekuRpc ") - .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") + .default(DEKU_RPC, DEKU_RPC) .env("DEKU_RPC") ) .addOption( new Option("-l, --ligoRpc ") - .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") + .default(LIGO_RPC, LIGO_RPC) .env("LIGO_RPC") ) .addOption( new Option("-s, --secret ") - .default( - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" - ) - .env("USER_SECRET") + .default(EMPTY_SECRET, EMPTY_SECRET) + .env("DEKU_USER_SECRET") ) .action(handleResult(Origination.run)); @@ -55,23 +71,106 @@ program .command("invokation") .addOption( new Option("-d, --dekuRpc ") - .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") + .default(DEKU_RPC, DEKU_RPC) .env("DEKU_RPC") ) .addOption( new Option("-l, --ligoRpc ") - .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") + .default(LIGO_RPC, LIGO_RPC) .env("LIGO_RPC") ) .addOption( new Option("-s, --secret ") - .default( - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" - ) - .env("USER_SECRET") + .default(EMPTY_SECRET, EMPTY_SECRET) + .env("DEKU_USER_SECRET") + ) + .addOption( + new Option("-a, --address
") + .default(DEKU_COUNTER_CONTRACT, DEKU_COUNTER_CONTRACT) + .env("DEKU_COUNTER_CONTRACT") ) - .argument("", "address of the deku wasm contract") .action(handleResult(Invokation.run)); +program + .command("making-progress") + .addOption( + new Option("-d, --dekuRpc ") + .default(DEKU_RPC, DEKU_RPC) + .env("DEKU_RPC") + ) + .action(handleResult(MakingProgress.run)); + +program + .command("is-sync") + .addOption( + new Option("-d0, --dekuRpc0 ") + .default(DEKU_RPC_0, DEKU_RPC_0) + .env("DEKU_RPC_0") + ) + .addOption( + new Option("-d1, --dekuRpc1 ") + .default(DEKU_RPC_1, DEKU_RPC_1) + .env("DEKU_RPC_1") + ) + .addOption( + new Option("-d2, --dekuRpc2 ") + .default(DEKU_RPC_2, DEKU_RPC_2) + .env("DEKU_RPC_2") + ) + .addOption( + new Option("-d3, --dekuRpc3 ") + .default(DEKU_RPC_3, DEKU_RPC_3) + .env("DEKU_RPC_3") + ) + .action(handleResult(IsSync.run)); + +program + .command("deposit") + .addOption( + new Option("-d, --dekuRpc ") + .default(DEKU_RPC, DEKU_RPC) + .env("DEKU_RPC") + ) + .addOption( + new Option("-s, --secret ") + .default(EVE_SECRET, EVE_SECRET) + .env("USER_SECRET") + ) // Share secret between deku and tezos. + .addOption( + new Option("-t, --tezosRpc ") + .default(TEZOS_RPC, TEZOS_RPC) + .env("TEZOS_RPC") + ) + .addOption( + new Option("-c, --ticketer ") + .default(DUMMY_TICKET_CONTRACT, DUMMY_TICKET_CONTRACT) + .env("DUMMY_TICKET_CONTRACT") + ) + .action(handleResult(Deposit.run)); +// TODO: withdraw, withdraw-proof, all(command which does everything) + +program + .command("transfer") + .addOption( + new Option("-d, --dekuRpc ") + .default(DEKU_RPC, DEKU_RPC) + .env("DEKU_RPC") + ) + .addOption( + new Option("-a, --alice-secret ") + .default(ALICE_SECRET, ALICE_SECRET) + .env("ALICE_SECRET") + ) + .addOption( + new Option("-b, --bobSecret ") + .default(BOB_SECRET, BOB_SECRET) + .env("BOB_SECRET") + ) + .addOption( + new Option("-t, --ticketer ") + .default(DUMMY_TICKET_CONTRACT, DUMMY_TICKET_CONTRACT) + .env("DUMMY_TICKET_CONTRACT") + ) + .action(handleResult(Transfer.run)); + program.parse(); diff --git a/examples/tests/src/invokation.ts b/examples/tests/src/invokation.ts index 4c5d2b9d1..e96e6f6ec 100644 --- a/examples/tests/src/invokation.ts +++ b/examples/tests/src/invokation.ts @@ -2,7 +2,7 @@ import { DekuCClient, fromMemorySigner } from "@marigold-dev/deku"; import { InMemorySigner } from "@taquito/signer"; import { decrement, increment, initialStorage, reset, wait } from "./utils"; -const run = async (address, { secret, dekuRpc, ligoRpc }): Promise => { +const run = async ({ secret, dekuRpc, ligoRpc, address }): Promise => { const signer = new InMemorySigner(secret); const dekuSigner = fromMemorySigner(signer); const deku = new DekuCClient({ dekuRpc, ligoRpc, dekuSigner }); diff --git a/examples/tests/src/is-sync.ts b/examples/tests/src/is-sync.ts new file mode 100644 index 000000000..59bd9eddc --- /dev/null +++ b/examples/tests/src/is-sync.ts @@ -0,0 +1,28 @@ +import { DekuPClient } from "@marigold-dev/deku"; + +const run = async ({ dekuRpc0, dekuRpc1, dekuRpc2, dekuRpc3 }) => { + const nodes = [ + new DekuPClient({ dekuRpc: dekuRpc0 }), + new DekuPClient({ dekuRpc: dekuRpc1 }), + new DekuPClient({ dekuRpc: dekuRpc2 }), + new DekuPClient({ dekuRpc: dekuRpc3 }), + ]; + // get the level for each node + const levels = await Promise.all(nodes.map((node) => node.level())); + // Get the mean level + const mean = levels.reduce((acc, level) => acc + level, 0) / levels.length; + // Compute the sum of (x - mean)² + const sum = levels + .map((level) => (level - mean) ** 2) + .reduce((acc, curr) => acc + curr, 0); + // Compute the variance: sum / n + let variance = sum / levels.length; + // Compute the deviation: sqrt(variance) + let deviation = Math.sqrt(variance); + if (deviation > 1) throw "The API is not sync"; + return "The API is sync"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/making-progress.ts b/examples/tests/src/making-progress.ts new file mode 100644 index 000000000..48114ecfd --- /dev/null +++ b/examples/tests/src/making-progress.ts @@ -0,0 +1,20 @@ +import { DekuPClient } from "@marigold-dev/deku"; +import { sleep } from "./utils"; + +const run = async ({ dekuRpc }) => { + const deku = new DekuPClient({ dekuRpc }); + // Retrieves some levels + const level = await deku.level(); + await sleep(2000); + const nextLevel = await deku.level(); + await sleep(2000); + const nextNextLevel = await deku.level(); + // check if all the levels are different + if (level >= nextLevel || nextLevel >= nextNextLevel) + throw "The chain is not making progress"; + return "The chain is making progress"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/transfer.ts b/examples/tests/src/transfer.ts new file mode 100644 index 000000000..8f7bcaf30 --- /dev/null +++ b/examples/tests/src/transfer.ts @@ -0,0 +1,55 @@ +import { DekuPClient, fromMemorySigner } from "@marigold-dev/deku"; +import { InMemorySigner } from "@taquito/signer"; +import { wait } from "./utils"; + +const run = async ({ dekuRpc, aliceSecret, bobSecret, ticketer }) => { + const data = "0x0505050505"; + const ticketId = { ticketer, data }; + // Instanciate deku toolkit for Alice + const aliceSigner = fromMemorySigner(new InMemorySigner(aliceSecret)); + const aliceAddr = await aliceSigner.publicKeyHash(); + const dekuA = new DekuPClient({ dekuRpc, dekuSigner: aliceSigner }); + // Instanciate deku toolkit for Bob + const bobSigner = fromMemorySigner(new InMemorySigner(bobSecret)); + const bobAddr = await bobSigner.publicKeyHash(); + const dekuB = new DekuPClient({ dekuRpc, dekuSigner: bobSigner }); + // Get the previous balance of Alice and Bob + const previousBalanceA = await dekuA.getBalance(aliceAddr, ticketId); + const previousBalanceB = await dekuB.getBalance(bobAddr, ticketId); + // Determines who is the sender and who is the receiver + // The sender is the user who has the most balance of the ticket + const [sender, receiver] = + previousBalanceA > previousBalanceB + ? [ + { deku: dekuA, addr: aliceAddr, balance: previousBalanceA }, + { deku: dekuB, addr: bobAddr, balance: previousBalanceB }, + ] + : [ + { deku: dekuB, addr: bobAddr, balance: previousBalanceB }, + { deku: dekuA, addr: aliceAddr, balance: previousBalanceA }, + ]; + // Transfer 1 ticket from the sender to receiver + const op = await sender.deku.transferTo( + receiver.addr, + 1, + ticketer, + "0505050505" + ); + await wait(dekuRpc, op); + // Get the new balance of the sender and receiver + const nextBalanceSender = await sender.deku.getBalance(sender.addr, ticketId); + const nextBalanceReceiver = await receiver.deku.getBalance( + receiver.addr, + ticketId + ); + // Check that the balances have been correctly updated. + if (sender.balance - 1 !== nextBalanceSender) + throw "The balance of the sender has not been updated"; + if (receiver.balance + 1 !== nextBalanceReceiver) + throw "The balance of the receiver has not been updated"; + return "Transfer tokens is working"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts index dd108b880..0b88f3bd8 100644 --- a/examples/tests/src/utils.ts +++ b/examples/tests/src/utils.ts @@ -32,6 +32,8 @@ export const wait = async ( return wait(dekuRpc, operation, tries - 1); }; +export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + /** * Initial storage of the following contract */ From 361f9579ac26ef6ec313adeddb6780b2c06f7b76 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Wed, 30 Nov 2022 15:41:12 +0100 Subject: [PATCH 11/37] test: withdraw/withdraw-proof does not work --- examples/tests/package.json | 1 + examples/tests/readme.md | 42 ++++++ examples/tests/src/contract-level.ts | 27 ++++ examples/tests/src/defaults.ts | 21 --- examples/tests/src/deposit.ts | 3 +- examples/tests/src/index.ts | 185 +++++++++++---------------- examples/tests/src/is-commiting.ts | 35 +++++ examples/tests/src/is-sync.ts | 11 +- examples/tests/src/options.ts | 129 +++++++++++++++++++ examples/tests/src/transfer.ts | 17 ++- examples/tests/src/utils.ts | 13 ++ examples/tests/src/withdraw.ts | 58 +++++++++ yarn.lock | 86 +++++++------ 13 files changed, 446 insertions(+), 182 deletions(-) create mode 100644 examples/tests/readme.md create mode 100644 examples/tests/src/contract-level.ts delete mode 100644 examples/tests/src/defaults.ts create mode 100644 examples/tests/src/is-commiting.ts create mode 100644 examples/tests/src/options.ts create mode 100644 examples/tests/src/withdraw.ts diff --git a/examples/tests/package.json b/examples/tests/package.json index 8f2b7655b..04709c43d 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -11,6 +11,7 @@ "@marigold-dev/deku": "0.1.3", "@taquito/signer": "^14.1.0", "@taquito/taquito": "^14.2.0", + "@tzstamp/helpers": "^0.3.4", "commander": "^9.4.1" }, "devDependencies": { diff --git a/examples/tests/readme.md b/examples/tests/readme.md new file mode 100644 index 000000000..b716179ee --- /dev/null +++ b/examples/tests/readme.md @@ -0,0 +1,42 @@ +# Deku e2e tester + +This tester can test some aspect of the deku-c blockchain: + +- invokation +- origination +- are node sync ? +- are node making progress ? +- ticket transfer +- ticket deposit +- ticket withdraw +- is deku updating the state root hash of the consensus contract ? + +I don't recommend to run the ticket tests in parralel, except if you use different secret in every tests. + +# Requirement: + +- node18 for execution + +# How to run ? + +If you are working in the deku monorepo, you will have to the following commands: + +``` +yarn install # At root position +cd deku-c/client +yarn build +cd ../../examples/tests +yarn build +``` + +Then you can run the help of the tests to check everything. + +``` +node dist/index.js --help +``` + +If you want some precise help on a command: + +``` +node dist/index.js --help +``` diff --git a/examples/tests/src/contract-level.ts b/examples/tests/src/contract-level.ts new file mode 100644 index 000000000..daee68df0 --- /dev/null +++ b/examples/tests/src/contract-level.ts @@ -0,0 +1,27 @@ +import { DekuPClient } from "@marigold-dev/deku"; +import { TezosToolkit } from "@taquito/taquito"; + +const run = async ({ dekuRpc, tezosRpc }) => { + const deku = new DekuPClient({ dekuRpc }); + const tezos = new TezosToolkit(tezosRpc); + const { consensus } = await deku.info(); + // Retrieve the level of deku + const dekuLevel = await deku.level(); + // retrieve the level of stored in the consensus smart contract + const contract = await tezos.contract.at(consensus); + const storage = (await contract.storage()) as { + root_hash: { current_block_level: BigInt }; + }; + const contractLevel = Number.parseInt( + storage.root_hash.current_block_level.toString() + ); + // Check if there is a delta of 300 blocks between the consensus contract and the deku level + // A delta of 300 blocks represents approximately 5 minutes + if (contractLevel + 300 < dekuLevel) + throw "The consensus is not sync, last update was 5 minutes ago."; + return "Consensus smart contract is sync"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/defaults.ts b/examples/tests/src/defaults.ts deleted file mode 100644 index 14d25e635..000000000 --- a/examples/tests/src/defaults.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const DEKU_RPC = "https://deku-canonical-vm0.deku-v1.marigold.dev"; -export const DEKU_RPC_0 = "https://deku-canonical-vm0.deku-v1.marigold.dev"; -export const DEKU_RPC_1 = "https://deku-canonical-vm1.deku-v1.marigold.dev"; -export const DEKU_RPC_2 = "https://deku-canonical-vm2.deku-v1.marigold.dev"; -export const DEKU_RPC_3 = "https://deku-canonical-vm3.deku-v1.marigold.dev"; -export const LIGO_RPC = "http://0.0.0.0:9090"; -export const TEZOS_RPC = "https://rpc.tzkt.io/ghostnet"; -// This account does not have any tickets on deku -export const EMPTY_SECRET = - "edsk3QoqBuvdamxouPhin7swCvkQNgq4jP5KZPbwWNnwdZpSpJiEbq"; -// Have some tez on tezos -export const EVE_SECRET = - "edskRubBsVKzfE3rH7GXWb71UewQXDYd2ZDzW8818RWL9mQbRop4V8rJwcjmFRgMApJ1m7ygWPWEum4VtK2VxLokWu7iJAiDM9"; -// Only have 10 tickets used for the transfer test -export const BOB_SECRET = - "edsk3gHBUthmmz15K3v1AcQYw6bXv9XjARWXQV4yLJcUiHtR6MNLhG"; -// receive the 10 tickets from bob and send him back -export const ALICE_SECRET = - "edsk43xJ9tDYyJEuSP4cAbc1xSK3zKdCh8V5yHqd1PmNFhhwM7ksH5"; -export const DEKU_COUNTER_CONTRACT = "DK1CAA1DVcxfwRgRMhXX4puag48kgfPtfkJq"; -export const DUMMY_TICKET_CONTRACT = "KT1WqDmVx6AEB4V4MFoTjSKKt9XhvvihrVJC"; diff --git a/examples/tests/src/deposit.ts b/examples/tests/src/deposit.ts index 270f04bce..0d1310051 100644 --- a/examples/tests/src/deposit.ts +++ b/examples/tests/src/deposit.ts @@ -2,14 +2,13 @@ import { DekuPClient } from "@marigold-dev/deku"; import { InMemorySigner } from "@taquito/signer"; import { TezosToolkit } from "@taquito/taquito"; -const run = async ({ dekuRpc, secret, tezosRpc, ticketer }) => { +const run = async ({ dekuRpc, secret, tezosRpc, ticketer, data }) => { const signer = new InMemorySigner(secret); const deku = new DekuPClient({ dekuRpc }); const tezos = new TezosToolkit(tezosRpc); tezos.setProvider({ signer }); const address = await signer.publicKeyHash(); const { consensus } = await deku.info(); - const data = "0x0505050505"; const contract = await tezos.contract.at(ticketer); // Get the previous balance on deku side const previousBalance = await deku.getBalance(address, { ticketer, data }); diff --git a/examples/tests/src/index.ts b/examples/tests/src/index.ts index 06dbfe2f2..4071906b2 100644 --- a/examples/tests/src/index.ts +++ b/examples/tests/src/index.ts @@ -1,3 +1,5 @@ +#!/usr/bin/env node + import { Command, Option } from "commander"; import { handleResult } from "./utils"; import Origination from "./origination"; @@ -6,21 +8,23 @@ import MakingProgress from "./making-progress"; import IsSync from "./is-sync"; import Deposit from "./deposit"; import Transfer from "./transfer"; +import Withdraw from "./withdraw"; +import ContractLevel from "./contract-level"; +import IsCommiting from "./is-commiting"; import { - ALICE_SECRET, - BOB_SECRET, - DEKU_COUNTER_CONTRACT, + ALL_DEKU_RPC, + CANONICAL_CONTRACT_ADDRESS, DEKU_RPC, - DEKU_RPC_0, - DEKU_RPC_1, - DEKU_RPC_2, - DEKU_RPC_3, - DUMMY_TICKET_CONTRACT, - EMPTY_SECRET, - EVE_SECRET, LIGO_RPC, + SECRET, + TICKETER, TEZOS_RPC, -} from "./defaults"; + SECRET_1_WITH_TICKETS, + SECRET_2_WITH_TICKETS, + SECRET_WITH_TEZ, + BLOCKS, + TICKET_DATA, +} from "./options"; const program = new Command(); @@ -50,127 +54,88 @@ program program .command("origination") - .addOption( - new Option("-d, --dekuRpc ") - .default(DEKU_RPC, DEKU_RPC) - .env("DEKU_RPC") - ) - .addOption( - new Option("-l, --ligoRpc ") - .default(LIGO_RPC, LIGO_RPC) - .env("LIGO_RPC") - ) - .addOption( - new Option("-s, --secret ") - .default(EMPTY_SECRET, EMPTY_SECRET) - .env("DEKU_USER_SECRET") - ) + .description("Will originate a counter contract on deku.") + .addOption(DEKU_RPC) + .addOption(LIGO_RPC) + .addOption(SECRET) .action(handleResult(Origination.run)); program .command("invokation") - .addOption( - new Option("-d, --dekuRpc ") - .default(DEKU_RPC, DEKU_RPC) - .env("DEKU_RPC") - ) - .addOption( - new Option("-l, --ligoRpc ") - .default(LIGO_RPC, LIGO_RPC) - .env("LIGO_RPC") - ) - .addOption( - new Option("-s, --secret ") - .default(EMPTY_SECRET, EMPTY_SECRET) - .env("DEKU_USER_SECRET") - ) - .addOption( - new Option("-a, --address
") - .default(DEKU_COUNTER_CONTRACT, DEKU_COUNTER_CONTRACT) - .env("DEKU_COUNTER_CONTRACT") + .description( + "Will invoke all the entrypoints of the counter contract. The contract must have been originated" ) + .addOption(DEKU_RPC) + .addOption(LIGO_RPC) + .addOption(SECRET) + .addOption(CANONICAL_CONTRACT_ADDRESS) .action(handleResult(Invokation.run)); program .command("making-progress") - .addOption( - new Option("-d, --dekuRpc ") - .default(DEKU_RPC, DEKU_RPC) - .env("DEKU_RPC") - ) + .description("Check if the node is making progress") + .addOption(DEKU_RPC) .action(handleResult(MakingProgress.run)); program .command("is-sync") - .addOption( - new Option("-d0, --dekuRpc0 ") - .default(DEKU_RPC_0, DEKU_RPC_0) - .env("DEKU_RPC_0") - ) - .addOption( - new Option("-d1, --dekuRpc1 ") - .default(DEKU_RPC_1, DEKU_RPC_1) - .env("DEKU_RPC_1") - ) - .addOption( - new Option("-d2, --dekuRpc2 ") - .default(DEKU_RPC_2, DEKU_RPC_2) - .env("DEKU_RPC_2") - ) - .addOption( - new Option("-d3, --dekuRpc3 ") - .default(DEKU_RPC_3, DEKU_RPC_3) - .env("DEKU_RPC_3") + .description( + "Check if the standard derivation of the node levels it not too high." ) + .addOption(ALL_DEKU_RPC) .action(handleResult(IsSync.run)); program .command("deposit") - .addOption( - new Option("-d, --dekuRpc ") - .default(DEKU_RPC, DEKU_RPC) - .env("DEKU_RPC") - ) - .addOption( - new Option("-s, --secret ") - .default(EVE_SECRET, EVE_SECRET) - .env("USER_SECRET") - ) // Share secret between deku and tezos. - .addOption( - new Option("-t, --tezosRpc ") - .default(TEZOS_RPC, TEZOS_RPC) - .env("TEZOS_RPC") - ) - .addOption( - new Option("-c, --ticketer ") - .default(DUMMY_TICKET_CONTRACT, DUMMY_TICKET_CONTRACT) - .env("DUMMY_TICKET_CONTRACT") - ) + .description( + `Deposit 10 tickets on deku. So the secret needs to have some tez to pay the fees. The dummy ticket contract must have been originated on tezos` + ) + .addOption(DEKU_RPC) + .addOption(SECRET) // Share secret between deku and tezos. + .addOption(TEZOS_RPC) + .addOption(TICKETER) + .addOption(TICKET_DATA) .action(handleResult(Deposit.run)); -// TODO: withdraw, withdraw-proof, all(command which does everything) program .command("transfer") - .addOption( - new Option("-d, --dekuRpc ") - .default(DEKU_RPC, DEKU_RPC) - .env("DEKU_RPC") - ) - .addOption( - new Option("-a, --alice-secret ") - .default(ALICE_SECRET, ALICE_SECRET) - .env("ALICE_SECRET") - ) - .addOption( - new Option("-b, --bobSecret ") - .default(BOB_SECRET, BOB_SECRET) - .env("BOB_SECRET") - ) - .addOption( - new Option("-t, --ticketer ") - .default(DUMMY_TICKET_CONTRACT, DUMMY_TICKET_CONTRACT) - .env("DUMMY_TICKET_CONTRACT") - ) + .description( + `Transfer 1 ticket from alice to bob, and bob to alice. One of the secret has to have at least one ticket.` + ) + .addOption(DEKU_RPC) + .addOption(SECRET_1_WITH_TICKETS) + .addOption(SECRET_2_WITH_TICKETS) + .addOption(TICKETER) + .addOption(TICKET_DATA) .action(handleResult(Transfer.run)); +program + .command("withdraw") + .description( + "Withdraw some tickets on tezos, the secret needs some tez to pay the fees. The dummy ticket contract must have been originated" + ) + .addOption(DEKU_RPC) + .addOption(SECRET_WITH_TEZ) + .addOption(TICKETER) + .addOption(TEZOS_RPC) + .addOption(TICKET_DATA) + .action(handleResult(Withdraw.run)); + +program + .command("contract-level") + .description( + "Check if the level of the consus smart contract has been updated in the last 5 minutes." + ) + .addOption(DEKU_RPC) + .addOption(TEZOS_RPC) + .action(handleResult(ContractLevel.run)); + +program + .command("is-commiting") + .description("Check if the chain is commiting on tezos") + .addOption(DEKU_RPC) + .addOption(TEZOS_RPC) + .addOption(BLOCKS) + .action(handleResult(IsCommiting.run)); + program.parse(); diff --git a/examples/tests/src/is-commiting.ts b/examples/tests/src/is-commiting.ts new file mode 100644 index 000000000..f72f9c912 --- /dev/null +++ b/examples/tests/src/is-commiting.ts @@ -0,0 +1,35 @@ +import { DekuPClient } from "@marigold-dev/deku"; +import { RpcClient } from "@taquito/rpc"; + +const run = async ({ tezosRpc, dekuRpc, blocks }) => { + const deku = new DekuPClient({ dekuRpc }); + const { consensus } = await deku.info(); + const client = new RpcClient(tezosRpc); + // Get the last n tezos block + const lastBlocks = await Promise.all( + Array(blocks) + .fill(0) + .map((elt, i) => client.getBlock({ block: `head~${i}` })) + ); + const operations = lastBlocks + .map((block) => block.operations) // Extract the operations from the block + .flat(2) + .flatMap((operation) => operation.contents) // Extract the content of the operations + .flatMap((content) => { + // Filter operations to only keep transaction + if (content.kind === "transaction") { + return [content]; + } + return []; + }) + .filter(({ destination }) => destination === consensus) // Only transaction to the consensus are important + .filter( + ({ parameters: { entrypoint } }) => entrypoint === "update_root_hash" + ); // Only transaction from node are important + if (operations.length === 0) throw "The chain is not commiting on tezos"; + return "The chain is commiting on tezos"; +}; + +export default { + run, +}; diff --git a/examples/tests/src/is-sync.ts b/examples/tests/src/is-sync.ts index 59bd9eddc..50fe9dc97 100644 --- a/examples/tests/src/is-sync.ts +++ b/examples/tests/src/is-sync.ts @@ -1,12 +1,9 @@ import { DekuPClient } from "@marigold-dev/deku"; -const run = async ({ dekuRpc0, dekuRpc1, dekuRpc2, dekuRpc3 }) => { - const nodes = [ - new DekuPClient({ dekuRpc: dekuRpc0 }), - new DekuPClient({ dekuRpc: dekuRpc1 }), - new DekuPClient({ dekuRpc: dekuRpc2 }), - new DekuPClient({ dekuRpc: dekuRpc3 }), - ]; +const run = async ({ allDekuRpc }) => { + const nodes = allDekuRpc.map( + (dekuRpc) => new DekuPClient({ dekuRpc: dekuRpc }) + ); // get the level for each node const levels = await Promise.all(nodes.map((node) => node.level())); // Get the mean level diff --git a/examples/tests/src/options.ts b/examples/tests/src/options.ts new file mode 100644 index 000000000..9b10e02eb --- /dev/null +++ b/examples/tests/src/options.ts @@ -0,0 +1,129 @@ +import { Command, Option } from "commander"; + +type Optionnal = { + arg: string; + env: string; + description: string; + parser: (string: string) => T; + default: T; +}; + +const option = (option: Optionnal) => { + return new Option(option.arg, option.description) + .default(option.default) + .env(option.env) + .argParser(option.parser); +}; + +const dekuRpcs = [ + "https://deku-canonical-vm0.deku-v1.marigold.dev", + "https://deku-canonical-vm1.deku-v1.marigold.dev", + "https://deku-canonical-vm2.deku-v1.marigold.dev", + "https://deku-canonical-vm3.deku-v1.marigold.dev", +]; + +export const DEKU_RPC = option({ + arg: "-d, --deku-rpc ", + env: "DEKU_RPC", + description: + "The url of the deku node, if not specified it will be randomly choosen", + parser: (string) => { + const elts = string.split(","); + return elts[Math.floor(Math.random() * elts.length)]; + }, + default: dekuRpcs[Math.floor(Math.random() * dekuRpcs.length)], +}); + +export const LIGO_RPC = option({ + arg: "-l, --ligo-rpc ", + env: "LIGO_RPC", + description: "The ligo endpoint to compile ligo to michelson.", + parser: (string) => string, + default: "http://0.0.0.0:9090", +}); + +export const SECRET = option({ + arg: "-s, --secret ", + env: "USER_SECRET", + description: "A secret with no need of tez/tickets.", + parser: (string) => string, + default: "edsk3QoqBuvdamxouPhin7swCvkQNgq4jP5KZPbwWNnwdZpSpJiEbq", +}); + +export const CANONICAL_CONTRACT_ADDRESS = option({ + arg: "-a, --address
", + env: "CANONICAL_CONTRACT_ADDRESS", + description: "The address of an originated contract on deku-canonical.", + parser: (string) => string, + default: "DK1CAA1DVcxfwRgRMhXX4puag48kgfPtfkJq", +}); + +export const ALL_DEKU_RPC = option({ + arg: "-d, --all-deku-rpc ", + env: "ALL_DEKU_RPC", + description: "A list of several deku rpc separated by a comma.", + parser: (string) => string.split(","), + default: dekuRpcs, +}); + +export const TEZOS_RPC = option({ + arg: "-tz, --tezos-rpc ", + env: "TEZOS_RPC", + description: "The tezos rpc, default is ghostnet.", + parser: (string) => string, + default: "https://rpc.tzkt.io/ghostnet", +}); + +export const TICKETER = option({ + arg: "-t, --ticketer ", + env: "DUMMY_TICKET_CONTRACT", + description: + "The address of an originated dummy ticket contract, by default it will use the already orignated contract on ghostnet.", + parser: (string) => string, + default: "KT1WqDmVx6AEB4V4MFoTjSKKt9XhvvihrVJC", +}); + +export const SECRET_WITH_TEZ = option({ + arg: "-s, --secret-with-tez ", + env: "SECRET_WITH_TEZ", + description: "This secret has to have some tez, to pay tezos fees.", + parser: (string) => string, + default: + "edskRubBsVKzfE3rH7GXWb71UewQXDYd2ZDzW8818RWL9mQbRop4V8rJwcjmFRgMApJ1m7ygWPWEum4VtK2VxLokWu7iJAiDM9", +}); + +export const SECRET_1_WITH_TICKETS = option({ + arg: "-s1, --secret-1-with-tickets ", + env: "SECRET_1_WITH_TICKETS", + description: "This secret has to have some tez.", + parser: (string) => string, + default: "edsk3gHBUthmmz15K3v1AcQYw6bXv9XjARWXQV4yLJcUiHtR6MNLhG", +}); + +export const SECRET_2_WITH_TICKETS = option({ + arg: "-s2, --secret-2-with-tickets ", + env: "SECRET_2_WITH_TICKETS", + description: "This secret has to have some tez.", + parser: (string) => string, + default: "edsk43xJ9tDYyJEuSP4cAbc1xSK3zKdCh8V5yHqd1PmNFhhwM7ksH5", +}); + +export const BLOCKS = option({ + arg: "-b, --blocks ", + env: "BLOCKS", + description: "A number of block", + parser: (string) => Number.parseInt(string), + default: 5, +}); + +export const TICKET_DATA = option({ + arg: "--data ", + env: "TICKET_DATA", + description: "The data of your ticket", + parser: (string) => { + if (!string.startsWith("0x")) throw "The data should start with 0x"; + if (string.length % 2 !== 0) throw "Invalid bytes"; + return string; + }, + default: "0x0505050505", +}); diff --git a/examples/tests/src/transfer.ts b/examples/tests/src/transfer.ts index 8f7bcaf30..f399f1bb2 100644 --- a/examples/tests/src/transfer.ts +++ b/examples/tests/src/transfer.ts @@ -2,15 +2,20 @@ import { DekuPClient, fromMemorySigner } from "@marigold-dev/deku"; import { InMemorySigner } from "@taquito/signer"; import { wait } from "./utils"; -const run = async ({ dekuRpc, aliceSecret, bobSecret, ticketer }) => { - const data = "0x0505050505"; +const run = async ({ + dekuRpc, + secret1WithTickets, + secret2WithTickets, + ticketer, + data, +}) => { const ticketId = { ticketer, data }; // Instanciate deku toolkit for Alice - const aliceSigner = fromMemorySigner(new InMemorySigner(aliceSecret)); + const aliceSigner = fromMemorySigner(new InMemorySigner(secret1WithTickets)); const aliceAddr = await aliceSigner.publicKeyHash(); const dekuA = new DekuPClient({ dekuRpc, dekuSigner: aliceSigner }); // Instanciate deku toolkit for Bob - const bobSigner = fromMemorySigner(new InMemorySigner(bobSecret)); + const bobSigner = fromMemorySigner(new InMemorySigner(secret2WithTickets)); const bobAddr = await bobSigner.publicKeyHash(); const dekuB = new DekuPClient({ dekuRpc, dekuSigner: bobSigner }); // Get the previous balance of Alice and Bob @@ -33,8 +38,8 @@ const run = async ({ dekuRpc, aliceSecret, bobSecret, ticketer }) => { receiver.addr, 1, ticketer, - "0505050505" - ); + data.slice(2) + ); // TODO: "0x..." is not working in the toolkit await wait(dekuRpc, op); // Get the new balance of the sender and receiver const nextBalanceSender = await sender.deku.getBalance(sender.addr, ticketId); diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts index 0b88f3bd8..65e3ce855 100644 --- a/examples/tests/src/utils.ts +++ b/examples/tests/src/utils.ts @@ -1,3 +1,5 @@ +import { Base58 } from "@tzstamp/helpers"; + /** * Exit the program when the promise raises an exception * @param promise @@ -34,6 +36,17 @@ export const wait = async ( export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +/** + * Transform a b58 string into bytes + * @param b58 the b58 repsentation of a blake2b string + * @returns the hexadecimal representation of the hash + */ +export const toBytes = (b58) => { + const y = Base58.decode(b58); + const tmp = new Uint8Array(y.buffer).slice(0, 32 + 2); + return Buffer.from(tmp.slice(2)).toString("hex"); +}; + /** * Initial storage of the following contract */ diff --git a/examples/tests/src/withdraw.ts b/examples/tests/src/withdraw.ts new file mode 100644 index 000000000..bc7e69740 --- /dev/null +++ b/examples/tests/src/withdraw.ts @@ -0,0 +1,58 @@ +import { DekuPClient, fromMemorySigner } from "@marigold-dev/deku"; +import { InMemorySigner } from "@taquito/signer"; +import { TezosToolkit } from "@taquito/taquito"; +import Deposit from "./deposit"; +import { toBytes, wait } from "./utils"; + +const run = async ({ dekuRpc, secret, tezosRpc, ticketer, data }) => { + // Make a deposit to so that the account have some tickets + await Deposit.run({ dekuRpc, secret, tezosRpc, ticketer, data }); + + const signer = new InMemorySigner(secret); + const address = await signer.publicKeyHash(); + const dekuSigner = fromMemorySigner(signer); + const deku = new DekuPClient({ dekuRpc, dekuSigner }); + const tezos = new TezosToolkit(tezosRpc); + tezos.setSignerProvider(signer); + + // Withdraw 5 tickets + const op = await deku.withdrawTo(address, 5, ticketer, data.slice(2)); + await wait(dekuRpc, op); + // Get the proof of the withdraw + const proof = await deku.getProof(op); + // get the consensus contract + const { consensus } = await deku.info(); + const contract = await tezos.contract.at(consensus); + + // Withdraw 5 tickets + const op = await deku.withdrawTo(address, 5, ticketer, "0505050505"); + await wait(dekuRpc, op); + // Get the proof of the withdraw + const proof = await deku.getProof(op); + // get the consensus contract + const { consensus } = await deku.info(); + const contract = await tezos.contract.at(consensus); + + // Code from tzportal + const handles = proof.proof as any as Array<[string, string]>; // TODO: fix the proof type in the toolkit + + const withdrawOperation = await contract.methods + .withdraw( + `${ticketer}%burn_callback`, + proof.handle.id, + data.slice(2), + Number.parseInt(proof.handle.amount), + address, + ticketer, + toBytes(proof.withdrawal_handles_hash), + handles.map((pair) => pair.map(toBytes)) + ) + .send(); + const hash = await withdrawOperation.confirmation(3); + + return "Withdraw seems to be ok"; +}; + +export default { + run, +}; diff --git a/yarn.lock b/yarn.lock index cc559c815..9893e5a66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4988,6 +4988,14 @@ "@taquito/taquito" "^14.0.0" libsodium-wrappers "0.7.9" +"@taquito/http-utils@*", "@taquito/http-utils@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/http-utils/-/http-utils-15.0.0.tgz#b7fe912972394162705dd322605a52073670e2fb" + integrity sha512-caOofYWZzbxti1s1t3ObkRL4Ph8DpAWWY/staI1IiZJ/g/XX8FDtS71tE+IwBLXwH0kYqP0bNhTGPP04ebEHpQ== + dependencies: + "@vespaiach/axios-fetch-adapter" "^0.3.1" + axios "^0.26.0" + "@taquito/http-utils@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-13.0.1.tgz" @@ -5002,14 +5010,6 @@ dependencies: axios "^0.26.0" -"@taquito/http-utils@^15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@taquito/http-utils/-/http-utils-15.0.0.tgz#b7fe912972394162705dd322605a52073670e2fb" - integrity sha512-caOofYWZzbxti1s1t3ObkRL4Ph8DpAWWY/staI1IiZJ/g/XX8FDtS71tE+IwBLXwH0kYqP0bNhTGPP04ebEHpQ== - dependencies: - "@vespaiach/axios-fetch-adapter" "^0.3.1" - axios "^0.26.0" - "@taquito/ledger-signer@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/ledger-signer/-/ledger-signer-14.0.0.tgz" @@ -5021,6 +5021,14 @@ "@taquito/utils" "^14.0.0" buffer "^6.0.3" +"@taquito/local-forging@*", "@taquito/local-forging@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/local-forging/-/local-forging-15.0.0.tgz#d12084e4fb916e78124c181ef0b7e6181d53a678" + integrity sha512-8QLut19U03Tsm59RjrSZOlLZx5mglQjQFt5No1VzWfNsXv7mytmn8SlvqFxyt8hyTlm1RM1NdJJ1oO1h1A/BRQ== + dependencies: + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + "@taquito/local-forging@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-13.0.1.tgz" @@ -5037,13 +5045,10 @@ "@taquito/utils" "^14.0.0" bignumber.js "^9.0.2" -"@taquito/local-forging@^15.0.0": +"@taquito/michel-codec@*", "@taquito/michel-codec@^15.0.0": version "15.0.0" - resolved "https://registry.yarnpkg.com/@taquito/local-forging/-/local-forging-15.0.0.tgz#d12084e4fb916e78124c181ef0b7e6181d53a678" - integrity sha512-8QLut19U03Tsm59RjrSZOlLZx5mglQjQFt5No1VzWfNsXv7mytmn8SlvqFxyt8hyTlm1RM1NdJJ1oO1h1A/BRQ== - dependencies: - "@taquito/utils" "^15.0.0" - bignumber.js "^9.1.0" + resolved "https://registry.yarnpkg.com/@taquito/michel-codec/-/michel-codec-15.0.0.tgz#f05be1fa3811cbd2bfcb16ca2e84c602afae6824" + integrity sha512-pfnrXVSkGeeVNx7MYHTeu79iU4lGynym/7+8QbD/O28LWob8PUrwpt+jaAxsVDdNOYtKz+LO1E4FpC348tHO6Q== "@taquito/michel-codec@^13.0.1": version "13.0.1" @@ -5055,10 +5060,15 @@ resolved "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-14.0.0.tgz" integrity sha512-ftnBvUVddlHBqvQbGPHEb26KrS4lIcaZ1eIpYJWiz+akb4Pcfyq7j/OEsDZbB7Pl2FP9hqu7ZygOF34zY6Lrtw== -"@taquito/michel-codec@^15.0.0": +"@taquito/michelson-encoder@*", "@taquito/michelson-encoder@^15.0.0": version "15.0.0" - resolved "https://registry.yarnpkg.com/@taquito/michel-codec/-/michel-codec-15.0.0.tgz#f05be1fa3811cbd2bfcb16ca2e84c602afae6824" - integrity sha512-pfnrXVSkGeeVNx7MYHTeu79iU4lGynym/7+8QbD/O28LWob8PUrwpt+jaAxsVDdNOYtKz+LO1E4FpC348tHO6Q== + resolved "https://registry.yarnpkg.com/@taquito/michelson-encoder/-/michelson-encoder-15.0.0.tgz#8fc3492a22404ae8a8b1907a43bf10745e1b973b" + integrity sha512-TxmWCgZBuA7SrNPSN+xfeeovDGU5H5sXyXcgL3KwYfeILaWiWr1MbI9n8xV7ewJZSC9svor6/osz7Y04+TIpgw== + dependencies: + "@taquito/rpc" "^15.0.0" + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + fast-json-stable-stringify "^2.1.0" "@taquito/michelson-encoder@^13.0.1": version "13.0.1" @@ -5080,16 +5090,6 @@ bignumber.js "^9.0.2" fast-json-stable-stringify "^2.1.0" -"@taquito/michelson-encoder@^15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@taquito/michelson-encoder/-/michelson-encoder-15.0.0.tgz#8fc3492a22404ae8a8b1907a43bf10745e1b973b" - integrity sha512-TxmWCgZBuA7SrNPSN+xfeeovDGU5H5sXyXcgL3KwYfeILaWiWr1MbI9n8xV7ewJZSC9svor6/osz7Y04+TIpgw== - dependencies: - "@taquito/rpc" "^15.0.0" - "@taquito/utils" "^15.0.0" - bignumber.js "^9.1.0" - fast-json-stable-stringify "^2.1.0" - "@taquito/remote-signer@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/remote-signer/-/remote-signer-14.0.0.tgz" @@ -5102,6 +5102,15 @@ "@taquito/utils" "^14.0.0" typedarray-to-buffer "^4.0.0" +"@taquito/rpc@*", "@taquito/rpc@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@taquito/rpc/-/rpc-15.0.0.tgz#096ac942be0d5d3bc5f7ad4f3dbe4b15dd1d1e12" + integrity sha512-z5oPSD2QDhLqU9scA4Pof2+DUaK9P3oDWeCqr6/JAOlt1DwDwYsHj84d4UVmpjP/DrTj4Sp1IyY7I9KpNNLlGQ== + dependencies: + "@taquito/http-utils" "^15.0.0" + "@taquito/utils" "^15.0.0" + bignumber.js "^9.1.0" + "@taquito/rpc@^13.0.1": version "13.0.1" resolved "https://registry.npmjs.org/@taquito/rpc/-/rpc-13.0.1.tgz" @@ -5120,15 +5129,6 @@ "@taquito/utils" "^14.0.0" bignumber.js "^9.0.2" -"@taquito/rpc@^15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@taquito/rpc/-/rpc-15.0.0.tgz#096ac942be0d5d3bc5f7ad4f3dbe4b15dd1d1e12" - integrity sha512-z5oPSD2QDhLqU9scA4Pof2+DUaK9P3oDWeCqr6/JAOlt1DwDwYsHj84d4UVmpjP/DrTj4Sp1IyY7I9KpNNLlGQ== - dependencies: - "@taquito/http-utils" "^15.0.0" - "@taquito/utils" "^15.0.0" - bignumber.js "^9.1.0" - "@taquito/sapling@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/sapling/-/sapling-14.0.0.tgz" @@ -5235,6 +5235,20 @@ bignumber.js "^9.0.2" rxjs "^6.6.3" +"@taquito/taquito@^14.2.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@taquito/taquito/-/taquito-14.2.0.tgz#5ce737663fdb06316798a32da416fedff3696800" + integrity sha512-JrAUtANIVr02TFI6N87Xnn+KfgDT8hTA6IBeRhGfQnZH8nL1LG6/6q7uHZTw6D4ddfnMvxjgA/916cxAFcskFA== + dependencies: + "@taquito/http-utils" "*" + "@taquito/local-forging" "*" + "@taquito/michel-codec" "*" + "@taquito/michelson-encoder" "*" + "@taquito/rpc" "*" + "@taquito/utils" "*" + bignumber.js "^9.1.0" + rxjs "^6.6.3" + "@taquito/tezbridge-wallet@^14.0.0": version "14.0.0" resolved "https://registry.npmjs.org/@taquito/tezbridge-wallet/-/tezbridge-wallet-14.0.0.tgz" From 27bb044d80fe5f2bf321cca90e586b5c611acb54 Mon Sep 17 00:00:00 2001 From: Laurent Canis Date: Wed, 7 Dec 2022 16:06:19 -0500 Subject: [PATCH 12/37] refactor: prepare deku-tester to be published on npm --- examples/tests/package.json | 4 ++-- examples/tests/src/index.ts | 22 ---------------------- examples/tests/src/origination.ts | 2 +- examples/tests/src/utils.ts | 2 +- examples/tests/src/withdraw.ts | 9 --------- 5 files changed, 4 insertions(+), 35 deletions(-) diff --git a/examples/tests/package.json b/examples/tests/package.json index 04709c43d..6aafda099 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,7 +1,7 @@ { - "name": "deku-tester", + "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "1.0.0", + "version": "0.1.0", "main": "dist/index.js", "license": "MIT", "bin": { diff --git a/examples/tests/src/index.ts b/examples/tests/src/index.ts index 4071906b2..61afb5ffb 100644 --- a/examples/tests/src/index.ts +++ b/examples/tests/src/index.ts @@ -30,28 +30,6 @@ const program = new Command(); program.name("e2e tests").version("0.1.0"); -program - .command("origination") - .addOption( - new Option("-d, --dekuRpc ") - .default("http://0.0.0.0:8080", "http://0.0.0.0:8080") - .env("DEKU_RPC") - ) - .addOption( - new Option("-l, --ligoRpc ") - .default("http://0.0.0.0:9090", "http://0.0.0.0:9090") - .env("LIGO_RPC") - ) - .addOption( - new Option("-s, --secret ") - .default( - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo", - "edsk38AUrkQJ9y48wxokKWdFedQpKpnCsMLrFjvAw9ZGJ5vrqXmYCo" - ) - .env("USER_SECRET") - ) - .action(handleResult(Origination.run)); - program .command("origination") .description("Will originate a counter contract on deku.") diff --git a/examples/tests/src/origination.ts b/examples/tests/src/origination.ts index 36a8cff94..893101ee1 100644 --- a/examples/tests/src/origination.ts +++ b/examples/tests/src/origination.ts @@ -9,7 +9,7 @@ const run = async ({ dekuRpc, ligoRpc, secret }): Promise => { // Originate a contract const { operation, address } = await deku.originateLigo({ kind: "jsligo", - code, + source: code, initialStorage, }); // The operation should be included diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts index 65e3ce855..914dd189f 100644 --- a/examples/tests/src/utils.ts +++ b/examples/tests/src/utils.ts @@ -50,7 +50,7 @@ export const toBytes = (b58) => { /** * Initial storage of the following contract */ -export const initialStorage = 0; +export const initialStorage = "0"; /** * Counter example with 3 entrypoints: diff --git a/examples/tests/src/withdraw.ts b/examples/tests/src/withdraw.ts index bc7e69740..7855c987e 100644 --- a/examples/tests/src/withdraw.ts +++ b/examples/tests/src/withdraw.ts @@ -24,15 +24,6 @@ const run = async ({ dekuRpc, secret, tezosRpc, ticketer, data }) => { const { consensus } = await deku.info(); const contract = await tezos.contract.at(consensus); - // Withdraw 5 tickets - const op = await deku.withdrawTo(address, 5, ticketer, "0505050505"); - await wait(dekuRpc, op); - // Get the proof of the withdraw - const proof = await deku.getProof(op); - // get the consensus contract - const { consensus } = await deku.info(); - const contract = await tezos.contract.at(consensus); - // Code from tzportal const handles = proof.proof as any as Array<[string, string]>; // TODO: fix the proof type in the toolkit From 60ab9aa5651ae72084d7bfdf5782507eb38d012a Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Fri, 16 Dec 2022 13:10:41 -0500 Subject: [PATCH 13/37] fix: update dummy ticket address --- examples/deku-p-nodejs/index.ts | 2 +- examples/tests/src/options.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/deku-p-nodejs/index.ts b/examples/deku-p-nodejs/index.ts index e694fd89d..26d1a391e 100644 --- a/examples/deku-p-nodejs/index.ts +++ b/examples/deku-p-nodejs/index.ts @@ -19,7 +19,7 @@ const dekuSigner = fromMemorySigner( console.log("Getting the balance"); const balance = await deku.getBalance( "tz1L7zaWD1aRYBTQvSdxEdc9KDzfwG4DydDu", - { ticketer: "KT1WqDmVx6AEB4V4MFoTjSKKt9XhvvihrVJC", data } + { ticketer: "KT1KCkwGxAsFmy6jkF1owQyGkQoYVtajkeGb", data } ); console.log(`The new balance is: ${balance}`); diff --git a/examples/tests/src/options.ts b/examples/tests/src/options.ts index 9b10e02eb..b53ed3c31 100644 --- a/examples/tests/src/options.ts +++ b/examples/tests/src/options.ts @@ -80,7 +80,7 @@ export const TICKETER = option({ description: "The address of an originated dummy ticket contract, by default it will use the already orignated contract on ghostnet.", parser: (string) => string, - default: "KT1WqDmVx6AEB4V4MFoTjSKKt9XhvvihrVJC", + default: "KT1KCkwGxAsFmy6jkF1owQyGkQoYVtajkeGb", }); export const SECRET_WITH_TEZ = option({ From a499ad04fe8322a7e2372b05f7782215f3375e98 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Fri, 16 Dec 2022 13:13:39 -0500 Subject: [PATCH 14/37] chore: update npm package versions --- deku-c/client/package.json | 2 +- deku-c/deku-cli/package.json | 4 ++-- examples/deku-c-nodejs/package.json | 2 +- examples/deku-p-nodejs/package.json | 2 +- examples/deku-p-react/package.json | 2 +- examples/number-go-up/package.json | 4 ++-- examples/tests/package.json | 4 ++-- website/package.json | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/deku-c/client/package.json b/deku-c/client/package.json index ec61a2d9d..360184d74 100644 --- a/deku-c/client/package.json +++ b/deku-c/client/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku", - "version": "0.1.3", + "version": "0.1.4-rc6", "description": "Toolkit to interact with Deku in front-end applications", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/deku-c/deku-cli/package.json b/deku-c/deku-cli/package.json index f5b572fd0..babe02c64 100644 --- a/deku-c/deku-cli/package.json +++ b/deku-c/deku-cli/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku-cli", - "version": "0.0.4", + "version": "0.0.5-rc6", "description": "CLI client for Deku-C blockchain", "bin": { "deku-cli": "./dist/index.js" @@ -18,7 +18,7 @@ "author": "", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "@noble/ed25519": "^1.7.1", "@taquito/signer": "^14.0.0", "commander": "^9.4.1", diff --git a/examples/deku-c-nodejs/package.json b/examples/deku-c-nodejs/package.json index 1cf69c6b4..74c8d13d0 100644 --- a/examples/deku-c-nodejs/package.json +++ b/examples/deku-c-nodejs/package.json @@ -10,7 +10,7 @@ "author": "contact@marigold.dev", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.3" + "@marigold-dev/deku": "0.1.4-rc6" }, "devDependencies": { "@taquito/signer": "^14.0.0", diff --git a/examples/deku-p-nodejs/package.json b/examples/deku-p-nodejs/package.json index 3f748d394..138bf3899 100644 --- a/examples/deku-p-nodejs/package.json +++ b/examples/deku-p-nodejs/package.json @@ -11,7 +11,7 @@ "author": "", "license": "MIT", "dependencies": { - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "@taquito/signer": "^14.0.0", "@taquito/taquito": "^14.0.0", "axios": "^0.27.2", diff --git a/examples/deku-p-react/package.json b/examples/deku-p-react/package.json index 17431a7bf..307c1ac61 100644 --- a/examples/deku-p-react/package.json +++ b/examples/deku-p-react/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.1.3", - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "@taquito/beacon-wallet": "^13.0.1", "@taquito/signer": "^13.0.1", "@taquito/taquito": "^13.0.1", diff --git a/examples/number-go-up/package.json b/examples/number-go-up/package.json index 17fd78db4..898e3effa 100644 --- a/examples/number-go-up/package.json +++ b/examples/number-go-up/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.3.0", - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "@taquito/signer": "14.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -47,7 +47,7 @@ ] }, "devDependencies": { - "@marigold-dev/deku-cli": "0.0.4", + "@marigold-dev/deku-cli": "0.0.5-rc6", "os-browserify": "^0.3.0", "postcss-normalize": "^10.0.1", "stream-browserify": "^3.0.0", diff --git a/examples/tests/package.json b/examples/tests/package.json index 6aafda099..d951d6a75 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,14 +1,14 @@ { "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "0.1.0", + "version": "0.1.1-rc6", "main": "dist/index.js", "license": "MIT", "bin": { "deku-tester": "dist/index.js" }, "dependencies": { - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "@taquito/signer": "^14.1.0", "@taquito/taquito": "^14.2.0", "@tzstamp/helpers": "^0.3.4", diff --git a/website/package.json b/website/package.json index 5c63526ad..63bca7a8f 100644 --- a/website/package.json +++ b/website/package.json @@ -42,7 +42,7 @@ "@taquito/tzip12": "^14.0.0", "@taquito/tzip16": "^14.0.0", "@taquito/utils": "^14.0.0", - "@marigold-dev/deku": "0.1.3", + "@marigold-dev/deku": "0.1.4-rc6", "abort-controller": "^3.0.0", "algoliasearch": "^4.12.2", "axios": "^0.26.0", From a2e7606e1c3ddc4b0d053e07f0b5641d802173cf Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Fri, 16 Dec 2022 15:05:25 -0300 Subject: [PATCH 15/37] gossip: reset pending_request by timeout --- deku-p/src/core/constants/deku_constants.ml | 1 + deku-p/src/core/constants/deku_constants.mli | 1 + deku-p/src/core/gossip/gossip.ml | 27 ++++++++++++-------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/deku-p/src/core/constants/deku_constants.ml b/deku-p/src/core/constants/deku_constants.ml index 037858f3c..d1eee6741 100644 --- a/deku-p/src/core/constants/deku_constants.ml +++ b/deku-p/src/core/constants/deku_constants.ml @@ -22,3 +22,4 @@ let async_on_error exn = let genesis_time = 0.0 let trusted_cycle = Option.get (N.of_z (Z.of_int 600)) let max_payload_chunks = 32 +let request_timeout = 30.0 diff --git a/deku-p/src/core/constants/deku_constants.mli b/deku-p/src/core/constants/deku_constants.mli index 91c1a789c..b0698816a 100644 --- a/deku-p/src/core/constants/deku_constants.mli +++ b/deku-p/src/core/constants/deku_constants.mli @@ -10,3 +10,4 @@ val async_on_error : exn -> unit val genesis_time : float val trusted_cycle : N.t val max_payload_chunks : int +val request_timeout : float diff --git a/deku-p/src/core/gossip/gossip.ml b/deku-p/src/core/gossip/gossip.ml index 94bb63853..77135b4ac 100644 --- a/deku-p/src/core/gossip/gossip.ml +++ b/deku-p/src/core/gossip/gossip.ml @@ -5,7 +5,7 @@ open Message type gossip = | Gossip of { (* TODO: this is clearly not ideal *) - pending_request : bool; + pending_request : float option; message_pool : Message_pool.t; [@opaque] } @@ -15,7 +15,7 @@ let encoding = let open Data_encoding in conv (fun (Gossip { pending_request = _; message_pool }) -> message_pool) - (fun message_pool -> Gossip { pending_request = false; message_pool }) + (fun message_pool -> Gossip { pending_request = None; message_pool }) Message_pool.encoding type fragment = @@ -59,7 +59,7 @@ type action = | Gossip_fragment of { fragment : fragment } let initial = - Gossip { pending_request = false; message_pool = Message_pool.initial } + Gossip { pending_request = None; message_pool = Message_pool.initial } let broadcast_message ~content = let fragment = Message_pool.encode ~content in @@ -84,13 +84,22 @@ let send_message ~connection ~content = let send_request ~above gossip = let (Gossip { pending_request; message_pool }) = gossip in - match pending_request with - | true -> (gossip, None) - | false -> + (* TODO: This should be timestamp.t *) + let current = Unix.gettimeofday () in + let can_request = + match pending_request with + | Some time -> + let delta = current -. time in + delta >= Deku_constants.request_timeout + | None -> true + in + match can_request with + | true -> let (Request { hash = _; above = _; network }) = Request.encode ~above in - let pending_request = true in + let pending_request = Some current in let gossip = Gossip { pending_request; message_pool } in (gossip, Some network) + | false -> (gossip, None) let incoming_request ~connection ~raw_header ~raw_content = Fragment_incoming_request { connection; raw_header; raw_content } @@ -161,8 +170,6 @@ let apply ~outcome gossip = (gossip, None) let close ~until gossip = - let (Gossip { pending_request = _; message_pool }) = gossip in - (* TODO: if you had progress, you can probably request again *) - let pending_request = false in + let (Gossip { pending_request; message_pool }) = gossip in let message_pool = Message_pool.close ~until message_pool in Gossip { pending_request; message_pool } From b04b49b99a7e8dc668c8f04965fdc29605660f1d Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Fri, 16 Dec 2022 15:05:38 -0300 Subject: [PATCH 16/37] node: send max 61 blocks per request --- deku-p/src/core/bin/node/node.ml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/deku-p/src/core/bin/node/node.ml b/deku-p/src/core/bin/node/node.ml index e496c42ae..580d5b098 100644 --- a/deku-p/src/core/bin/node/node.ml +++ b/deku-p/src/core/bin/node/node.ml @@ -32,20 +32,22 @@ let write_chain ~chain node = let send_blocks ~connection ~above node = match node.indexer with | Some indexer -> - let rec send_while level = + let rec send_while acc level = let level = Level.next level in Logs.info (fun m -> m "Sending block %a at time %.3f" Level.pp level (Unix.gettimeofday ())); match Block_storage.find_block_and_votes_by_level ~level indexer with - | Some network -> + | Some network -> ( let (Network_message { raw_header; raw_content }) = network in Network_manager.send ~connection ~raw_header ~raw_content node.network; - send_while level + match acc >= 60 with + | true -> () + | false -> send_while (acc + 1) level) | None -> () in - send_while above + send_while 0 above | None -> () let rec apply_chain_actions ~sw ~env ~actions node = From b1af9fb985c03bd4d9b6d11365297a02a8d49299 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Fri, 16 Dec 2022 17:12:13 -0500 Subject: [PATCH 17/37] wip: fix: minimum block latency --- deku-p/src/core/bin/node/deku_node.ml | 1 + deku-p/src/core/chain/chain.ml | 7 ++++++- deku-p/src/core/stdlib/clock.ml | 18 ++++++++++++++++++ deku-p/src/core/stdlib/deku_stdlib.ml | 1 + deku-p/src/core/stdlib/deku_stdlib.mli | 1 + 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 deku-p/src/core/stdlib/clock.ml diff --git a/deku-p/src/core/bin/node/deku_node.ml b/deku-p/src/core/bin/node/deku_node.ml index a433b8610..15c1b186a 100644 --- a/deku-p/src/core/bin/node/deku_node.ml +++ b/deku-p/src/core/bin/node/deku_node.ml @@ -93,6 +93,7 @@ let main params style_renderer log_level = Eio_main.run @@ fun env -> Eio.Switch.run @@ fun sw -> Parallel.Pool.run ~env ~domains @@ fun () -> + Clock.init (Eio.Stdenv.clock env); Logs.info (fun m -> m "Using %d domains" domains); Logs.info (fun m -> m "Default block size: %d" default_block_size); let indexer = diff --git a/deku-p/src/core/chain/chain.ml b/deku-p/src/core/chain/chain.ml index 91ccaa79c..8f03312b2 100644 --- a/deku-p/src/core/chain/chain.ml +++ b/deku-p/src/core/chain/chain.ml @@ -117,6 +117,8 @@ let minimum_block_latency = | Some x -> Option.value ~default:0.0 (Float.of_string_opt x) | None -> 0.0 +let next_sleep_until = ref 0.0 + (* after gossip *) let apply_consensus_action chain consensus_action = let open Consensus in @@ -136,7 +138,10 @@ let apply_consensus_action chain consensus_action = in (match minimum_block_latency with | 0. -> () - | minimum_block_latency -> Unix.sleepf minimum_block_latency); + | minimum_block_latency -> + let () = Clock.sleep_until !next_sleep_until in + let now = Clock.now () in + next_sleep_until := now +. minimum_block_latency); (chain, [ Chain_fragment { fragment } ]) | Consensus_vote { level; vote } -> let content = Message.Content.vote ~level ~vote in diff --git a/deku-p/src/core/stdlib/clock.ml b/deku-p/src/core/stdlib/clock.ml new file mode 100644 index 000000000..7b4009118 --- /dev/null +++ b/deku-p/src/core/stdlib/clock.ml @@ -0,0 +1,18 @@ +(* TODO: I reaaaallly don't like having an env ref like this! + But the only better way I can think of injecting this deep inside + the chain is with effects and that would be worse. + + We could transform init to accept a continuation like Parallel.run + but I don't see why we need to.*) +let env_ref : Eio.Time.clock option ref = ref None +let init env = env_ref := Some env + +let sleep_until time = + match !env_ref with + | Some env -> Eio.Time.sleep_until env time + | None -> failwith "You must intialize the Clock module first" + +let now () = + match !env_ref with + | Some env -> Eio.Time.now env + | None -> failwith "You must initialize the Clock module first" diff --git a/deku-p/src/core/stdlib/deku_stdlib.ml b/deku-p/src/core/stdlib/deku_stdlib.ml index 46cc6b0eb..4e331adcf 100644 --- a/deku-p/src/core/stdlib/deku_stdlib.ml +++ b/deku-p/src/core/stdlib/deku_stdlib.ml @@ -6,3 +6,4 @@ module IO = Io include Let_syntax module Parallel = Parallel module List = List_ext +module Clock = Clock diff --git a/deku-p/src/core/stdlib/deku_stdlib.mli b/deku-p/src/core/stdlib/deku_stdlib.mli index 183928a66..f4975aab8 100644 --- a/deku-p/src/core/stdlib/deku_stdlib.mli +++ b/deku-p/src/core/stdlib/deku_stdlib.mli @@ -11,3 +11,4 @@ module IO = Io module Parallel = Parallel module List = List_ext +module Clock = Clock From 0291b7a2e17920de657adac39c6ac5d602f1a721 Mon Sep 17 00:00:00 2001 From: EduardoRFS Date: Sat, 17 Dec 2022 20:22:47 -0300 Subject: [PATCH 18/37] performance: store after apply --- deku-p/src/core/chain/chain.ml | 96 ++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/deku-p/src/core/chain/chain.ml b/deku-p/src/core/chain/chain.ml index 8f03312b2..a690db88a 100644 --- a/deku-p/src/core/chain/chain.ml +++ b/deku-p/src/core/chain/chain.ml @@ -44,7 +44,7 @@ type outcome = | Outcome_produce of { block : Block.t } | Outcome_apply of { block : Block.t; - votes : Verified_signature.t Key_hash.Map.t; + votes : Verified_signature.Set.t; protocol : Protocol.t; receipts : Receipt.t list; } @@ -158,9 +158,7 @@ let apply_consensus_action chain consensus_action = in *) let apply = Fragment_apply { block; votes; protocol } in let apply = Chain_fragment { fragment = apply } in - let store = Fragment_store { block; votes } in - let store = Chain_fragment { fragment = store } in - (chain, [ apply; store ]) + (chain, [ apply ]) | Consensus_request { above } -> let (Chain ({ gossip; _ } as chain)) = chain in let gossip, network = Gossip.send_request ~above gossip in @@ -317,41 +315,53 @@ let apply_protocol_produce ~block chain = let apply_protocol_apply ~identity ~current ~block ~votes ~protocol ~receipts chain = let (Chain ({ consensus; producer; _ } as chain)) = chain in - match Consensus.finished ~identity ~current ~block consensus with - | Ok (consensus, actions) -> - (* TODO: make this parallel *) - let (Block { tezos_operations; _ }) = block in - let producer = Producer.clean ~receipts ~tezos_operations producer in - let chain = Chain { chain with protocol; consensus; producer } in - - (* FIXME: need a time-based procedure for tezos commits, not block-based *) - (* FIXME: rediscuss the need to commit the previous block instead *) - (* FIXME: validators have to watch when commit did not happen *) - let (Consensus { validators; _ }) = consensus in - let current_block = Consensus.trusted_block consensus in - let (Block.Block { level = current_level; author = last_block_author; _ }) - = - current_block - in - - (* TODO: only the producer should commit on Tezos *) - let chain, actions = apply_consensus_actions chain actions in - let actions = - let level = Level.to_n current_level |> N.to_z |> Z.to_int in - let self = Identity.key_hash identity in - match level mod 15 = 0 && Key_hash.equal self last_block_author with - | true -> - let validators = Validators.to_key_hash_list validators in - commit ~current_level ~block ~votes ~validators :: actions - | false -> actions - in - (chain, actions) - | Error `No_pending_block -> - Logs.warn (fun m -> m "chain: no pending block"); - (Chain chain, []) - | Error `Wrong_pending_block -> - Logs.warn (fun m -> m "chain: wrong pending block"); - (Chain chain, []) + let chain, actions = + match Consensus.finished ~identity ~current ~block consensus with + | Ok (consensus, actions) -> + (* TODO: make this parallel *) + let (Block { tezos_operations; _ }) = block in + let producer = Producer.clean ~receipts ~tezos_operations producer in + let chain = Chain { chain with protocol; consensus; producer } in + + (* FIXME: need a time-based procedure for tezos commits, not block-based *) + (* FIXME: rediscuss the need to commit the previous block instead *) + (* FIXME: validators have to watch when commit did not happen *) + let (Consensus { validators; _ }) = consensus in + let current_block = Consensus.trusted_block consensus in + let (Block.Block + { level = current_level; author = last_block_author; _ }) = + current_block + in + + (* TODO: only the producer should commit on Tezos *) + let chain, actions = apply_consensus_actions chain actions in + let actions = + let level = Level.to_n current_level |> N.to_z |> Z.to_int in + let self = Identity.key_hash identity in + match level mod 15 = 0 && Key_hash.equal self last_block_author with + | true -> + let votes = + Verified_signature.Set.fold + (fun vote map -> + let key_hash = Verified_signature.key_hash vote in + Key_hash.Map.add key_hash vote map) + votes Key_hash.Map.empty + in + let validators = Validators.to_key_hash_list validators in + commit ~current_level ~block ~votes ~validators :: actions + | false -> actions + in + (chain, actions) + | Error `No_pending_block -> + Logs.warn (fun m -> m "chain: no pending block"); + (Chain chain, []) + | Error `Wrong_pending_block -> + Logs.warn (fun m -> m "chain: wrong pending block"); + (Chain chain, []) + in + let store = Fragment_store { block; votes } in + let store = Chain_fragment { fragment = store } in + (chain, store :: actions) let apply_store_outcome ~block ~network chain = let (Chain ({ gossip; _ } as chain)) = chain in @@ -408,13 +418,7 @@ let compute ~identity ~default_block_size fragment = Logs.warn (fun m -> m "Error while applying block: %s" (Printexc.to_string error))) errors; - let votes = - Verified_signature.Set.fold - (fun vote map -> - let key_hash = Verified_signature.key_hash vote in - Key_hash.Map.add key_hash vote map) - votes Key_hash.Map.empty - in + (* TODO: this is a workaround *) let () = Gc.major () in let () = From ae512f8b431a4c6a9d3d2c2686dadf27e548f99e Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Sat, 17 Dec 2022 18:51:39 -0500 Subject: [PATCH 19/37] fix: log domains api --- deku-p/src/core/bin/api/deku_api.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/deku-p/src/core/bin/api/deku_api.ml b/deku-p/src/core/bin/api/deku_api.ml index 661df5f03..dc9ca3f9b 100644 --- a/deku-p/src/core/bin/api/deku_api.ml +++ b/deku-p/src/core/bin/api/deku_api.ml @@ -201,6 +201,7 @@ let main params style_renderer log_level = Eio_main.run @@ fun env -> Eio.Switch.run @@ fun sw -> Parallel.Pool.run ~env ~domains @@ fun () -> + Logs.info (fun m -> m "Using %d domains" domains); let net = Eio.Stdenv.net env in let clock = Eio.Stdenv.clock env in let domains = Eio.Stdenv.domain_mgr env in From f7559a3268d4c1e5dd88d2c1d0bd580ba2daaed9 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Sat, 17 Dec 2022 17:33:49 -0500 Subject: [PATCH 20/37] wip: preprod config and disable other networks wip: decrease latency wip: disable deploy-rs check for faster deploys wip: increase block size wip: increase latency wip: latency 1 second wip: increase api domains wip: changing latency and block size --- networks/betanets/fleet.nix | Bin 4507 -> 4516 bytes networks/betanets/testnet_preprod/network.nix | Bin 1718 -> 1720 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/networks/betanets/fleet.nix b/networks/betanets/fleet.nix index 940909e6c2debafa0735541d2684f2f1ce08e912..f04f035e0d21c0c664d27009b26319f14fbf5462 100644 GIT binary patch literal 4516 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 CkFHe! literal 4507 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 diff --git a/networks/betanets/testnet_preprod/network.nix b/networks/betanets/testnet_preprod/network.nix index a14929a221eff7d6a2f0ee93035822a708c8bda2..c77524f35d40b917eb5fe0433c07969a50e3818b 100644 GIT binary patch literal 1720 zcmV;p21oe-M@dveQdv+`03OC=p;%>LxUz})UbYb>cm)b zFmTN}5*TF1`znv|wd6Vc%s8hk)77Vw3u=YKd4xlBQ6ltYmK%9PjO+ZOBR%~JOD?mE z-cw+^Qe<4C@1%_u;fSl&UBeF2=mX9y=w%`ZP|R!0&nMaZAGAgRE?r}_d~SESOC1CK z#PV6?-kWzFnox*RYg~r;L%FJ=C5k*;+p7Rs_c1+DU<&RzcXkw+mqst;k~^<52Jk(? zm-|NyhUZ)5_dsq%&ENL5%rcHrIrJh)jvbhY{S@3w7`_Tl6GP1T!aJ*-T2R=n6xVfk z-1gOY0lF)pqvq|coT97$j3JN1i#z8z;_nnIX$lP5EOo(ytz6tA{Lhs!knH!Eu3v)k zd?&(j=y^ONAC5jg0`3F6$YDi;eGNY>ywh=~sR)THa8Yu)J>8EmQw|PkX&_3t`8<0L!b7jVkrgH{mG7VfZ*glwEf3AXOyvN%X zvz3rib0sEU>=nrLduDkGVRuThjkxIiAeXGvgIT@fMy#n-Bx#EAJy=F&^sv|SujxD$ zQXkL3dD$`|;8MD=Z*&II(+gmQws8-5EP8eK-yE-ahOa9E&`Fr$#rRN)353JRPBPjx zKS!Ll6Jp6-3n^(JXa2 z+oD>3Xu`7V%EOadQo=4!5UeA!h)0^t)0_@2zhVhmba)cUZ9JjQuK|0i#yZRZlnC}+ z2@@)PczJ@n!>e3dkB3u%5c7^0s2mZ1%wEtz*G!>FR%{b#AiX`%Sp8+9x z;{33ID<(`)vEFIO;%RE? zv&Xfu6J&z}@TPsM>VVHg%$j%by&n)nxH#{g9PcK)F+*F4#RQj-@I*515_iFe;>g{4NBbPT=BAU zZuO4xus|xug1m^y-sK&WBlq*ClZZgfCyL+J7}f@|bxEy$qhcWW>kM!0M=tDc*;vrk z^ehw*&55#=wmTQ<4nwaxdya)i|Mqz)`{UsR-s8}4 zM(Wv>9FvkjyD0=)^kA7e6j~VK^yqabzY%c4<_li&3NyrQg}VTJCi}>}zS1%%bL}#^ z|Busmi2lU;?EB55eaQc&pgcL(whi2)nmhOZ@Y1XVAJ3murSws9pAeb_g`SRc$6D`?fycDxH$J-v0v-y3%r zuzzxIQb~nlc#jjBhmc62wm`ps Oi7V{4&h)cWw#y1NvlMM1g8sLV{^cHtF!auc zprG8CKO0S1UT*C7fURTFSHbkhMoY#hS))Mif~T&U(x-5Bm?As|7yXLvFG0b^&aPo^ zbC^`5j!ZUMdZF~eIYQg05(F04ZIv2VpDg}%eVWAHbqTcWDmO!#>A(4J{v?R)XEmE+ zd3>&KWemzf68n6w7qAE&l8b6VOaAH~eYrJ99(Sw`uKV{g+n{r?utHPJ{!hUs z4{~GKFn#)f3hg6?;#y`6u+iP$Q{tOEcnkq(jN#4e5VOH)(P^;u#R-;RXQb0HZAyi9 zR#Ro=1l+|OqaLql0%N^N*_IZ97qh&T*&=?|nc_f0pDDB_mAwZT^=^4A&HFs_pdO5BIlX7uQJnP;5IO?}J1*)uP4uSJ-4sPyObN06w%Vx&jL`4+8o` zbnpor5H=9=a#U8}yO07=UCq+$o98^Ep4QBj32>B-w1!l;2}->g190!2 zLe$WIGxx2!RwW?^C;sVkd&^EW{JpUi`2U={FNU3j)1=}O?ph3=QC}T6$ZC002wqjH0O^Jb4U4!}X3&b`_hp74Y?Xe!O6FozZ zk9aPx>oZp-Xj{=Y+4FB{+Ry1CIzyl0@01?NpxjAQj+qm1#GB8BJ9@NJeOV=kbw>#4 zduP57eRC)J-S3{7T@EB;qk1>aDEb7sLH$>3KpY$F)0J+`GX>?d<7Ld9o^NHEPH=Sc zQr>@UC`=PXemZ>g+kXqMxB0OrZqlp=l+FFyfg%K}Q>xz)YG?M;T!oZmX_?$km4fWo zRq`aHWEb7GFR9;+NDWW$rn3<&qG(n~e%);*$w(s877gJDBaP7A;61KWWY+USo@Ypa zAOxQkYgBKzCkUX9{l=r>v|39bE~RL#x|9SlQV>qZoLo}uHNPXcbTZ-vW)zGsK`n|2}ub?R3jfy!Y`;QV zx{6lOA@C;b#qugWByhJ%AlaD!%j+fl=C zjScOQyAJv_g+NX0DJ7z>-rEA@6AcyI)tZsaE1@zXge1A*zReqWWk+zYAdoO${9?GV zbNNs(fcKe^UErgege#~D_e-5%k0|d1<4!1#z%M;*zidXxoDyj`>D|Kuf&FhwHj%~m zucS~PQo6MSpj5Nuki+l*dMhIe2}VrRiLP-%!1zh4R+zE{B5`W#8}0+Kru<2{A+4aG Date: Mon, 19 Dec 2022 09:06:06 -0500 Subject: [PATCH 21/37] wip: decrease latency --- networks/betanets/testnet_preprod/network.nix | Bin 1720 -> 1719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/networks/betanets/testnet_preprod/network.nix b/networks/betanets/testnet_preprod/network.nix index c77524f35d40b917eb5fe0433c07969a50e3818b..c59f4ac785dae6945adb1dffd5234f7128afd739 100644 GIT binary patch literal 1719 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 Oi7V{4&h)c Date: Mon, 19 Dec 2022 19:01:12 -0500 Subject: [PATCH 22/37] Configuration: final conf for RC6 --- networks/betanets/deku_c/network.nix | Bin 1735 -> 1735 bytes networks/betanets/fleet.nix | Bin 4516 -> 4507 bytes networks/betanets/testnet_preprod/network.nix | Bin 1719 -> 1719 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/networks/betanets/deku_c/network.nix b/networks/betanets/deku_c/network.nix index acf51b4159f1333775f2aa12724651a1dde9990a..b75d6a7b473d7de64bcac2f9b95ae2005fe99443 100644 GIT binary patch literal 1735 zcmV;&1~~ZuM@dveQdv+`0P@Vdnn1AG#Y}cAJsaz>Tu5RBc5D zIwNmxu79PIz0?7p1L^-=BS>loT!*xTzBG*h6C zTpdm6;TIO3VhJzGD@)mpJR#G8vO2`58qH?Y^!YCU3-;#T77^Ls(XF9bJ>x$r%adEZ z$kX+fCYV9+&9RBQmTumlESvnDgXz#4umpCrXbE}rZNkU}8TR6Ink>Fx?nS4Z*j4Lw zs!3Ts9uomK3q^>n?Zb|(?OrN=J%{AP`wHzJEhs7Opc#IOAUkr#&PVTEDe&76Wj)_c zE)xA9S8poictjy2Q6A+|`9 zK9YU6^nlAQu=!m`I$5ZQprdbUnpN4xDnO! z+DVexrXT$bYucWxz^@aa2H2T8JDW5Pv83Us+opG_XVV}%XD(oqC) z5JI>#H}1B~MDiuNEDBoZT{Zbes{T8L@vsC9uLGHp{%Fn%gCB}N2IaW%+HDV z%t)*-b?e=7JOb?Wc0Uh+s|)?2U2NJr@bM<8npr71Fr;9F8) zK^DijQd0mwm`}An#m^rCh1!kIw!GRtVB#a6(n*_pz|*gY$2G5-?|ar|Si8>Q65?k+ z5j1vyTGo>@@-?40So~gEwCVu8Nw7=oyIMj+F9V+1KFlUS1Hwmfm2eLi#dV!r-+u$a zOfy+IH*?WCMJ`U0`V|3*$+NV4_@gA_4l`RHCgEw#B7?e$gEK<{vneGn$BW0b*Vs@~ ze|ON0Ktg;wMV9El)bL(3C~%shcahd-{}6ZTm8ZawdsGSBg+N>_IbF5lnEJ_i_k>%| zqZhcD9E$fvQ*NjKe7CW5Z%)i?$8qqD#sfJg4JXwV!3QA&+Gr@4mLaQt0+ToS2lA1D z=728c0&V`}hqhJX_B#wJVws1)puz~8JPe0DHO^Whm}K*#O(KRNJGs&2O3?7meO8-% z{?|8gnKi%JijovDbHS^K6vR1}lM)#N4f$sCjkYxN1RW;k8Wh_Dw%8?#0;L{+y66l*k;LiN!+2` zjBk2}(MYR@sc@K%el?U4STYpbIUrbzTV4R1G|5&^&iBTRX)R6Zl=9W-JPS|9A0WQ# z@9!!isaElyR%TO3l`uaD43xZVYOQ5yAR3`*`tWNfMs7HIxnkz9@3)kiORHz!H}eiT zJBwry5b?P2*3l^SsM|HHN_ftT9&hf<+k3(HL-g<3n0rwg?Uc?vQ43NU|FX%75o5lh zI=<|@gcP2rt*NduHXVEnqZzj&6+cMAPWo6IO7{A?r-xHW;CirQ-yO4X08dnoIZ-1w-rW5nh{|e&9o??S?l;ONu}`Ibe@E8u{pnb{;$2O7%lht;Nd?r_f50l7npr zsZGq8qC3nkylxUk_=EJqsf2?ek=GJ2@_&f5x`ipss6Si#a;xDVg4j>gx<2#+9{mnp dE6;)3HjckMMJ@`4paFz1&)RY!lmR-n%$-noQ&Io` literal 1735 zcmV;&1~~ZuM@dveQdv+`08CfNyq@oGe&>M(`d*Zn$yLotlPrglmgTyY7U;LkNDA0h zd-Pl{Temmwu(lI5xG;&#zAR_{jXlfOxbnCH_FgC^NXPBY$iAe3M*ljCV3p^(?EUjn z-J$Hb-uy9XURmV?2lkQL%xMWA=4zikB=b7`z^YF?ld{?iiNC$r!g4#=pIvvIacnwk z927WEBSs;!O;MH>=z5dXk`7jG1mtWH$~v8TIox(7w(U; zT%cH8e(^SyC@OM+O8lg` z&yzm(LEwpZv)r)v;Dc)RQ8;9J9eUux>z|z3CH@YY@ZbdnzZ>T0l-sI@38#WI=Ty9_xL`*CC4ifYC?KEVlP*}L9&$Zd0tw7i^qP6 zXc1*3YY!~vlPS~PHuu`0{`i_ix@R+?`a2n)Q=;Fm)6b=!DRnV>b0C0OIP9&h^XWVE zp7W(W`*+)RC;X+N)32$`WS>4R6a={|w2^d}2DRR+A2TJ_OgEZ7{gepgX1r{_s`&_l zO=nLcd4u)MW-!q;;DDTauc&vG8ngVtOtSrF=>;B*KH=Fa8vh{EE z9+_mnTx+^L+fC(_-}Z;fH?z-Ag=d6W`6FzxtD_)T#!>PgIUR)c-#iA3Y|wz#}Zn}II`Qfj%(b~fMsGq z1r(N9er92biZ+$MF#_kQmKUl!;hh0=AYad=Ztm^}VQ&5He*sPO>th!YK$CyK8 d8dPx<+WfL%mA!K~8JTeKLCoz3a`|K*925dVY>5B> diff --git a/networks/betanets/fleet.nix b/networks/betanets/fleet.nix index f04f035e0d21c0c664d27009b26319f14fbf5462..940909e6c2debafa0735541d2684f2f1ce08e912 100644 GIT binary patch literal 4507 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 literal 4516 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 CkFHe! diff --git a/networks/betanets/testnet_preprod/network.nix b/networks/betanets/testnet_preprod/network.nix index c59f4ac785dae6945adb1dffd5234f7128afd739..5601635f8b2bcf44f535dbc77de7d0549e4613e7 100644 GIT binary patch literal 1719 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 Date: Mon, 19 Dec 2022 19:10:34 -0500 Subject: [PATCH 23/37] Release: RC to release --- deku-c/client/package.json | 2 +- deku-c/deku-cli/package.json | 4 ++-- examples/deku-c-nodejs/package.json | 2 +- examples/deku-p-nodejs/package.json | 2 +- examples/deku-p-react/package.json | 2 +- examples/number-go-up/package.json | 4 ++-- examples/tests/package.json | 4 ++-- website/package.json | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/deku-c/client/package.json b/deku-c/client/package.json index 360184d74..415871b3e 100644 --- a/deku-c/client/package.json +++ b/deku-c/client/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku", - "version": "0.1.4-rc6", + "version": "0.1.4", "description": "Toolkit to interact with Deku in front-end applications", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/deku-c/deku-cli/package.json b/deku-c/deku-cli/package.json index babe02c64..b5894db54 100644 --- a/deku-c/deku-cli/package.json +++ b/deku-c/deku-cli/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku-cli", - "version": "0.0.5-rc6", + "version": "0.1.4", "description": "CLI client for Deku-C blockchain", "bin": { "deku-cli": "./dist/index.js" @@ -18,7 +18,7 @@ "author": "", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "@noble/ed25519": "^1.7.1", "@taquito/signer": "^14.0.0", "commander": "^9.4.1", diff --git a/examples/deku-c-nodejs/package.json b/examples/deku-c-nodejs/package.json index 74c8d13d0..e19fcac49 100644 --- a/examples/deku-c-nodejs/package.json +++ b/examples/deku-c-nodejs/package.json @@ -10,7 +10,7 @@ "author": "contact@marigold.dev", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.4-rc6" + "@marigold-dev/deku": "0.1.4" }, "devDependencies": { "@taquito/signer": "^14.0.0", diff --git a/examples/deku-p-nodejs/package.json b/examples/deku-p-nodejs/package.json index 138bf3899..5f385ef22 100644 --- a/examples/deku-p-nodejs/package.json +++ b/examples/deku-p-nodejs/package.json @@ -11,7 +11,7 @@ "author": "", "license": "MIT", "dependencies": { - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "@taquito/signer": "^14.0.0", "@taquito/taquito": "^14.0.0", "axios": "^0.27.2", diff --git a/examples/deku-p-react/package.json b/examples/deku-p-react/package.json index 307c1ac61..1e30f16ba 100644 --- a/examples/deku-p-react/package.json +++ b/examples/deku-p-react/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.1.3", - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "@taquito/beacon-wallet": "^13.0.1", "@taquito/signer": "^13.0.1", "@taquito/taquito": "^13.0.1", diff --git a/examples/number-go-up/package.json b/examples/number-go-up/package.json index 898e3effa..221c59e71 100644 --- a/examples/number-go-up/package.json +++ b/examples/number-go-up/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.3.0", - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "@taquito/signer": "14.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -47,7 +47,7 @@ ] }, "devDependencies": { - "@marigold-dev/deku-cli": "0.0.5-rc6", + "@marigold-dev/deku-cli": "0.1.4", "os-browserify": "^0.3.0", "postcss-normalize": "^10.0.1", "stream-browserify": "^3.0.0", diff --git a/examples/tests/package.json b/examples/tests/package.json index d951d6a75..59e961d35 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,14 +1,14 @@ { "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "0.1.1-rc6", + "version": "0.1.4", "main": "dist/index.js", "license": "MIT", "bin": { "deku-tester": "dist/index.js" }, "dependencies": { - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "@taquito/signer": "^14.1.0", "@taquito/taquito": "^14.2.0", "@tzstamp/helpers": "^0.3.4", diff --git a/website/package.json b/website/package.json index 63bca7a8f..b7da10639 100644 --- a/website/package.json +++ b/website/package.json @@ -42,7 +42,7 @@ "@taquito/tzip12": "^14.0.0", "@taquito/tzip16": "^14.0.0", "@taquito/utils": "^14.0.0", - "@marigold-dev/deku": "0.1.4-rc6", + "@marigold-dev/deku": "0.1.4", "abort-controller": "^3.0.0", "algoliasearch": "^4.12.2", "axios": "^0.26.0", From acf9e22639e299a9094da1edfcfa85accaed1780 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Mon, 19 Dec 2022 21:01:39 -0500 Subject: [PATCH 24/37] bump package versions --- deku-c/client/package.json | 2 +- deku-c/deku-cli/package.json | 4 ++-- examples/deku-c-nodejs/package.json | 2 +- examples/deku-p-nodejs/package.json | 2 +- examples/deku-p-react/package.json | 2 +- examples/number-go-up/package.json | 4 ++-- examples/tests/package.json | 4 ++-- package.json | 1 + website/package.json | 2 +- 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/deku-c/client/package.json b/deku-c/client/package.json index 415871b3e..97d3a3c37 100644 --- a/deku-c/client/package.json +++ b/deku-c/client/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku", - "version": "0.1.4", + "version": "0.1.5", "description": "Toolkit to interact with Deku in front-end applications", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/deku-c/deku-cli/package.json b/deku-c/deku-cli/package.json index b5894db54..47599dbe0 100644 --- a/deku-c/deku-cli/package.json +++ b/deku-c/deku-cli/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku-cli", - "version": "0.1.4", + "version": "0.1.5", "description": "CLI client for Deku-C blockchain", "bin": { "deku-cli": "./dist/index.js" @@ -18,7 +18,7 @@ "author": "", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "@noble/ed25519": "^1.7.1", "@taquito/signer": "^14.0.0", "commander": "^9.4.1", diff --git a/examples/deku-c-nodejs/package.json b/examples/deku-c-nodejs/package.json index e19fcac49..e47c6b8dd 100644 --- a/examples/deku-c-nodejs/package.json +++ b/examples/deku-c-nodejs/package.json @@ -10,7 +10,7 @@ "author": "contact@marigold.dev", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.4" + "@marigold-dev/deku": "0.1.5" }, "devDependencies": { "@taquito/signer": "^14.0.0", diff --git a/examples/deku-p-nodejs/package.json b/examples/deku-p-nodejs/package.json index 5f385ef22..ef8e79519 100644 --- a/examples/deku-p-nodejs/package.json +++ b/examples/deku-p-nodejs/package.json @@ -11,7 +11,7 @@ "author": "", "license": "MIT", "dependencies": { - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "@taquito/signer": "^14.0.0", "@taquito/taquito": "^14.0.0", "axios": "^0.27.2", diff --git a/examples/deku-p-react/package.json b/examples/deku-p-react/package.json index 1e30f16ba..68c77dfbc 100644 --- a/examples/deku-p-react/package.json +++ b/examples/deku-p-react/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.1.3", - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "@taquito/beacon-wallet": "^13.0.1", "@taquito/signer": "^13.0.1", "@taquito/taquito": "^13.0.1", diff --git a/examples/number-go-up/package.json b/examples/number-go-up/package.json index 221c59e71..0cd5bcc0e 100644 --- a/examples/number-go-up/package.json +++ b/examples/number-go-up/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.3.0", - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "@taquito/signer": "14.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -47,7 +47,7 @@ ] }, "devDependencies": { - "@marigold-dev/deku-cli": "0.1.4", + "@marigold-dev/deku-cli": "0.1.5", "os-browserify": "^0.3.0", "postcss-normalize": "^10.0.1", "stream-browserify": "^3.0.0", diff --git a/examples/tests/package.json b/examples/tests/package.json index 59e961d35..0cd5928b0 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,14 +1,14 @@ { "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "0.1.4", + "version": "0.1.5", "main": "dist/index.js", "license": "MIT", "bin": { "deku-tester": "dist/index.js" }, "dependencies": { - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "@taquito/signer": "^14.1.0", "@taquito/taquito": "^14.2.0", "@tzstamp/helpers": "^0.3.4", diff --git a/package.json b/package.json index ae1fec72f..04b2a4532 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "scripts": { "build:client": "yarn --cwd deku-c/client build", "build:cli": "yarn --cwd deku-c/deku-cli build", + "build:tests": "yarn --cwd examples/tests build", "start:deku-p-react": "yarn --cwd examples/deku-p-react start" } } diff --git a/website/package.json b/website/package.json index b7da10639..fa650cd7b 100644 --- a/website/package.json +++ b/website/package.json @@ -42,7 +42,7 @@ "@taquito/tzip12": "^14.0.0", "@taquito/tzip16": "^14.0.0", "@taquito/utils": "^14.0.0", - "@marigold-dev/deku": "0.1.4", + "@marigold-dev/deku": "0.1.5", "abort-controller": "^3.0.0", "algoliasearch": "^4.12.2", "axios": "^0.26.0", From fee4adc8c891f69a12cb23f013a884e4dbffda17 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Mon, 19 Dec 2022 21:06:18 -0500 Subject: [PATCH 25/37] update number-go-up contract --- examples/number-go-up/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/number-go-up/src/App.tsx b/examples/number-go-up/src/App.tsx index 385f67c67..1c9344b74 100644 --- a/examples/number-go-up/src/App.tsx +++ b/examples/number-go-up/src/App.tsx @@ -2,7 +2,7 @@ import { DAppClient, NetworkType } from "@airgap/beacon-sdk"; import { Contract, DekuCClient } from "@marigold-dev/deku"; import { fromBeaconSigner } from "@marigold-dev/deku"; import { useEffect, useState } from "react"; -const contractAddr = "DK1APjGycpfyE94s6MxGXUSaP7Qnznz7TrqX"; +const contractAddr = "DK1Nzaoym3o6LXxLGsbQwTDi3ZYPHMUiNTE5"; const apiURL = "https://deku-canonical-vm0.deku-v1.marigold.dev"; const connectBeaconWallet = async () => { From 2c529aa253445d8bdeaf1367b871c7499d1a77a2 Mon Sep 17 00:00:00 2001 From: Daniel Hines Date: Mon, 19 Dec 2022 21:18:48 -0500 Subject: [PATCH 26/37] update docs default contract address --- docs/Deku-Canonical/dekuc_quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Deku-Canonical/dekuc_quickstart.md b/docs/Deku-Canonical/dekuc_quickstart.md index fdc81fd90..126e4e699 100644 --- a/docs/Deku-Canonical/dekuc_quickstart.md +++ b/docs/Deku-Canonical/dekuc_quickstart.md @@ -128,7 +128,7 @@ DK1 address of the contract you deployed above. ```js live noInline const code = { source: incrementLigoCode, kind: "jsligo" }; -const myContract = dekuC.contract("DK14bVHNFE7QMQtQ8qdscz7w88RDsWoj7gqJ", code); // 👈 Replace with your contract address +const myContract = dekuC.contract("DK1RJcZYhsgPeW8uQmyaSSP2syTJNsz8pv54", code); // 👈 Replace with your contract address println("Getting contract state..."); myContract From e20946a46a181e065b9b8886fa85d46f5f4f2e7a Mon Sep 17 00:00:00 2001 From: Zett98 Date: Fri, 16 Dec 2022 16:40:33 +0100 Subject: [PATCH 27/37] fix booleans --- deku-c/wasm-vm-ocaml/imports.ml | 69 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/deku-c/wasm-vm-ocaml/imports.ml b/deku-c/wasm-vm-ocaml/imports.ml index 06b8b392f..3558289b5 100644 --- a/deku-c/wasm-vm-ocaml/imports.ml +++ b/deku-c/wasm-vm-ocaml/imports.ml @@ -1,3 +1,5 @@ +exception Type_error + module FuncType = struct open Wasm @@ -7,8 +9,6 @@ module FuncType = struct let func (name, typ, f) = (name, Instance.ExternFunc (Func.alloc_host typ f)) end -exception Type_error - let ppt (t, _) = print_endline @@ Format.sprintf "Error occurs here: %d\n" t module Vec = struct @@ -21,7 +21,11 @@ module Vec = struct type t = { mutable counter : Int64.t; contents : Value.t Table.t } - let empty = { counter = Int64.min_int; contents = Table.create 4000 } + let empty = + let table = Table.create 4000 in + Table.replace table 0L (Value.Bool 0); + Table.replace table 1L (Value.Bool 1); + { counter = Int64.min_int; contents = table } let alloc t item = let counter = t.counter in @@ -33,12 +37,20 @@ module Vec = struct let value = Table.find_opt t.contents idx in match value with | Some x -> - Table.remove t.contents idx; + (match x with Value.Bool _ -> () | _ -> Table.remove t.contents idx); x | None -> ppt (__LINE_OF__ ()); raise Type_error + let read t idx = + let value = Table.find_opt t.contents idx in + match value with + | Some x -> x + | None -> + ppt (__LINE_OF__ ()); + raise Type_error + let dup t idx = let value = Table.find_opt t.contents idx in match value with @@ -104,6 +116,8 @@ open Syntax let reset () = Vec.Table.clear vec.contents; + Vec.Table.replace vec.contents 0L (Value.Bool 0); + Vec.Table.replace vec.contents 1L (Value.Bool 1); vec.counter <- Int64.min_int let car = @@ -454,8 +468,7 @@ let neq = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(not @@ equal zero x) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(not @@ equal zero x) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -470,8 +483,7 @@ let eq = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(equal x zero) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(equal x zero) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -486,8 +498,7 @@ let gt = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(gt x zero) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(gt x zero) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -502,8 +513,7 @@ let ge = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(geq x zero) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(geq x zero) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -518,8 +528,7 @@ let lt = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(lt x zero) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(lt x zero) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -534,8 +543,7 @@ let le = match args with | Wasm.Values.[ Num (I64 x) ] -> let x = Vec.get_and_remove vec x %-< int in - let result = if Z.(leq x zero) then Bool 1 else Bool 0 in - let result = Vec.alloc vec result in + let result = if Z.(leq x zero) then 1L else 0L in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -543,8 +551,8 @@ let le = let or_ = let or_ = function - | Bool x, Bool y -> Bool (x lor y) - | Int x, Int y -> Int Z.(x lor y) + | Bool x, Bool y -> x lor y |> Int64.of_int + | Int x, Int y -> Int Z.(x lor y) |> Vec.alloc vec | _ -> ppt (__LINE_OF__ ()); raise Type_error @@ -559,7 +567,6 @@ let or_ = let x = Vec.get_and_remove vec x in let y = Vec.get_and_remove vec y in let result = or_ (x, y) in - let result = Vec.alloc vec result in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -651,8 +658,8 @@ let map_ = let xor_ = let xor_ = function - | Bool x, Bool y -> Bool (x lxor y) - | Int x, Int y -> Int Z.(x lxor y) + | Bool x, Bool y -> x lxor y |> Int64.of_int + | Int x, Int y -> Int Z.(x lxor y) |> Vec.alloc vec | _ -> ppt (__LINE_OF__ ()); raise Type_error @@ -667,7 +674,6 @@ let xor_ = let x = Vec.get_and_remove vec x in let y = Vec.get_and_remove vec y in let result = xor_ (x, y) in - let result = Vec.alloc vec result in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -675,8 +681,8 @@ let xor_ = let and_ = let and_ = function - | Bool x, Bool y -> Bool (x land y) - | Int x, Int y -> Int Z.(x land y) + | Bool x, Bool y -> x land y |> Int64.of_int + | Int x, Int y -> Int Z.(x land y) |> Vec.alloc vec | _ -> ppt (__LINE_OF__ ()); raise Type_error @@ -691,7 +697,6 @@ let and_ = let x = Vec.get_and_remove vec x in let y = Vec.get_and_remove vec y in let result = and_ (x, y) in - let result = Vec.alloc vec result in wasm_i64 result | _ -> ppt (__LINE_OF__ ()); @@ -705,10 +710,9 @@ let not = Wasm.Instance.burn_gas !inst 100L; match args with | Wasm.Values.[ Num (I64 x) ] -> - let x = Vec.get_and_remove vec x %-< bool in - let result = Bool (if Int.equal 0 x then 1 else 0) in - let result = Vec.alloc vec result in - wasm_i64 result + let x = Vec.read vec x %-< bool in + let result = if Int.equal 0 x then 1 else 0 in + wasm_i64 (Int64.of_int result) | _ -> ppt (__LINE_OF__ ()); raise Type_error ) @@ -1116,7 +1120,8 @@ let deref_bool = Wasm.Instance.burn_gas !inst 100L; match args with | Wasm.Values.[ Num (I64 x) ] -> - let x = Vec.get_and_remove vec x %-< bool in + Format.printf "arg %Ld" x; + let x = Vec.read vec x %-< bool in wasm_i32 @@ Int32.of_int x | _ -> ppt (__LINE_OF__ ()); @@ -1486,7 +1491,7 @@ let true_ = fun inst args -> Wasm.Instance.burn_gas !inst 100L; match (args : Wasm.Values.value list) with - | [] -> wasm_i64 (Vec.alloc vec (Bool 1)) + | [] -> wasm_i64 1L | _ -> ppt (__LINE_OF__ ()); raise Type_error ) @@ -1498,7 +1503,7 @@ let false_ = fun inst args -> Wasm.Instance.burn_gas !inst 100L; match (args : Wasm.Values.value list) with - | [] -> wasm_i64 (Vec.alloc vec (Bool 0)) + | [] -> wasm_i64 0L | _ -> ppt (__LINE_OF__ ()); raise Type_error ) From b9f90f9983ffabb7a556626638028ba2d4e1c1a9 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 20 Dec 2022 17:17:07 +0100 Subject: [PATCH 28/37] revert: Eio.Time to Unix.sleepf --- deku-p/src/core/bin/node/deku_node.ml | 1 - deku-p/src/core/chain/chain.ml | 9 +++++---- deku-p/src/core/stdlib/clock.ml | 18 ------------------ deku-p/src/core/stdlib/deku_stdlib.ml | 1 - deku-p/src/core/stdlib/deku_stdlib.mli | 1 - 5 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 deku-p/src/core/stdlib/clock.ml diff --git a/deku-p/src/core/bin/node/deku_node.ml b/deku-p/src/core/bin/node/deku_node.ml index 15c1b186a..a433b8610 100644 --- a/deku-p/src/core/bin/node/deku_node.ml +++ b/deku-p/src/core/bin/node/deku_node.ml @@ -93,7 +93,6 @@ let main params style_renderer log_level = Eio_main.run @@ fun env -> Eio.Switch.run @@ fun sw -> Parallel.Pool.run ~env ~domains @@ fun () -> - Clock.init (Eio.Stdenv.clock env); Logs.info (fun m -> m "Using %d domains" domains); Logs.info (fun m -> m "Default block size: %d" default_block_size); let indexer = diff --git a/deku-p/src/core/chain/chain.ml b/deku-p/src/core/chain/chain.ml index a690db88a..7943c6b75 100644 --- a/deku-p/src/core/chain/chain.ml +++ b/deku-p/src/core/chain/chain.ml @@ -117,7 +117,7 @@ let minimum_block_latency = | Some x -> Option.value ~default:0.0 (Float.of_string_opt x) | None -> 0.0 -let next_sleep_until = ref 0.0 +let last_sleep : float ref = ref @@ Unix.gettimeofday () (* after gossip *) let apply_consensus_action chain consensus_action = @@ -139,9 +139,10 @@ let apply_consensus_action chain consensus_action = (match minimum_block_latency with | 0. -> () | minimum_block_latency -> - let () = Clock.sleep_until !next_sleep_until in - let now = Clock.now () in - next_sleep_until := now +. minimum_block_latency); + let now = Unix.gettimeofday () in + let sleep = minimum_block_latency -. (now -. !last_sleep) in + if sleep > 0.0 then Unix.sleepf sleep; + last_sleep := Unix.gettimeofday ()); (chain, [ Chain_fragment { fragment } ]) | Consensus_vote { level; vote } -> let content = Message.Content.vote ~level ~vote in diff --git a/deku-p/src/core/stdlib/clock.ml b/deku-p/src/core/stdlib/clock.ml deleted file mode 100644 index 7b4009118..000000000 --- a/deku-p/src/core/stdlib/clock.ml +++ /dev/null @@ -1,18 +0,0 @@ -(* TODO: I reaaaallly don't like having an env ref like this! - But the only better way I can think of injecting this deep inside - the chain is with effects and that would be worse. - - We could transform init to accept a continuation like Parallel.run - but I don't see why we need to.*) -let env_ref : Eio.Time.clock option ref = ref None -let init env = env_ref := Some env - -let sleep_until time = - match !env_ref with - | Some env -> Eio.Time.sleep_until env time - | None -> failwith "You must intialize the Clock module first" - -let now () = - match !env_ref with - | Some env -> Eio.Time.now env - | None -> failwith "You must initialize the Clock module first" diff --git a/deku-p/src/core/stdlib/deku_stdlib.ml b/deku-p/src/core/stdlib/deku_stdlib.ml index 4e331adcf..46cc6b0eb 100644 --- a/deku-p/src/core/stdlib/deku_stdlib.ml +++ b/deku-p/src/core/stdlib/deku_stdlib.ml @@ -6,4 +6,3 @@ module IO = Io include Let_syntax module Parallel = Parallel module List = List_ext -module Clock = Clock diff --git a/deku-p/src/core/stdlib/deku_stdlib.mli b/deku-p/src/core/stdlib/deku_stdlib.mli index f4975aab8..183928a66 100644 --- a/deku-p/src/core/stdlib/deku_stdlib.mli +++ b/deku-p/src/core/stdlib/deku_stdlib.mli @@ -11,4 +11,3 @@ module IO = Io module Parallel = Parallel module List = List_ext -module Clock = Clock From 48801bd6d049cb6dc6576a8a3426d73e7ad0d47e Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 20 Dec 2022 20:41:45 +0100 Subject: [PATCH 29/37] fix: deku-tester origination fix: directly use Ligo expression to avoid future breaking chage fix: getState returns an int and not a string --- examples/tests/src/invokation.ts | 12 +++--- examples/tests/src/origination.ts | 6 +-- examples/tests/src/utils.ts | 65 ++++++++----------------------- 3 files changed, 26 insertions(+), 57 deletions(-) diff --git a/examples/tests/src/invokation.ts b/examples/tests/src/invokation.ts index e96e6f6ec..eea983ec4 100644 --- a/examples/tests/src/invokation.ts +++ b/examples/tests/src/invokation.ts @@ -1,28 +1,28 @@ import { DekuCClient, fromMemorySigner } from "@marigold-dev/deku"; import { InMemorySigner } from "@taquito/signer"; -import { decrement, increment, initialStorage, reset, wait } from "./utils"; +import { initialStorage, wait, source } from "./utils"; const run = async ({ secret, dekuRpc, ligoRpc, address }): Promise => { const signer = new InMemorySigner(secret); const dekuSigner = fromMemorySigner(signer); const deku = new DekuCClient({ dekuRpc, ligoRpc, dekuSigner }); // Get the contract - const contract = deku.contract(address); + const contract = deku.contract(address, { source, kind: "jsligo" }); const initial = await contract.getState(); // increment the state - const op1 = await contract.invokeRaw(increment(2)); + const op1 = await contract.invokeLigo("Increment(2)"); await wait(dekuRpc, op1); const state1 = await contract.getState(); if (initial + 2 !== state1) throw "Increment did not worked, the state is not updated."; // decrement the state - const op2 = await contract.invokeRaw(decrement(1)); + const op2 = await contract.invokeLigo("Decrement(1)"); await wait(dekuRpc, op2); const state2 = await contract.getState(); if (state1 - 1 !== state2) - throw "Decrement did not worked, the state is not updated."; + throw `Decrement did not worked, the state is not updated, previous state ${state1}, next state ${state2}`; // reset the state - const op3 = await contract.invokeRaw(reset()); + const op3 = await contract.invokeLigo("Reset()"); await wait(dekuRpc, op3); const state3 = await contract.getState(); if (state3 !== initialStorage) diff --git a/examples/tests/src/origination.ts b/examples/tests/src/origination.ts index 893101ee1..1610668c3 100644 --- a/examples/tests/src/origination.ts +++ b/examples/tests/src/origination.ts @@ -1,6 +1,6 @@ import { DekuCClient, fromMemorySigner } from "@marigold-dev/deku"; import { InMemorySigner } from "@taquito/signer"; -import { code, initialStorage, wait } from "./utils"; +import { source, initialStorage, wait } from "./utils"; const run = async ({ dekuRpc, ligoRpc, secret }): Promise => { const signer = new InMemorySigner(secret); @@ -9,8 +9,8 @@ const run = async ({ dekuRpc, ligoRpc, secret }): Promise => { // Originate a contract const { operation, address } = await deku.originateLigo({ kind: "jsligo", - source: code, - initialStorage, + source, + initialStorage: initialStorage.toString(), }); // The operation should be included await wait(dekuRpc, operation); diff --git a/examples/tests/src/utils.ts b/examples/tests/src/utils.ts index 914dd189f..cdf1822ca 100644 --- a/examples/tests/src/utils.ts +++ b/examples/tests/src/utils.ts @@ -50,7 +50,7 @@ export const toBytes = (b58) => { /** * Initial storage of the following contract */ -export const initialStorage = "0"; +export const initialStorage = 0; /** * Counter example with 3 entrypoints: @@ -58,56 +58,25 @@ export const initialStorage = "0"; * - Decrement(int) to decrement the counter * - Reset() to reset to 0 the counter */ -export const code = ` +export const source = ` type storage = int; -const empty: storage = 0; - type parameter = - | ["Increment", int] - | ["Decrement", int] - | ["Reset"]; +| ["Increment", int] +| ["Decrement", int] +| ["Reset"]; -const increment = (storage: storage, delta: int) => storage + delta; -const decrement = (storage: storage, delta: int) => storage - delta; -const reset = () => empty; +type return_ = -const main = (action: parameter, storage: storage) : [list, storage] => { - return [ - list([]), - (match(action, { - Increment: delta => increment(storage, delta), - Decrement: delta => decrement(storage, delta), - Reset: () => reset(), - })) - ] -}`; +[list, +storage]; -/** - * Increment entrypoint - * michelson: (Left (Right n)) - * @param n the delta to increment - * @returns the payload of the operation - */ -export const increment = (n) => [ - "Union", - ["Left", ["Union", ["Right", ["Int", n.toString()]]]], -]; - -/** - * Decrement entrypoint - * michelson: (Left (Left n)) - * @param n the delta to decrement - * @returns the payload of the operation - */ -export const decrement = (n) => [ - "Union", - ["Left", ["Union", ["Left", ["Int", n.toString()]]]], -]; - -/** - * Reset the state of the contract - * michelson: (Right Unit) - * @returns the payload of the operation - */ -export const reset = () => ["Union", ["Right", ["Unit"]]]; +const main = +(action: parameter, store: storage): return_ => { + let storage = match(action, { + Increment: n => store + n, + Decrement: n => store - n, + Reset: () => 0 + }); + return [list([]), storage]}; +`; From 8fe6d2aa9f8dcbbe8a40021b8b1ce1bfea0b3142 Mon Sep 17 00:00:00 2001 From: Laurent Canis Date: Tue, 20 Dec 2022 14:57:10 -0500 Subject: [PATCH 30/37] bump deku-tester version --- examples/tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tests/package.json b/examples/tests/package.json index 0cd5928b0..da8d9c28c 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,7 +1,7 @@ { "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "0.1.5", + "version": "0.1.6", "main": "dist/index.js", "license": "MIT", "bin": { From aedda0277e6d28700c4bc50cd064c5622d113330 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Wed, 21 Dec 2022 11:10:48 +0100 Subject: [PATCH 31/37] fix/api: get balance encoding --- deku-p/src/core/bin/api/handlers.ml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/deku-p/src/core/bin/api/handlers.ml b/deku-p/src/core/bin/api/handlers.ml index 25c95bbe4..e6a81fed6 100644 --- a/deku-p/src/core/bin/api/handlers.ml +++ b/deku-p/src/core/bin/api/handlers.ml @@ -1,6 +1,5 @@ open Deku_consensus open Deku_block_storage -open Deku_stdlib open Deku_concepts open Deku_gossip open Deku_network @@ -158,14 +157,14 @@ module Get_balance : NO_BODY_HANDLERS = struct ticket_id : Deku_ledger.Ticket_id.t; } - type response = { balance : int } + type response = { balance : Amount.t } let response_encoding = let open Data_encoding in conv (fun { balance } -> balance) (fun balance -> { balance }) - (obj1 (req "balance" int8)) + (obj1 (req "balance" Amount.encoding)) let meth = `GET @@ -184,7 +183,6 @@ module Get_balance : NO_BODY_HANDLERS = struct let Api_state.{ protocol; _ } = state in let (Protocol { ledger; _ }) = protocol in let amount = Deku_ledger.Ledger.balance address ticket_id ledger in - let amount = Amount.to_n amount |> N.to_z |> Z.to_int in Ok { balance = amount } end From b2d122b9b6aa8b5eef48dc51c98ace0586509019 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Wed, 21 Dec 2022 11:11:04 +0100 Subject: [PATCH 32/37] fix/ts-client: balance is a string and not a number --- deku-c/client/src/deku-p/network/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deku-c/client/src/deku-p/network/index.ts b/deku-c/client/src/deku-p/network/index.ts index 306cd30fb..d76205af9 100644 --- a/deku-c/client/src/deku-p/network/index.ts +++ b/deku-c/client/src/deku-p/network/index.ts @@ -81,7 +81,9 @@ export const makeEndpoints = (root: string): endpoints => ({ ), expectedStatus: 200, parse: (json: JSONValue) => { - return json.at("balance").as_int(); + const balance = json.at("balance").as_string(); + if (balance === null) return balance; + return Number.parseInt(balance); }, }), GET_PROOF: (operation_hash: string) => ({ @@ -135,6 +137,7 @@ const parse = async ( export const get = async (endpoint: endpoint): Promise => { const uri = endpoint.uri; + console.log(uri); const response = await fetch(uri); const status = response.status; From 064ae26e4008d30466eed6a29768d048ea3caede Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Wed, 21 Dec 2022 11:12:34 +0100 Subject: [PATCH 33/37] settings: bump client versions --- deku-c/client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deku-c/client/package.json b/deku-c/client/package.json index 97d3a3c37..03cf0741d 100644 --- a/deku-c/client/package.json +++ b/deku-c/client/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku", - "version": "0.1.5", + "version": "0.1.6", "description": "Toolkit to interact with Deku in front-end applications", "main": "dist/index.js", "types": "dist/index.d.ts", From e2056cd3cdd1f9c9e508425a34ac13ad0116d7be Mon Sep 17 00:00:00 2001 From: Laurent Canis Date: Wed, 21 Dec 2022 09:28:33 -0500 Subject: [PATCH 34/37] bump version deku and deku-tester --- deku-c/deku-cli/package.json | 2 +- examples/deku-c-nodejs/package.json | 2 +- examples/deku-p-nodejs/package.json | 2 +- examples/deku-p-react/package.json | 2 +- examples/number-go-up/package.json | 2 +- examples/tests/package.json | 4 ++-- website/package.json | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deku-c/deku-cli/package.json b/deku-c/deku-cli/package.json index 47599dbe0..fbb4f567d 100644 --- a/deku-c/deku-cli/package.json +++ b/deku-c/deku-cli/package.json @@ -18,7 +18,7 @@ "author": "", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "@noble/ed25519": "^1.7.1", "@taquito/signer": "^14.0.0", "commander": "^9.4.1", diff --git a/examples/deku-c-nodejs/package.json b/examples/deku-c-nodejs/package.json index e47c6b8dd..1ec2baf72 100644 --- a/examples/deku-c-nodejs/package.json +++ b/examples/deku-c-nodejs/package.json @@ -10,7 +10,7 @@ "author": "contact@marigold.dev", "license": "ISC", "dependencies": { - "@marigold-dev/deku": "0.1.5" + "@marigold-dev/deku": "0.1.6" }, "devDependencies": { "@taquito/signer": "^14.0.0", diff --git a/examples/deku-p-nodejs/package.json b/examples/deku-p-nodejs/package.json index ef8e79519..533fe1b69 100644 --- a/examples/deku-p-nodejs/package.json +++ b/examples/deku-p-nodejs/package.json @@ -11,7 +11,7 @@ "author": "", "license": "MIT", "dependencies": { - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "@taquito/signer": "^14.0.0", "@taquito/taquito": "^14.0.0", "axios": "^0.27.2", diff --git a/examples/deku-p-react/package.json b/examples/deku-p-react/package.json index 68c77dfbc..37eb8f89b 100644 --- a/examples/deku-p-react/package.json +++ b/examples/deku-p-react/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.1.3", - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "@taquito/beacon-wallet": "^13.0.1", "@taquito/signer": "^13.0.1", "@taquito/taquito": "^13.0.1", diff --git a/examples/number-go-up/package.json b/examples/number-go-up/package.json index 0cd5bcc0e..673fc687a 100644 --- a/examples/number-go-up/package.json +++ b/examples/number-go-up/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airgap/beacon-sdk": "^3.3.0", - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "@taquito/signer": "14.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", diff --git a/examples/tests/package.json b/examples/tests/package.json index da8d9c28c..f428b7c56 100644 --- a/examples/tests/package.json +++ b/examples/tests/package.json @@ -1,14 +1,14 @@ { "name": "@marigold-dev/deku-tester", "description": "Test several aspects of deku", - "version": "0.1.6", + "version": "0.1.7", "main": "dist/index.js", "license": "MIT", "bin": { "deku-tester": "dist/index.js" }, "dependencies": { - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "@taquito/signer": "^14.1.0", "@taquito/taquito": "^14.2.0", "@tzstamp/helpers": "^0.3.4", diff --git a/website/package.json b/website/package.json index fa650cd7b..707899499 100644 --- a/website/package.json +++ b/website/package.json @@ -42,7 +42,7 @@ "@taquito/tzip12": "^14.0.0", "@taquito/tzip16": "^14.0.0", "@taquito/utils": "^14.0.0", - "@marigold-dev/deku": "0.1.5", + "@marigold-dev/deku": "0.1.6", "abort-controller": "^3.0.0", "algoliasearch": "^4.12.2", "axios": "^0.26.0", From 951295ef2d35c34b917acc9f38c6142c3e574cdb Mon Sep 17 00:00:00 2001 From: Laurent Canis Date: Wed, 21 Dec 2022 09:28:33 -0500 Subject: [PATCH 35/37] bump version deku and deku-cli and deku-tester --- deku-c/deku-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deku-c/deku-cli/package.json b/deku-c/deku-cli/package.json index fbb4f567d..c9cebdd79 100644 --- a/deku-c/deku-cli/package.json +++ b/deku-c/deku-cli/package.json @@ -1,6 +1,6 @@ { "name": "@marigold-dev/deku-cli", - "version": "0.1.5", + "version": "0.1.6", "description": "CLI client for Deku-C blockchain", "bin": { "deku-cli": "./dist/index.js" From f91744b23f55309a34aa152aa8ea6300b1e817df Mon Sep 17 00:00:00 2001 From: Laurent Canis Date: Wed, 21 Dec 2022 10:31:28 -0500 Subject: [PATCH 36/37] add PL as authorized keys --- networks/betanets/authorized_keys.nix | Bin 3561 -> 3561 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/networks/betanets/authorized_keys.nix b/networks/betanets/authorized_keys.nix index 91b3a3e60f3930ce68a080baecaf92d5950653a0..86b4db33ff46f6f3e4811146bffb3233ecd1e765 100644 GIT binary patch literal 3561 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 From 6c495ff83ed3cb02e5bedc8ecd85b2d8fac50084 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Thu, 22 Dec 2022 11:34:02 +0100 Subject: [PATCH 37/37] fix: ligo deku rpc Saving files to filesystem can lead to issues when the same contract is compiled approximately at the same time. This behaviour can happen when doing the quickstart or via the tester which is compiled/originated every minutes A solution is to have a unique filename even if two contracts are equal they will have a different filename This filename is compute the a nonce and the hash of the contract Then to avoid a a filesystem overflow the files are deleted --- deku-c/ligo-deku-rpc/handlers.ml | 68 +++++++++++++++----------------- deku-c/ligo-deku-rpc/hash.ml | 9 +++-- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/deku-c/ligo-deku-rpc/handlers.ml b/deku-c/ligo-deku-rpc/handlers.ml index 14b9b91f6..e3bc35d76 100644 --- a/deku-c/ligo-deku-rpc/handlers.ml +++ b/deku-c/ligo-deku-rpc/handlers.ml @@ -76,6 +76,15 @@ let rec get_compilation_target = function | ("target", [ "wasm" ]) :: _ -> Wasm_target | _ :: tl -> get_compilation_target tl +module Nonce = struct + let nonce : int ref = ref 0 + + let take () = + let tmp = !nonce in + nonce := tmp + 1; + tmp +end + module Compile_contract : HANDLERS = struct type path = unit @@ -157,9 +166,9 @@ module Compile_contract : HANDLERS = struct let michelson_code, michelson_storage = match lang with | Michelson -> (source, storage) - | _ -> ( + | _ -> let lang = lang_to_string lang in - let hash = Hash.make source in + let hash = Hash.make source (Nonce.take ()) in let filename_ligo = Printf.sprintf "%s.%s" hash lang in Logs.info (fun m -> m "filename_ligo: %s" filename_ligo); let filename_tz = Printf.sprintf "%s.tz" hash in @@ -167,33 +176,19 @@ module Compile_contract : HANDLERS = struct Logs.info (fun m -> m "storage: %s" storage); let ligo_path = Eio.Path.(Eio.Stdenv.cwd env / filename_ligo) in let tz_path = Eio.Path.(Eio.Stdenv.cwd env / filename_tz) in - let tz_already_exists = - try Some (Eio.Path.load tz_path) |> Option.is_some with _ -> false + let () = Eio.Path.save ~create:(`Exclusive 0o600) ligo_path source in + let () = + Ligo_commands.compile_contract ~env ~lang ~filename_ligo + ~filename_tz () + in + let code = Eio.Path.load tz_path in + let storage = + Ligo_commands.compile_storage ~lang ~filename_ligo + ~expression:storage () in - match tz_already_exists with - | false -> - let () = - try Eio.Path.save ~create:(`Exclusive 0o600) ligo_path source - with _ -> () - in - let () = - Ligo_commands.compile_contract ~env ~lang ~filename_ligo - ~filename_tz () - in - let code = Eio.Path.load tz_path in - let storage = - Ligo_commands.compile_storage ~lang ~filename_ligo - ~expression:storage () - in - (code, storage) - | true -> - let code = Eio.Path.load tz_path in - let storage = - Ligo_commands.compile_storage ~lang ~filename_ligo - ~expression:storage () - |> String.trim - in - (code, storage)) + let () = Eio.Path.unlink ligo_path in + let () = Eio.Path.unlink tz_path in + (code, storage) in (* TODO: better error messages in Tuna *) let show_tuna_error = function @@ -263,17 +258,18 @@ module Compile_invocation : HANDLERS = struct | Michelson -> expression | _ -> let lang = lang_to_string lang in - let hash = Hash.make source in + let hash = Hash.make source (Nonce.take ()) in let filename_ligo = Printf.sprintf "%s.%s" hash lang in let ligo_path = Eio.Path.(Eio.Stdenv.cwd env / filename_ligo) in - let ligo_already_exists = - try Some (Eio.Path.load ligo_path) |> Option.is_some - with _ -> false + let () = + try Eio.Path.save ~create:(`Exclusive 0o600) ligo_path source + with _ -> () + in + let expression = + Ligo_commands.compile_parameter ~lang ~filename_ligo ~expression () in - (if not ligo_already_exists then - try Eio.Path.save ~create:(`Exclusive 0o600) ligo_path source - with _ -> ()); - Ligo_commands.compile_parameter ~lang ~filename_ligo ~expression () + let () = Eio.Path.unlink ligo_path in + expression in match get_compilation_target params with | Michelson_target -> Ok (Michelson_expression expression) diff --git a/deku-c/ligo-deku-rpc/hash.ml b/deku-c/ligo-deku-rpc/hash.ml index 05393729a..ff6d71d27 100644 --- a/deku-c/ligo-deku-rpc/hash.ml +++ b/deku-c/ligo-deku-rpc/hash.ml @@ -2,8 +2,11 @@ let alphabet = Base64.make_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_" -let make content = +let make content nonce = + let nonce = + nonce |> string_of_int |> Hex.of_string |> Hex.to_bytes |> Cstruct.of_bytes + in let content = Cstruct.of_string content in - Mirage_crypto.Hash.MD5.digest content - |> Cstruct.to_string + Cstruct.append content nonce + |> Mirage_crypto.Hash.MD5.digest |> Cstruct.to_string |> Base64.encode_string ~pad:false ~alphabet