ligo/gitlab-pages/docs/reference/current.md
2020-03-09 11:23:08 +01:00

9.5 KiB

id title
current-reference Tezos - Things relating to the current execution context

import Syntax from '@theme/Syntax';

Tezos.balance

Get the balance for the contract.

function main (const p : unit; const s: tez) : list (operation) * tez is
  ((nil : list (operation)), Tezos.balance)

Note that balance and Current.balance are deprecated.

let main (p,s : unit * tez) = ([] : operation list), Tezos.balance

Note that balance and Current.balance are deprecated.

let main = ((p,s) : (unit, tez)) =>
  ([]: list (operation), Tezos.balance);

Note that balance and Current.balance are deprecated.

Tezos.now

Returns the current time as a unix timestamp.

In LIGO, timestamps are type compatible in operations with integers. This lets you set for instance time constraints for your smart contracts like this:

Examples

24 hours from now

const today: timestamp = Tezos.now;
const one_day: int = 86_400;
const in_24_hrs: timestamp = today + one_day;
const some_date: timestamp = ("2000-01-01T10:10:10Z" : timestamp);
const one_day_later: timestamp = some_date + one_day;

Note that now is deprecated.

let today: timestamp = Tezos.now
let one_day: int = 86_400
let in_24_hrs: timestamp = today + one_day
let some_date: timestamp = ("2000-01-01t10:10:10Z" : timestamp)
let one_day_later: timestamp = some_date + one_day

Note that Current.time is deprecated.

let today: timestamp = Tezos.now;
let one_day: int = 86_400;
let in_24_hrs: timestamp = today + one_day;
let some_date: timestamp = ("2000-01-01t10:10:10Z" : timestamp);
let one_day_later: timestamp = some_date + one_day;

Note that Current.time is deprecated.

24 hours ago

const today: timestamp = Tezos.now;
const one_day: int = 86_400;
const in_24_hrs: timestamp = today - one_day;

Note that now is deprecated.

let today: timestamp = Tezos.now
let one_day: int = 86_400
let in_24_hrs: timestamp = today - one_day

Note that Current.time is deprecated.

let today: timestamp = Tezos.now;
let one_day: int = 86_400;
let in_24_hrs: timestamp = today - one_day;

Note that Current.time is deprecated.

Comparing Timestamps

You can also compare timestamps using the same comparison operators as for numbers

const not_tommorow: bool = (Tezos.now = in_24_hrs)

Note that now is deprecated.

let not_tomorrow: bool = (Tezos.now = in_24_hrs)

Note that Current.time is deprecated.

let not_tomorrow: bool = (Tezos.now == in_24_hrs);

Note that Current.time is deprecated.

Amount

Get the amount of tez provided by the sender to complete this transaction.

function threshold (const p : unit) : int is
  if Tezos.amount = 100tz then 42 else 0

Note that amount is deprecated.

let threshold (p : unit) : int = if Tezos.amount = 100tz then 42 else 0

Note that Current.amount is deprecated.

let threshold = (p : unit) : int =>
  if (Tezos.amount == 100tz) { 42; } else { 0; };

Note that Current.amount is deprecated.

Sender

Get the address that initiated the current transaction.

function main (const p : unit) : address is Tezos.sender

Note that sender is deprecated.

let main (p: unit) : address = Tezos.sender

Note that Current.sender is deprecated.

let main = (p : unit) : address => Tezos.sender;

Note that Current.sender is deprecated.

Address

Get the address associated with a value of type contract.

function main (const p : key_hash) : address is block {
  const c : contract (unit) = Tezos.implicit_account (p)
} with Tezos.address(c)

Note that implicit_account and address are deprecated.

let main (p : key_hash) =
  let c : unit contract = Tezos.implicit_account p
  in Tezos.address c

Note that Current.implicit_account and Current.address are deprecated.

let main = (p : key_hash) : address => {
  let c : contract (unit) = Tezos.implicit_account (p);
  Tezos.address (c);
};

Note that Current.implicit_account and Current.address are deprecated.

Self Address

Get the address of the currently running contract.

function main (const p : unit) : address is Tezos.self_address

Note that self_address is deprecated.

let main (p : unit) : address = Tezos.self_address

Note that Current.self_address is deprecated.

let main = (p : unit) : address => Tezos.self_address;

Note that Current.self_address is deprecated.

Self

Typecast the currently running contract with an entrypoint annotation. If your are using entrypoints: use "%Bar" for constructor Bar If you are not using entrypoints: use "%Default"

function main (const p : unit) : contract(unit) is block {
  const c : contract(unit) = Tezos.self("%Default") ;
} with c
let main (p : unit) : unit contract =
  (Tezos.self("%Default") : unit contract)
let main = (p: unit) : contract(unit) =>
  (Tezos.self("%Default") : contract(unit));

Implicit Account

Get the default contract associated with an on-chain key-pair. This contract does not execute code, instead it exists to receive tokens on behalf of a key's owner.

function main (const kh: key_hash) : contract (unit) is
  Tezos.implicit_account (kh)

Note that implicit_account is deprecated.

let main (kh : key_hash) : unit contract = Tezos.implicit_account kh

Note that Current.implicit_account is deprecated.

let main = (kh : key_hash): contract (unit) =>
  Tezos.implicit_account (kh);

Note that Current.implicit_account is deprecated.

Source

Get the originator (address) of the current transaction. That is, if a chain of transactions led to the current execution get the address that began the chain. Not to be confused with Tezos.sender, which gives the address of the contract or user which directly caused the current transaction.

⚠️ There are a few caveats you should keep in mind before using Tezos.source over Tezos.sender:

  1. Tezos.source will never be a contract, so if you want to allow contracts (multisigs etc) to operate your contract, you need to use Tezos.sender
  2. https://vessenes.com/tx-origin-and-ethereum-oh-my/ -- in general it is somewhat unsafe to assume that Tezos.source understands everything that is going to happen in a transaction. If Tezos.source transfers to a malicious (or sufficiently attackable) contract, that contract might potentially transfer to yours, without Tezos.source's consent. So if you are using Tezos.source for authentication, you risk being confused. A good historical example of this is bakers paying out delegation rewards. Naive bakers did (and probably still do) just use tezos-client to transfer to whatever KT1 delegates they had, even if those KT1 were malicious scripts.
function main (const p: unit) : address is Tezos.source

Note that source is deprecated.

let main (p : unit) : address = Tezos.source

Note that Current.source is deprecated.

let main = (p : unit) : address => Tezos.source;

Note that Current.source is deprecated.

Failwith

Cause the contract to fail with an error message.

⚠ Using this currently requires in general a type annotation on the failwith call.

function main (const p : int; const s : unit) : list (operation) * unit is
  block {
    if p > 10 then failwith ("Failure.") else skip
  }
  with ((nil : list (operation)), s)
let main (p,s : int * unit) = if p > 10 then failwith "Failure."
let main = ((p,s) : (int, unit)) =>
  if (p > 10) { failwith ("Failure."); };