diff --git a/src/proto_alpha/lib_benchmark/execution_context.ml b/src/proto_alpha/lib_benchmark/execution_context.ml index 86fbdd7278e7e06ecbc7145e122df9f5e09f128a..a44d25fc872136505947f21c3d718837b35a21e4 100644 --- a/src/proto_alpha/lib_benchmark/execution_context.ml +++ b/src/proto_alpha/lib_benchmark/execution_context.ml @@ -58,9 +58,9 @@ let make ~rng_state = let level = Script_int.zero_n in let open Script_interpreter in (match context with - | `Mem_block (block, (bs1, bs2, _, _, _)) -> + | `Mem_block (block, (bs1, _, _, _, _)) -> let source = bs1 in - let payer = bs2 in + let payer = Contract_helpers.default_payer in let self = Contract_helpers.default_self in let step_constants = { diff --git a/src/proto_alpha/lib_benchmarks_proto/interpreter_benchmarks.ml b/src/proto_alpha/lib_benchmarks_proto/interpreter_benchmarks.ml index d372190f4510618057ec5fedf746585198488780..735f29f015b85cc054fd4142130c1f3ee49ba584 100644 --- a/src/proto_alpha/lib_benchmarks_proto/interpreter_benchmarks.ml +++ b/src/proto_alpha/lib_benchmarks_proto/interpreter_benchmarks.ml @@ -2978,11 +2978,10 @@ module Registration_section = struct ~cont_and_stack_sampler:(fun _cfg _rng_state -> let open Script_typed_ir in let open Alpha_context in - let zero = Contract.Implicit Signature.Public_key_hash.zero in let step_constants = { - source = zero; - payer = zero; + source = Contract.Implicit Signature.Public_key_hash.zero; + payer = Signature.Public_key_hash.zero; self = Contract_hash.zero; amount = Tez.zero; balance = Tez.zero; diff --git a/src/proto_alpha/lib_client/client_proto_fa12.mli b/src/proto_alpha/lib_client/client_proto_fa12.mli index 76800482921ca900650c3b0496ec9506b0b37a28..4817f9c68295ededefd170fb10fa918288f77be6 100644 --- a/src/proto_alpha/lib_client/client_proto_fa12.mli +++ b/src/proto_alpha/lib_client/client_proto_fa12.mli @@ -155,7 +155,7 @@ val run_view_action : ?source:Contract.t -> contract:Contract_hash.t -> action:action -> - ?payer:Contract.t -> + ?payer:Signature.public_key_hash -> ?gas:Gas.Arith.integral -> unparsing_mode:Script_ir_translator.unparsing_mode -> unit -> diff --git a/src/proto_alpha/lib_client/client_proto_programs.ml b/src/proto_alpha/lib_client/client_proto_programs.ml index e2e7d31e3803719f9df725ee37a1a49f05879354..728e9ec1baaa1e6c2ab1add4c4726f99ac79b753 100644 --- a/src/proto_alpha/lib_client/client_proto_programs.ml +++ b/src/proto_alpha/lib_client/client_proto_programs.ml @@ -126,7 +126,7 @@ type simulation_params = { now : Script_timestamp.t option; level : Script_int.n Script_int.num option; source : Contract.t option; - payer : Contract.t option; + payer : Signature.public_key_hash option; gas : Gas.Arith.integral option; } diff --git a/src/proto_alpha/lib_client/client_proto_programs.mli b/src/proto_alpha/lib_client/client_proto_programs.mli index dbe6e154e2ab9da1994cf9d051fca871ddd0cf6f..40d5acac1b4f50bc1df8a041a3a5c481f7c4a1dd 100644 --- a/src/proto_alpha/lib_client/client_proto_programs.mli +++ b/src/proto_alpha/lib_client/client_proto_programs.mli @@ -39,7 +39,7 @@ type simulation_params = { now : Script_timestamp.t option; level : Script_int.n Script_int.num option; source : Contract.t option; - payer : Contract.t option; + payer : Signature.public_key_hash option; gas : Gas.Arith.integral option; } diff --git a/src/proto_alpha/lib_client_commands/client_proto_fa12_commands.ml b/src/proto_alpha/lib_client_commands/client_proto_fa12_commands.ml index 3c276d20c0df7a949d323a1681644a232f5657cb..e647c63f2f4e49b15db4a4fc6f698b50ae4ebabb 100644 --- a/src/proto_alpha/lib_client_commands/client_proto_fa12_commands.ml +++ b/src/proto_alpha/lib_client_commands/client_proto_fa12_commands.ml @@ -66,8 +66,8 @@ let as_arg = () let payer_arg = - Client_proto_contracts.ContractAlias.destination_arg - ~name:"payer" + Client_keys.Public_key_hash.source_arg + ~long:"payer" ~doc:"name of the payer (i.e. SOURCE) contract for the transaction" () diff --git a/src/proto_alpha/lib_client_commands/client_proto_programs_commands.ml b/src/proto_alpha/lib_client_commands/client_proto_programs_commands.ml index d82c6be1bc6c8e9a372a055057149908d1129358..39241974d1204dc7ce436f088fe77d967ecf5f12 100644 --- a/src/proto_alpha/lib_client_commands/client_proto_programs_commands.ml +++ b/src/proto_alpha/lib_client_commands/client_proto_programs_commands.ml @@ -91,8 +91,8 @@ let commands () = () in let payer_arg = - ContractAlias.destination_arg - ~name:"payer" + Client_keys.Public_key_hash.source_arg + ~long:"payer" ~doc:"name of the payer (i.e. SOURCE) contract for the transaction" () in diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index daaac1c42cd298cc851ca6ebb11c76622cedfbf8..4ef926e5a978f9ab0d58d94f4707a46313ae590a 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -164,7 +164,7 @@ module Scripts = struct (opt "balance" Tez.encoding) (req "chain_id" Chain_id.encoding) (opt "source" Contract.encoding) - (opt "payer" Contract.encoding) + (opt "payer" Contract.implicit_encoding) (opt "self" Contract.originated_encoding) (dft "entrypoint" Entrypoint.simple_encoding Entrypoint.default)) (obj4 @@ -217,7 +217,7 @@ module Scripts = struct (req "input" Script.expr_encoding) (req "chain_id" Chain_id.encoding) (opt "source" Contract.encoding) - (opt "payer" Contract.encoding) + (opt "payer" Contract.implicit_encoding) (opt "gas" Gas.Arith.z_integral_encoding) (req "unparsing_mode" unparsing_mode_encoding) (opt "now" Script_timestamp.encoding) @@ -233,7 +233,7 @@ module Scripts = struct (dft "unlimited_gas" bool false) (req "chain_id" Chain_id.encoding) (opt "source" Contract.encoding) - (opt "payer" Contract.encoding) + (opt "payer" Contract.implicit_encoding) (opt "gas" Gas.Arith.z_integral_encoding) (req "unparsing_mode" unparsing_mode_encoding) (opt "now" Script_timestamp.encoding)) @@ -901,7 +901,7 @@ module Scripts = struct type run_code_config = { balance : Tez.t; self : Contract_hash.t; - payer : Contract.t; + payer : Signature.public_key_hash; source : Contract.t; } @@ -928,6 +928,14 @@ module Scripts = struct balance >>=? fun (ctxt, _) -> return (ctxt, dummy_contract_hash) in + let source_and_payer ~src_opt ~pay_opt ~default_src = + match (src_opt, pay_opt) with + | None, None -> + (Contract.Originated default_src, Signature.Public_key_hash.zero) + | Some c, None -> (c, Signature.Public_key_hash.zero) + | None, Some c -> (Contract.Implicit c, c) + | Some src, Some pay -> (src, pay) + in let configure_contracts ctxt script balance ~src_opt ~pay_opt ~self_opt = (match self_opt with | None -> @@ -942,12 +950,7 @@ module Scripts = struct >>=? fun bal -> return (ctxt, addr, bal)) >>=? fun (ctxt, self, balance) -> let source, payer = - match (src_opt, pay_opt) with - | None, None -> - let self = Contract.Originated self in - (self, self) - | Some c, None | None, Some c -> (c, c) - | Some src, Some pay -> (src, pay) + source_and_payer ~src_opt ~pay_opt ~default_src:self in return (ctxt, {balance; self; source; payer}) in @@ -1134,8 +1137,8 @@ module Scripts = struct entrypoint, input, chain_id, - source, - payer, + src_opt, + pay_opt, gas, unparsing_mode, now, @@ -1160,11 +1163,7 @@ module Scripts = struct Tez.zero >>=? fun (ctxt, viewer_contract) -> let source, payer = - match (source, payer) with - | Some source, Some payer -> (source, payer) - | Some source, None -> (source, source) - | None, Some payer -> (payer, payer) - | None, None -> (contract, contract) + source_and_payer ~src_opt ~pay_opt ~default_src:contract_hash in let gas = Option.value @@ -1234,8 +1233,8 @@ module Scripts = struct input, unlimited_gas, chain_id, - source, - payer, + src_opt, + pay_opt, gas, unparsing_mode, now ), @@ -1253,11 +1252,7 @@ module Scripts = struct >>=? fun (input_ty, output_ty) -> Contract.get_balance ctxt contract >>=? fun balance -> let source, payer = - match (source, payer) with - | Some source, Some payer -> (source, payer) - | Some source, None -> (source, source) - | None, Some payer -> (payer, payer) - | None, None -> (contract, contract) + source_and_payer ~src_opt ~pay_opt ~default_src:contract_hash in let now = match now with None -> Script_timestamp.now ctxt | Some t -> t diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index ab984536b588abd62ca706fdaeca89db5fcfebcf..ef33c165a54e054d83553d0520050dc059c475e4 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -1633,6 +1633,8 @@ module Contract : sig include BASIC_DATA with type t := t + val implicit_encoding : Signature.public_key_hash Data_encoding.t + val originated_encoding : Contract_hash.t Data_encoding.t val in_memory_size : t -> Cache_memory_helpers.sint diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 89eb16234ab45b222f7e3210388f66801bcc6475..3f9accf971246dc31b5cf1516b998d69fb6907f8 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -837,7 +837,7 @@ let apply_transaction_to_smart_contract ~ctxt ~source ~contract_hash ~amount let open Script_interpreter in { source; - payer = Contract.Implicit payer; + payer; self = contract_hash; amount; chain_id; @@ -3098,7 +3098,7 @@ let apply_liquidity_baking_subsidy ctxt ~toggle_vote = entrypoint. *) { source = liquidity_baking_cpmm_contract; - payer = liquidity_baking_cpmm_contract; + payer = Signature.Public_key_hash.zero; self = liquidity_baking_cpmm_contract_hash; amount = liquidity_baking_subsidy; balance; diff --git a/src/proto_alpha/lib_protocol/script_interpreter.ml b/src/proto_alpha/lib_protocol/script_interpreter.ml index 0432fb11ef57b5ef64375da4393e693450546d98..9178b58ed9538b7cdc1ca8237103a84ad4536a04 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter.ml @@ -91,7 +91,7 @@ module S = Saturation_repr type step_constants = Script_typed_ir.step_constants = { source : Contract.t; - payer : Contract.t; + payer : Signature.public_key_hash; self : Contract_hash.t; amount : Tez.t; balance : Tez.t; @@ -1208,7 +1208,7 @@ and step : type a s b t r f. (a, s, b, t, r, f) step_type = let hash = Raw_hashes.sha512 bytes in (step [@ocaml.tailcall]) g gas k ks hash stack | ISource (_, k) -> - let destination : Destination.t = Contract sc.payer in + let destination : Destination.t = Contract (Implicit sc.payer) in let res = {destination; entrypoint = Entrypoint.default} in (step [@ocaml.tailcall]) g gas k ks res (accu, stack) | ISender (_, k) -> diff --git a/src/proto_alpha/lib_protocol/script_interpreter.mli b/src/proto_alpha/lib_protocol/script_interpreter.mli index 797a02f17f824d551ded98d018a0e0f2bf4a0f75..bcca460b020ff01665b55914e43a266cd0a43a44 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.mli +++ b/src/proto_alpha/lib_protocol/script_interpreter.mli @@ -62,7 +62,7 @@ type execution_result = { type step_constants = Script_typed_ir.step_constants = { source : Contract.t; - payer : Contract.t; + payer : Signature.public_key_hash; self : Contract_hash.t; amount : Tez.t; balance : Tez.t; diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index 60514a7975b4373920e4445072a319aecf99879d..e47943604c640e74284d6bd17af94cb3dce271ee 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -41,7 +41,7 @@ open Dependent_bool type step_constants = { source : Contract.t; (** The address calling this contract, as returned by SENDER. *) - payer : Contract.t; + payer : Signature.public_key_hash; (** The address of the implicit account that initiated the chain of contract calls, as returned by SOURCE. *) self : Contract_hash.t; (** The address of the contract being executed, as returned by SELF and SELF_ADDRESS. diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index 010b1ab6f20abd2681836ab42021857aac8121da..0af068f38163302b9085be70d12101c17f00d0df 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -31,7 +31,7 @@ open Dependent_bool type step_constants = { source : Contract.t; - payer : Contract.t; + payer : Signature.public_key_hash; self : Contract_hash.t; amount : Tez.t; balance : Tez.t; diff --git a/src/proto_alpha/lib_protocol/test/helpers/contract_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/contract_helpers.ml index 4053b8f6b9b59ddc9c504e196e044583d720c52b..ec4d76ef14250674f6e1508eb787a40ac6a67247 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/contract_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/contract_helpers.ml @@ -69,13 +69,15 @@ let fake_KT1 = let default_self = fake_KT1 -let default_source = Contract.Implicit Signature.Public_key_hash.zero +let default_payer = Signature.Public_key_hash.zero + +let default_source = Contract.Implicit default_payer let default_step_constants = Script_interpreter. { source = default_source; - payer = default_source; + payer = default_payer; self = default_self; amount = Tez.zero; balance = Tez.zero; diff --git a/tezt/tests/run_script.ml b/tezt/tests/run_script.ml index 8b8ae4273b10254ef632013241f56a0f9c02d133..807b6fe5348e1aae89dd4aabae6c2ea572954f59 100644 --- a/tezt/tests/run_script.ml +++ b/tezt/tests/run_script.ml @@ -148,13 +148,21 @@ let test_source_and_sender ~protocol () = let* bootstrap1 = Client.show_address ~alias:"bootstrap1" client in let* bootstrap2 = Client.show_address ~alias:"bootstrap2" client in - (* When --payer is absent, --source sets *both* SENDER and SOURCE. *) + (* When --payer is absent, --source sets: + - *both* SENDER and SOURCE (until Kathmandu); + - SENDER, but SOURCE is the zero address (since L). *) + let expected_source = + match protocol with + | Ithaca | Jakarta | Kathmandu -> + Format.sprintf "%S" bootstrap1.public_key_hash + | Alpha -> "0x00000000000000000000000000000000000000000000" + in let* _storage = Client.run_script ~source:"bootstrap1" ~prg:check_source ~storage:"Unit" - ~input:(Format.sprintf "%S" bootstrap1.public_key_hash) + ~input:expected_source client in let* _storage =