Michelson: change semantics of SOURCE and add SENDER
This commit is contained in:
parent
bced4accb1
commit
377f3e1e44
@ -1385,8 +1385,24 @@ contract, unit for an account.
|
|||||||
> CONTRACT / addr : S => None : S
|
> CONTRACT / addr : S => None : S
|
||||||
otherwise
|
otherwise
|
||||||
|
|
||||||
- ``SOURCE``: Push the source contract of the current
|
- ``SOURCE``: Push the contract that initiated the current
|
||||||
transaction.
|
transaction, i.e. the contract that paid the fees and
|
||||||
|
storage cost, and whose manager signed the operation
|
||||||
|
that was sent on the blockchain. Note that since
|
||||||
|
``TRANSFER_TOKENS`` instructions can be chained,
|
||||||
|
``SOURCE`` and ``SENDER`` are not necessarily the same.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
:: 'S -> address : 'S
|
||||||
|
|
||||||
|
- ``SENDER``: Push the contract that initiated the current
|
||||||
|
internal transaction. It may be the ``SOURCE``, but may
|
||||||
|
also not if the source sent an order to an intermediate
|
||||||
|
smart contract, which then called the current contract.
|
||||||
|
To make sure that ``SENDER`` is the ``SOURCE``, either
|
||||||
|
compare them, or make sure that ``SENDER`` is the implicit
|
||||||
|
account of its ``MANAGER``.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
@ -2035,6 +2051,7 @@ The instructions which accept at most one variable annotation are:
|
|||||||
H
|
H
|
||||||
STEPS_TO_QUOTA
|
STEPS_TO_QUOTA
|
||||||
SOURCE
|
SOURCE
|
||||||
|
SENDER
|
||||||
SELF
|
SELF
|
||||||
CAST
|
CAST
|
||||||
RENAME
|
RENAME
|
||||||
@ -2299,6 +2316,8 @@ A similar mechanism is used for context dependent instructions:
|
|||||||
|
|
||||||
SOURCE :: 'S -> @source address : 'S
|
SOURCE :: 'S -> @source address : 'S
|
||||||
|
|
||||||
|
SENDER :: 'S -> @sender address : 'S
|
||||||
|
|
||||||
SELF :: 'S -> @self contract 'p : 'S
|
SELF :: 'S -> @self contract 'p : 'S
|
||||||
|
|
||||||
AMOUNT :: 'S -> @amount tez : 'S
|
AMOUNT :: 'S -> @amount tez : 'S
|
||||||
@ -2929,7 +2948,8 @@ XII - Full grammar
|
|||||||
| H
|
| H
|
||||||
| HASH_KEY
|
| HASH_KEY
|
||||||
| STEPS_TO_QUOTA
|
| STEPS_TO_QUOTA
|
||||||
| SOURCE <type> <type>
|
| SOURCE
|
||||||
|
| SENDER
|
||||||
<type> ::=
|
<type> ::=
|
||||||
| <comparable type>
|
| <comparable type>
|
||||||
| key
|
| key
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
storage nat ;
|
storage nat ;
|
||||||
parameter nat ;
|
parameter nat ;
|
||||||
code { UNPAIR ;
|
code { UNPAIR ;
|
||||||
DIP { SELF ; ADDRESS ; SOURCE;
|
DIP { SELF ; ADDRESS ; SENDER;
|
||||||
IFCMPEQ {} { DROP ; PUSH @storage nat 1 } };
|
IFCMPEQ {} { DROP ; PUSH @storage nat 1 } };
|
||||||
DUP ;
|
DUP ;
|
||||||
PUSH nat 1 ;
|
PUSH nat 1 ;
|
||||||
|
@ -7,6 +7,6 @@ code { CAR;
|
|||||||
DIP { RIGHT key_hash ; DIP { SELF ; PUSH mutez 0 } ; TRANSFER_TOKENS ;
|
DIP { RIGHT key_hash ; DIP { SELF ; PUSH mutez 0 } ; TRANSFER_TOKENS ;
|
||||||
NIL operation ; SWAP ; CONS } ;
|
NIL operation ; SWAP ; CONS } ;
|
||||||
CONS ; NONE (contract unit) ; SWAP ; PAIR }
|
CONS ; NONE (contract unit) ; SWAP ; PAIR }
|
||||||
{ SELF ; ADDRESS ; SOURCE ; IFCMPNEQ { FAIL } {} ;
|
{ SELF ; ADDRESS ; SENDER ; IFCMPNEQ { FAIL } {} ;
|
||||||
CONTRACT unit ; DUP ; IF_SOME { DROP } { FAIL } ;
|
CONTRACT unit ; DUP ; IF_SOME { DROP } { FAIL } ;
|
||||||
NIL operation ; PAIR } } ;
|
NIL operation ; PAIR } } ;
|
||||||
|
@ -12,7 +12,7 @@ code { CAR;
|
|||||||
DIP { RIGHT key_hash ; DIP { SELF ; PUSH mutez 0 } ; TRANSFER_TOKENS ;
|
DIP { RIGHT key_hash ; DIP { SELF ; PUSH mutez 0 } ; TRANSFER_TOKENS ;
|
||||||
NIL operation ; SWAP ; CONS } ;
|
NIL operation ; SWAP ; CONS } ;
|
||||||
CONS ; UNIT ; SWAP ; PAIR }
|
CONS ; UNIT ; SWAP ; PAIR }
|
||||||
{ SELF ; ADDRESS ; SOURCE ; IFCMPNEQ { FAIL } {} ;
|
{ SELF ; ADDRESS ; SENDER ; IFCMPNEQ { FAIL } {} ;
|
||||||
CONTRACT string ; IF_SOME {} { FAIL } ;
|
CONTRACT string ; IF_SOME {} { FAIL } ;
|
||||||
PUSH mutez 0 ; PUSH string "abcdefg" ; TRANSFER_TOKENS ;
|
PUSH mutez 0 ; PUSH string "abcdefg" ; TRANSFER_TOKENS ;
|
||||||
NIL operation; SWAP; CONS ; UNIT ; SWAP ; PAIR } };
|
NIL operation; SWAP; CONS ; UNIT ; SWAP ; PAIR } };
|
||||||
|
@ -112,7 +112,7 @@ code
|
|||||||
IF { # Between T + 24 and T + 48
|
IF { # Between T + 24 and T + 48
|
||||||
# We accept only delivery notifications, from W
|
# We accept only delivery notifications, from W
|
||||||
DUP ; CDDDDDR ; MANAGER ; # W
|
DUP ; CDDDDDR ; MANAGER ; # W
|
||||||
SOURCE ; MANAGER ; IF_NONE { FAIL } {} ;
|
SENDER ; MANAGER ; IF_NONE { FAIL } {} ;
|
||||||
COMPARE ; NEQ ;
|
COMPARE ; NEQ ;
|
||||||
IF { FAIL } {} ; # fail if not the warehouse
|
IF { FAIL } {} ; # fail if not the warehouse
|
||||||
DUP ; CAR ; # we must receive (Right amount)
|
DUP ; CAR ; # we must receive (Right amount)
|
||||||
|
@ -3,10 +3,10 @@ storage (pair
|
|||||||
(pair %mgr1 (address %addr) (option %key key_hash))
|
(pair %mgr1 (address %addr) (option %key key_hash))
|
||||||
(pair %mgr2 (address %addr) (option %key key_hash))) ;
|
(pair %mgr2 (address %addr) (option %key key_hash))) ;
|
||||||
code { # Update the storage
|
code { # Update the storage
|
||||||
DUP ; CDAAR %addr @%; SOURCE ; PAIR %@ %@; UNPAIR;
|
DUP ; CDAAR %addr @%; SENDER ; PAIR %@ %@; UNPAIR;
|
||||||
IFCMPEQ
|
IFCMPEQ
|
||||||
{ UNPAIR ; SWAP ; SET_CADR %key @changed_mgr1_key }
|
{ UNPAIR ; SWAP ; SET_CADR %key @changed_mgr1_key }
|
||||||
{ DUP ; CDDAR ; SOURCE ;
|
{ DUP ; CDDAR ; SENDER ;
|
||||||
IFCMPEQ
|
IFCMPEQ
|
||||||
{ UNPAIR ; SWAP ; SET_CDDR %key }
|
{ UNPAIR ; SWAP ; SET_CDDR %key }
|
||||||
{ FAIL } } ;
|
{ FAIL } } ;
|
||||||
|
@ -234,6 +234,7 @@ module Script : sig
|
|||||||
| I_SIZE
|
| I_SIZE
|
||||||
| I_SOME
|
| I_SOME
|
||||||
| I_SOURCE
|
| I_SOURCE
|
||||||
|
| I_SENDER
|
||||||
| I_SELF
|
| I_SELF
|
||||||
| I_STEPS_TO_QUOTA
|
| I_STEPS_TO_QUOTA
|
||||||
| I_SUB
|
| I_SUB
|
||||||
|
@ -83,6 +83,7 @@ type prim =
|
|||||||
| I_SIZE
|
| I_SIZE
|
||||||
| I_SOME
|
| I_SOME
|
||||||
| I_SOURCE
|
| I_SOURCE
|
||||||
|
| I_SENDER
|
||||||
| I_SELF
|
| I_SELF
|
||||||
| I_STEPS_TO_QUOTA
|
| I_STEPS_TO_QUOTA
|
||||||
| I_SUB
|
| I_SUB
|
||||||
@ -210,6 +211,7 @@ let string_of_prim = function
|
|||||||
| I_SIZE -> "SIZE"
|
| I_SIZE -> "SIZE"
|
||||||
| I_SOME -> "SOME"
|
| I_SOME -> "SOME"
|
||||||
| I_SOURCE -> "SOURCE"
|
| I_SOURCE -> "SOURCE"
|
||||||
|
| I_SENDER -> "SENDER"
|
||||||
| I_SELF -> "SELF"
|
| I_SELF -> "SELF"
|
||||||
| I_STEPS_TO_QUOTA -> "STEPS_TO_QUOTA"
|
| I_STEPS_TO_QUOTA -> "STEPS_TO_QUOTA"
|
||||||
| I_SUB -> "SUB"
|
| I_SUB -> "SUB"
|
||||||
@ -318,6 +320,7 @@ let prim_of_string = function
|
|||||||
| "SIZE" -> ok I_SIZE
|
| "SIZE" -> ok I_SIZE
|
||||||
| "SOME" -> ok I_SOME
|
| "SOME" -> ok I_SOME
|
||||||
| "SOURCE" -> ok I_SOURCE
|
| "SOURCE" -> ok I_SOURCE
|
||||||
|
| "SENDER" -> ok I_SENDER
|
||||||
| "SELF" -> ok I_SELF
|
| "SELF" -> ok I_SELF
|
||||||
| "STEPS_TO_QUOTA" -> ok I_STEPS_TO_QUOTA
|
| "STEPS_TO_QUOTA" -> ok I_STEPS_TO_QUOTA
|
||||||
| "SUB" -> ok I_SUB
|
| "SUB" -> ok I_SUB
|
||||||
@ -471,6 +474,7 @@ let prim_encoding =
|
|||||||
("SIZE", I_SIZE) ;
|
("SIZE", I_SIZE) ;
|
||||||
("SOME", I_SOME) ;
|
("SOME", I_SOME) ;
|
||||||
("SOURCE", I_SOURCE) ;
|
("SOURCE", I_SOURCE) ;
|
||||||
|
("SENDER", I_SENDER) ;
|
||||||
("SELF", I_SELF) ;
|
("SELF", I_SELF) ;
|
||||||
("STEPS_TO_QUOTA", I_STEPS_TO_QUOTA) ;
|
("STEPS_TO_QUOTA", I_STEPS_TO_QUOTA) ;
|
||||||
("SUB", I_SUB) ;
|
("SUB", I_SUB) ;
|
||||||
|
@ -81,6 +81,7 @@ type prim =
|
|||||||
| I_SIZE
|
| I_SIZE
|
||||||
| I_SOME
|
| I_SOME
|
||||||
| I_SOURCE
|
| I_SOURCE
|
||||||
|
| I_SENDER
|
||||||
| I_SELF
|
| I_SELF
|
||||||
| I_STEPS_TO_QUOTA
|
| I_STEPS_TO_QUOTA
|
||||||
| I_SUB
|
| I_SUB
|
||||||
|
@ -707,6 +707,9 @@ let rec interp
|
|||||||
| Unaccounted -> Z.of_string "99999999" in
|
| Unaccounted -> Z.of_string "99999999" in
|
||||||
logged_return (Item (Script_int.(abs (of_zint steps)), rest), ctxt)
|
logged_return (Item (Script_int.(abs (of_zint steps)), rest), ctxt)
|
||||||
| Source, rest ->
|
| Source, rest ->
|
||||||
|
Lwt.return (Gas.consume ctxt Interp_costs.source) >>=? fun ctxt ->
|
||||||
|
logged_return (Item (payer, rest), ctxt)
|
||||||
|
| Sender, rest ->
|
||||||
Lwt.return (Gas.consume ctxt Interp_costs.source) >>=? fun ctxt ->
|
Lwt.return (Gas.consume ctxt Interp_costs.source) >>=? fun ctxt ->
|
||||||
logged_return (Item (source, rest), ctxt)
|
logged_return (Item (source, rest), ctxt)
|
||||||
| Self t, rest ->
|
| Self t, rest ->
|
||||||
|
@ -17,6 +17,7 @@ let default_amount_annot = Some (`Var_annot "amount")
|
|||||||
let default_balance_annot = Some (`Var_annot "balance")
|
let default_balance_annot = Some (`Var_annot "balance")
|
||||||
let default_steps_annot = Some (`Var_annot "steps")
|
let default_steps_annot = Some (`Var_annot "steps")
|
||||||
let default_source_annot = Some (`Var_annot "source")
|
let default_source_annot = Some (`Var_annot "source")
|
||||||
|
let default_sender_annot = Some (`Var_annot "sender")
|
||||||
let default_self_annot = Some (`Var_annot "self")
|
let default_self_annot = Some (`Var_annot "self")
|
||||||
let default_arg_annot = Some (`Var_annot "arg")
|
let default_arg_annot = Some (`Var_annot "arg")
|
||||||
let default_param_annot = Some (`Var_annot "parameter")
|
let default_param_annot = Some (`Var_annot "parameter")
|
||||||
|
@ -17,6 +17,7 @@ val default_amount_annot : var_annot option
|
|||||||
val default_balance_annot : var_annot option
|
val default_balance_annot : var_annot option
|
||||||
val default_steps_annot : var_annot option
|
val default_steps_annot : var_annot option
|
||||||
val default_source_annot : var_annot option
|
val default_source_annot : var_annot option
|
||||||
|
val default_sender_annot : var_annot option
|
||||||
val default_self_annot : var_annot option
|
val default_self_annot : var_annot option
|
||||||
val default_arg_annot : var_annot option
|
val default_arg_annot : var_annot option
|
||||||
val default_param_annot : var_annot option
|
val default_param_annot : var_annot option
|
||||||
|
@ -206,6 +206,7 @@ let number_of_generated_growing_types : type b a. (b, a) instr -> int = function
|
|||||||
| H _ -> 0
|
| H _ -> 0
|
||||||
| Steps_to_quota -> 0
|
| Steps_to_quota -> 0
|
||||||
| Source -> 0
|
| Source -> 0
|
||||||
|
| Sender -> 0
|
||||||
| Self _ -> 1
|
| Self _ -> 1
|
||||||
| Amount -> 0
|
| Amount -> 0
|
||||||
| Set_delegate -> 0
|
| Set_delegate -> 0
|
||||||
@ -294,6 +295,7 @@ let namespace = function
|
|||||||
| I_SIZE
|
| I_SIZE
|
||||||
| I_SOME
|
| I_SOME
|
||||||
| I_SOURCE
|
| I_SOURCE
|
||||||
|
| I_SENDER
|
||||||
| I_SELF
|
| I_SELF
|
||||||
| I_STEPS_TO_QUOTA
|
| I_STEPS_TO_QUOTA
|
||||||
| I_SUB
|
| I_SUB
|
||||||
@ -2380,6 +2382,11 @@ and parse_instr
|
|||||||
parse_var_annot loc annot ~default:default_source_annot >>=? fun annot ->
|
parse_var_annot loc annot ~default:default_source_annot >>=? fun annot ->
|
||||||
typed ctxt loc Source
|
typed ctxt loc Source
|
||||||
(Item_t (Address_t None, stack, annot))
|
(Item_t (Address_t None, stack, annot))
|
||||||
|
| Prim (loc, I_SENDER, [], annot),
|
||||||
|
stack ->
|
||||||
|
parse_var_annot loc annot ~default:default_sender_annot >>=? fun annot ->
|
||||||
|
typed ctxt loc Sender
|
||||||
|
(Item_t (Address_t None, stack, annot))
|
||||||
| Prim (loc, I_SELF, [], annot),
|
| Prim (loc, I_SELF, [], annot),
|
||||||
stack ->
|
stack ->
|
||||||
parse_var_annot loc annot ~default:default_self_annot >>=? fun annot ->
|
parse_var_annot loc annot ~default:default_self_annot >>=? fun annot ->
|
||||||
@ -2404,7 +2411,7 @@ and parse_instr
|
|||||||
| I_MANAGER | I_TRANSFER_TOKENS | I_CREATE_ACCOUNT
|
| I_MANAGER | I_TRANSFER_TOKENS | I_CREATE_ACCOUNT
|
||||||
| I_CREATE_CONTRACT | I_SET_DELEGATE | I_NOW
|
| I_CREATE_CONTRACT | I_SET_DELEGATE | I_NOW
|
||||||
| I_IMPLICIT_ACCOUNT | I_AMOUNT | I_BALANCE
|
| I_IMPLICIT_ACCOUNT | I_AMOUNT | I_BALANCE
|
||||||
| I_CHECK_SIGNATURE | I_HASH_KEY | I_SOURCE
|
| I_CHECK_SIGNATURE | I_HASH_KEY | I_SOURCE | I_SENDER
|
||||||
| I_H | I_STEPS_TO_QUOTA | I_ADDRESS
|
| I_H | I_STEPS_TO_QUOTA | I_ADDRESS
|
||||||
as name), (_ :: _ as l), _), _ ->
|
as name), (_ :: _ as l), _), _ ->
|
||||||
fail (Invalid_arity (loc, name, 0, List.length l))
|
fail (Invalid_arity (loc, name, 0, List.length l))
|
||||||
@ -2478,7 +2485,7 @@ and parse_instr
|
|||||||
I_PUSH ; I_NONE ; I_LEFT ; I_RIGHT ; I_NIL ;
|
I_PUSH ; I_NONE ; I_LEFT ; I_RIGHT ; I_NIL ;
|
||||||
I_EMPTY_SET ; I_DIP ; I_LOOP ;
|
I_EMPTY_SET ; I_DIP ; I_LOOP ;
|
||||||
I_IF_NONE ; I_IF_LEFT ; I_IF_CONS ;
|
I_IF_NONE ; I_IF_LEFT ; I_IF_CONS ;
|
||||||
I_EMPTY_MAP ; I_IF ; I_SOURCE ; I_SELF ; I_LAMBDA ]
|
I_EMPTY_MAP ; I_IF ; I_SOURCE ; I_SENDER ; I_SELF ; I_LAMBDA ]
|
||||||
|
|
||||||
and parse_contract
|
and parse_contract
|
||||||
: type arg. context -> Script.location -> arg ty -> Contract.t ->
|
: type arg. context -> Script.location -> arg ty -> Contract.t ->
|
||||||
|
@ -348,6 +348,8 @@ and ('bef, 'aft) instr =
|
|||||||
('rest, n num * 'rest) instr
|
('rest, n num * 'rest) instr
|
||||||
| Source :
|
| Source :
|
||||||
('rest, Contract.t * 'rest) instr
|
('rest, Contract.t * 'rest) instr
|
||||||
|
| Sender :
|
||||||
|
('rest, Contract.t * 'rest) instr
|
||||||
| Self : 'p ty ->
|
| Self : 'p ty ->
|
||||||
('rest, 'p typed_contract * 'rest) instr
|
('rest, 'p typed_contract * 'rest) instr
|
||||||
| Amount :
|
| Amount :
|
||||||
|
Loading…
Reference in New Issue
Block a user