text:
ERC-20 Contract Walk-Through
One of the most common uses for Ethereum is for a group to create a tradable token, in a sense their own currency. These tokens typically follow a standard, ERC-20. This standard makes it possible to write tools, such as liquidity pools and wallets, that work with all ERC-20 tokens. In this article we will analyze the OpenZeppelin Solidity ERC20 implementation(opens in a new tab), as well as the interface definition(opens in a new tab).
This is annotated source code. If you want to implement ERC-20, read this tutorial(opens in a new tab).
The Interface
The purpose of a standard like ERC-20 is to allow many tokens implementations that are interoperable across applications, like wallets and decentralized exchanges. To achieve that, we create an interface(opens in a new tab). Any code that needs to use the token contract can use the same definitions in the interface and be compatible with all token contracts that use it, whether it is a wallet such as MetaMask, a dapp such as etherscan.io, or a different contract such as liquidity pool.
If you are an experienced programmer, you probably remember seeing similar constructs in Java(opens in a new tab) or even in C header files(opens in a new tab).
This is a definition of the ERC-20 Interface(opens in a new tab) from OpenZeppelin. It is a translation of the human readable standard(opens in a new tab) into Solidity code. Of course, the interface itself does not define how to do anything. That is explained in the contract source code below.
1// SPDX-License-Identifier: MITನಕಲು
Solidity files are supposed to includes a license identifier. You can see the list of licenses here(opens in a new tab). If you need a different license, just explain it in the comments.
1pragma solidity >=0.6.0 <0.8.0;ನಕಲು
The Solidity language is still evolving quickly, and new versions may not be compatible with old code (see here(opens in a new tab)). Therefore, it is a good idea to specify not just a minimum version of the language, but also a maximum version, the latest with which you tested the code.
1/**2 * @dev Interface of the ERC20 standard as defined in the EIP.3 */ನಕಲು
The @dev
in the comment is part of the NatSpec format(opens in a new tab), used to produce
documentation from the source code.
1interface IERC20 {ನಕಲು
By convention, interface names start with I
1 /**2 * @dev Returns the amount of tokens in existence.3 */4 function totalSupply() external view returns (uint256);ನಕಲು
This function is external
, meaning it can only be called from outside the contract(opens in a new tab).
It returns the total supply of tokens in the contract. This value is returned using the most common type in Ethereum, unsigned 256 bits (256 bits is the
native word size of the EVM). This function is also a view
, which means that it does not change the state, so it can be executed on a single node instead of having
every node in the blockchain run it. This kind of function does not generate a transaction and does not cost gas.
Note: In theory it might appear that a contract's creator could cheat by returning a smaller total supply than the real value, making each token appear more valuable than it actually is. However, that fear ignores the true nature of the blockchain. Everything that happens on the blockchain can be verified by every node. To achieve this, every contract's machine language code and storage is available on every node. While you are not required to publish the Solidity code for your contract, nobody would take you seriously unless you publish the source code and the version of Solidity with which it was complied, so it can be verified against the machine language code you provided. For example, see this contract(opens in a new tab).
1 /**2 * @dev Returns the amount of tokens owned by `account`.3 */4 function balanceOf(address account) external view returns (uint256);ನಕಲು
As the name says, balanceOf
returns the balance of an account. Ethereum accounts are identified in Solidity using the address
type, which holds 160 bits.
It is also external
and view
1 /**2 * @dev Moves `amount` tokens from the caller's account to `recipient`.3 *4 * Returns a boolean value indicating whether the operation succeeded.5 *6 * Emits a {Transfer} event.7 */8 function transfer(address recipient, uint256 amount) external returns (bool);ನಕಲು
The transfer
function transfers a tokens from the caller to a different address. This involves a change of state, so it isn't a view
When a user calls this function it creates a transaction and costs gas. It also emits an event, Transfer
, to inform everybody on
the blockchain of the event.
The function has two types of output for two different types of callers:
- Users that call the function directly from a user interface. Typically the user submits a transaction
and does not wait for a response, which could take an indefinite amount of time. The user can see what happened
by looking for the transaction receipt (which is identified by the transaction hash) or by looking for the
event. - Other contracts, which call the function as part of an overall transaction. Those contracts get the result immediately, because they run in the same transaction, so they can use the function return value.
The same type of output is created by the other functions that change the contract's state.
Allowances permit an account to spend some tokens that belong to a different owner. This is useful, for example, for contracts that act as sellers. Contracts cannot monitor for events, so if a buyer were to transfer tokens to the seller contract directly that contract wouldn't know it was paid. Instead, the buyer permits the seller contract to spend a certain amount, and the seller transfers that amount. This is done through a function the seller contract calls, so the seller contract can know if it was successful.
1 /**2 * @dev Returns the remaining number of tokens that `spender` will be3 * allowed to spend on behalf of `owner` through {transferFrom}. This is4 * zero by default.5 *6 * This value changes when {approve} or {transferFrom} are called.7 */8 function allowance(address owner, address spender) external view returns (uint256);ನಕಲು
The allowance
function lets anybody query to see what is the allowance that one
address (owner
) lets another address (spender
) spend.
1 /**2 * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.3 *4 * Returns a boolean value indicating whether the operation succeeded.5 *6 * IMPORTANT: Beware that changing an allowance with this method brings the risk7 * that someone may use both the old and the new allowance by unfortunate8 * transaction ordering. One possible solution to mitigate this race9 * condition is to first reduce the spender's allowance to 0 and set the10 * desired value afterwards:11 * https://github.com/ethereum/EIPs/issues/20#issuecomment-26352472912 *13 * Emits an {Approval} event.14 */15 function approve(address spender, uint256 amount) external returns (bool);ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The approve
function creates an allowance. Make sure to read the message about
how it can be abused. In Ethereum you control the order of your own transactions,
but you cannot control the order in which other people's transactions will
be executed, unless you don't submit your own transaction until you see the
other side's transaction had happened.
1 /**2 * @dev Moves `amount` tokens from `sender` to `recipient` using the3 * allowance mechanism. `amount` is then deducted from the caller's4 * allowance.5 *6 * Returns a boolean value indicating whether the operation succeeded.7 *8 * Emits a {Transfer} event.9 */10 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
Finally, transferFrom
is used by the spender to actually spend the allowance.
12 /**3 * @dev Emitted when `value` tokens are moved from one account (`from`) to4 * another (`to`).5 *6 * Note that `value` may be zero.7 */8 event Transfer(address indexed from, address indexed to, uint256 value);910 /**11 * @dev Emitted when the allowance of a `spender` for an `owner` is set by12 * a call to {approve}. `value` is the new allowance.13 */14 event Approval(address indexed owner, address indexed spender, uint256 value);15}ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
These events are emitted when the state of the ERC-20 contract changes.
The Actual Contract
This is the actual contract that implements the ERC-20 standard, taken from here(opens in a new tab). It is not meant to be used as-is, but you can inherit(opens in a new tab) from it to extend it to something usable.
1// SPDX-License-Identifier: MIT2pragma solidity >=0.6.0 <0.8.0;ನಕಲು
Import Statements
In addition to the interface definitions above, the contract definition imports two other files:
12import "../../GSN/Context.sol";3import "./IERC20.sol";4import "../../math/SafeMath.sol";ನಕಲು
is the definitions required to use OpenGSN(opens in a new tab), a system that allows users without ether to use the blockchain. Note that this is an old version, if you want to integrate with OpenGSN use this tutorial(opens in a new tab).- The SafeMath library(opens in a new tab), which is used to make addition and subtraction without overflows. This is necessary because otherwise a person might somehow have one token, spend two tokens, and then have 2^256-1 tokens.
This comment explains the purpose of the contract.
1/**2 * @dev Implementation of the {IERC20} interface.3 *4 * This implementation is agnostic to the way tokens are created. This means5 * that a supply mechanism has to be added in a derived contract using {_mint}.6 * For a generic mechanism see {ERC20PresetMinterPauser}.7 *8 * TIP: For a detailed writeup see our guide9 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How10 * to implement supply mechanisms].11 *12 * We have followed general OpenZeppelin guidelines: functions revert instead13 * of returning `false` on failure. This behavior is nonetheless conventional14 * and does not conflict with the expectations of ERC20 applications.15 *16 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.17 * This allows applications to reconstruct the allowance for all accounts just18 * by listening to said events. Other implementations of the EIP may not emit19 * these events, as it isn't required by the specification.20 *21 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}22 * functions have been added to mitigate the well-known issues around setting23 * allowances. See {IERC20-approve}.24 */25ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
Contract Definition
1contract ERC20 is Context, IERC20 {ನಕಲು
This line specifies the inheritance, in this case from IERC20
from above and Context
, for OpenGSN.
12 using SafeMath for uint256;3ನಕಲು
This line attaches the SafeMath
library to the uint256
type. You can find this library
here(opens in a new tab).
Variable Definitions
These definitions specify the contract's state variables. These variables are declared private
, but
that only means that other contracts on the blockchain can't read them. There are no
secrets on the blockchain, the software on every node has the state of every contract
at every block. By convention, state variables are named _<something>
The first two variables are mappings(opens in a new tab), meaning they behave roughly the same as associative arrays(opens in a new tab), except that the keys are numeric values. Storage is only allocated for entries that have values different from the default (zero).
1 mapping (address => uint256) private _balances;ನಕಲು
The first mapping, _balances
, is addresses and their respective balances of this token. To access
the balance, use this syntax: _balances[<address>]
1 mapping (address => mapping (address => uint256)) private _allowances;ನಕಲು
This variable, _allowances
, stores the allowances explained earlier. The first index is the owner
of the tokens, and the second is the contract with the allowance. To access the amount address A can
spend from address B's account, use _allowances[B][A]
1 uint256 private _totalSupply;ನಕಲು
As the name suggests, this variable keeps track of the total supply of tokens.
1 string private _name;2 string private _symbol;3 uint8 private _decimals;ನಕಲು
These three variables are used to improve readability. The first two are self-explanatory, but _decimals
On one hand, ethereum does not have floating point or fractional variables. On the other hand, humans like being able to divide tokens. One reason people settled on gold for currency was that it was hard to make change when somebody wanted to buy a duck's worth of cow.
The solution is to keep track of integers, but count instead of the real token a fractional token that is nearly worthless. In the case of ether, the fractional token is called wei, and 10^18 wei is equal to one ETH. At writing, 10,000,000,000,000 wei is approximately one US or Euro cent.
Applications need to know how to display the token balance. If a user has 3,141,000,000,000,000,000 wei, is that
3.14 ETH? 31.41 ETH? 3,141 ETH? In the case of ether it is defined 10^18 wei to the ETH, but for your
token you can select a different value. If dividing the token doesn't make sense, you can use a
value of zero. If you want to use the same standard as ETH, use the value 18.
The Constructor
1 /**2 * @dev Sets the values for {name} and {symbol}, initializes {decimals} with3 * a default value of 18.4 *5 * To select a different value for {decimals}, use {_setupDecimals}.6 *7 * All three of these values are immutable: they can only be set once during8 * construction.9 */10 constructor (string memory name_, string memory symbol_) public {11 _name = name_;12 _symbol = symbol_;13 _decimals = 18;14 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The constructor is called when the contract is first created. By convention, function parameters are named <something>_
User Interface Functions
1 /**2 * @dev Returns the name of the token.3 */4 function name() public view returns (string memory) {5 return _name;6 }78 /**9 * @dev Returns the symbol of the token, usually a shorter version of the10 * name.11 */12 function symbol() public view returns (string memory) {13 return _symbol;14 }1516 /**17 * @dev Returns the number of decimals used to get its user representation.18 * For example, if `decimals` equals `2`, a balance of `505` tokens should19 * be displayed to a user as `5,05` (`505 / 10 ** 2`).20 *21 * Tokens usually opt for a value of 18, imitating the relationship between22 * ether and wei. This is the value {ERC20} uses, unless {_setupDecimals} is23 * called.24 *25 * NOTE: This information is only used for _display_ purposes: it in26 * no way affects any of the arithmetic of the contract, including27 * {IERC20-balanceOf} and {IERC20-transfer}.28 */29 function decimals() public view returns (uint8) {30 return _decimals;31 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
These functions, name
, symbol
, and decimals
help user interfaces know about your contract so they'll be able to display it properly.
The return type is string memory
, meaning return a string that is stored in memory. Variables, such as
strings, can be stored in three locations:
Lifetime | Contract Access | Gas Cost | |
Memory | Function call | Read/Write | Tens or hundreds (higher for higher locations) |
Calldata | Function call | Read Only | Can't be used as a return type, only a function parameter type |
Storage | Until changed | Read/Write | High (800 for read, 20k for write) |
In this case, memory
is the best choice.
Read Token Information
These are functions that provide information about the token, either the total supply or an account's balance.
1 /**2 * @dev See {IERC20-totalSupply}.3 */4 function totalSupply() public view override returns (uint256) {5 return _totalSupply;6 }ನಕಲು
The totalSupply
function returns the total supply of tokens.
1 /**2 * @dev See {IERC20-balanceOf}.3 */4 function balanceOf(address account) public view override returns (uint256) {5 return _balances[account];6 }ನಕಲು
Read an account's balance. Note that anybody is allowed to get anybody else's account balance. There is no point in trying to hide this information, because it is available on every node anyway. There are no secrets on the blockchain.
Transfer Tokens
1 /**2 * @dev See {IERC20-transfer}.3 *4 * Requirements:5 *6 * - `recipient` cannot be the zero address.7 * - the caller must have a balance of at least `amount`.8 */9 function transfer(address recipient, uint256 amount) public virtual override returns (bool) {ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The transfer
function is called to transfer tokens from the sender's account to a different one. Note
that even though it returns a boolean value, that value is always true. If the transfer
fails the contract reverts the call.
1 _transfer(_msgSender(), recipient, amount);2 return true;3 }ನಕಲು
The _transfer
function does the actual work. It is a private function that can only be called by
other contract functions. By convention private functions are named _<something>
, same as state
Normally in Solidity we use msg.sender
for the message sender. However, that breaks
OpenGSN(opens in a new tab). If we want to allow etherless transactions with our token, we
need to use _msgSender()
. It returns msg.sender
for normal transactions, but for etherless ones
return the original signer and not the contract that relayed the message.
Allowance Functions
These are the functions that implement the allowance functionality: allowance
, approve
, transferFrom
and _approve
. Additionally, the OpenZeppelin implementation goes beyond the basic standard to include some features that improve
security: increaseAllowance
, and decreaseAllowance
The allowance function
1 /**2 * @dev See {IERC20-allowance}.3 */4 function allowance(address owner, address spender) public view virtual override returns (uint256) {5 return _allowances[owner][spender];6 }ನಕಲು
The allowance
function allows everybody to check any allowance.
The approve function
1 /**2 * @dev See {IERC20-approve}.3 *4 * Requirements:5 *6 * - `spender` cannot be the zero address.7 */8 function approve(address spender, uint256 amount) public virtual override returns (bool) {ನಕಲು
This function is called to create an allowance. It is similar to the transfer
function above:
- The function just calls an internal function (in this case,
) that does the real work. - The function either returns
(if successful) or reverts (if not).
1 _approve(_msgSender(), spender, amount);2 return true;3 }ನಕಲು
We use internal functions to minimize the number of places where state changes happen. Any function that changes the state is a potential security risk that needs to be audited for security. This way we have less chances to get it wrong.
The transferFrom function
This is the function that a spender calls to spend an allowance. This requires two operations: transfer the amount being spent and reduce the allowance by that amount.
1 /**2 * @dev See {IERC20-transferFrom}.3 *4 * Emits an {Approval} event indicating the updated allowance. This is not5 * required by the EIP. See the note at the beginning of {ERC20}.6 *7 * Requirements:8 *9 * - `sender` and `recipient` cannot be the zero address.10 * - `sender` must have a balance of at least `amount`.11 * - the caller must have allowance for ``sender``'s tokens of at least12 * `amount`.13 */14 function transferFrom(address sender, address recipient, uint256 amount) public virtual15 override returns (bool) {16 _transfer(sender, recipient, amount);ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The a.sub(b, "message")
function call does two things. First, it calculates a-b
, which is the new allowance.
Second, it checks that this result is not negative. If it is negative the call reverts with the provided message. Note that when a call reverts any processing done previously during that call is ignored so we don't need to
undo the _transfer
1 _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,2 "ERC20: transfer amount exceeds allowance"));3 return true;4 }ನಕಲು
OpenZeppelin safety additions
It is dangerous to set a non-zero allowance to another non-zero value, because you only control the order of your own transactions, not anybody else's. Imagine you have two users, Alice who is naive and Bill who is dishonest. Alice wants some service from Bill, which she thinks costs five tokens - so she gives Bill an allowance of five tokens.
Then something changes and Bill's price rises to ten tokens. Alice, who still wants the service, sends a transaction that sets Bill's allowance to ten. The moment Bill sees this new transaction in the transaction pool he sends a transaction that spends Alice's five tokens and has a much higher gas price so it will be mined faster. That way Bill can spend first five tokens and then, once Alice's new allowance is mined, spend ten more for a total price of fifteen tokens, more than Alice meant to authorize. This technique is called front-running(opens in a new tab)
Alice Transaction | Alice Nonce | Bill Transaction | Bill Nonce | Bill's Allowance | Bill Total Income from Alice |
approve(Bill, 5) | 10 | 5 | 0 | ||
transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | ||
approve(Bill, 10) | 11 | 10 | 5 | ||
transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 |
To avoid this problem, these two functions (increaseAllowance
and decreaseAllowance
) allow you
to modify the allowance by a specific amount. So if Bill had already spent five tokens, he'll just
be able to spend five more. Depending on the timing, there are two ways this can work, both of
which end with Bill only getting ten tokens:
Alice Transaction | Alice Nonce | Bill Transaction | Bill Nonce | Bill's Allowance | Bill Total Income from Alice |
approve(Bill, 5) | 10 | 5 | 0 | ||
transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | ||
increaseAllowance(Bill, 5) | 11 | 0+5 = 5 | 5 | ||
transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 |
Alice Transaction | Alice Nonce | Bill Transaction | Bill Nonce | Bill's Allowance | Bill Total Income from Alice |
approve(Bill, 5) | 10 | 5 | 0 | ||
increaseAllowance(Bill, 5) | 11 | 5+5 = 10 | 0 | ||
transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 |
1 /**2 * @dev Atomically increases the allowance granted to `spender` by the caller.3 *4 * This is an alternative to {approve} that can be used as a mitigation for5 * problems described in {IERC20-approve}.6 *7 * Emits an {Approval} event indicating the updated allowance.8 *9 * Requirements:10 *11 * - `spender` cannot be the zero address.12 */13 function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {14 _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));15 return true;16 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The a.add(b)
function is a safe add. In the unlikely case that a
it does not wrap around
the way normal addition does.
12 /**3 * @dev Atomically decreases the allowance granted to `spender` by the caller.4 *5 * This is an alternative to {approve} that can be used as a mitigation for6 * problems described in {IERC20-approve}.7 *8 * Emits an {Approval} event indicating the updated allowance.9 *10 * Requirements:11 *12 * - `spender` cannot be the zero address.13 * - `spender` must have allowance for the caller of at least14 * `subtractedValue`.15 */16 function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {17 _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue,18 "ERC20: decreased allowance below zero"));19 return true;20 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
Functions that Modify Token Information
These are the four functions that do the actual work: _transfer
, _mint
, _burn
, and _approve
The _transfer function {#_transfer}
1 /**2 * @dev Moves tokens `amount` from `sender` to `recipient`.3 *4 * This is internal function is equivalent to {transfer}, and can be used to5 * e.g. implement automatic token fees, slashing mechanisms, etc.6 *7 * Emits a {Transfer} event.8 *9 * Requirements:10 *11 * - `sender` cannot be the zero address.12 * - `recipient` cannot be the zero address.13 * - `sender` must have a balance of at least `amount`.14 */15 function _transfer(address sender, address recipient, uint256 amount) internal virtual {ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
This function, _transfer
, transfers tokens from one account to another. It is called by both
(for transfers from the sender's own account) and transferFrom
(for using allowances
to transfer from somebody else's account).
1 require(sender != address(0), "ERC20: transfer from the zero address");2 require(recipient != address(0), "ERC20: transfer to the zero address");ನಕಲು
Nobody actually owns address zero in Ethereum (that is, nobody knows a private key whose matching public key is transformed to the zero address). When people use that address, it is usually a software bug - so we fail if the zero address is used as the sender or the recipient.
1 _beforeTokenTransfer(sender, recipient, amount);2ನಕಲು
There are two ways to use this contract:
- Use it as a template for your own code
- Inherit from it(opens in a new tab), and override only those functions that you need to modify
The second method is much better because the OpenZeppelin ERC-20 code has already been audited and shown to be secure. When you use inheritance it is clear what are the functions you modify, and to trust your contract people only need to audit those specific functions.
It is often useful to perform a function each time tokens change hands. However,_transfer
is a very important function and it is
possible to write it insecurely (see below), so it is best not to override it. The solution is _beforeTokenTransfer
, a
hook function(opens in a new tab). You can override this function, and it will be called on each transfer.
1 _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");2 _balances[recipient] = _balances[recipient].add(amount);ನಕಲು
These are the lines that actually do the transfer. Note that there is nothing between them, and that we subtract the transferred amount from the sender before adding it to the recipient. This is important because if there was a call to a different contract in the middle, it could have been used to cheat this contract. This way the transfer is atomic, nothing can happen in the middle of it.
1 emit Transfer(sender, recipient, amount);2 }ನಕಲು
Finally, emit a Transfer
event. Events are not accessible to smart contracts, but code running outside the blockchain
can listen for events and react to them. For example, a wallet can keep track of when the owner gets more tokens.
The _mint and _burn functions {#_mint-and-_burn}
These two functions (_mint
and _burn
) modify the total supply of tokens.
They are internal and there is no function that calls them in this contract,
so they are only useful if you inherit from the contract and add your own
logic to decide under what conditions to mint new tokens or burn existing
NOTE: Every ERC-20 token has its own business logic that dictates token management.
For example, a fixed supply contract might only call _mint
in the constructor and never call _burn
. A contract that sells tokens
will call _mint
when it is paid, and presumably call _burn
at some point
to avoid runaway inflation.
1 /** @dev Creates `amount` tokens and assigns them to `account`, increasing2 * the total supply.3 *4 * Emits a {Transfer} event with `from` set to the zero address.5 *6 * Requirements:7 *8 * - `to` cannot be the zero address.9 */10 function _mint(address account, uint256 amount) internal virtual {11 require(account != address(0), "ERC20: mint to the zero address");12 _beforeTokenTransfer(address(0), account, amount);13 _totalSupply = _totalSupply.add(amount);14 _balances[account] = _balances[account].add(amount);15 emit Transfer(address(0), account, amount);16 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
Make sure to update _totalSupply
when the total number of tokens changes.
1 /**2 * @dev Destroys `amount` tokens from `account`, reducing the3 * total supply.4 *5 * Emits a {Transfer} event with `to` set to the zero address.6 *7 * Requirements:8 *9 * - `account` cannot be the zero address.10 * - `account` must have at least `amount` tokens.11 */12 function _burn(address account, uint256 amount) internal virtual {13 require(account != address(0), "ERC20: burn from the zero address");1415 _beforeTokenTransfer(account, address(0), amount);1617 _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");18 _totalSupply = _totalSupply.sub(amount);19 emit Transfer(account, address(0), amount);20 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
The _burn
function is almost identical to _mint
, except it goes in the other direction.
The _approve function {#_approve}
This is the function that actually specifies allowances. Note that it allows an owner to specify an allowance that is higher than the owner's current balance. This is OK because the balance is checked at the time of transfer, when it could be different from the balance when the allowance is created.
1 /**2 * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.3 *4 * This internal function is equivalent to `approve`, and can be used to5 * e.g. set automatic allowances for certain subsystems, etc.6 *7 * Emits an {Approval} event.8 *9 * Requirements:10 *11 * - `owner` cannot be the zero address.12 * - `spender` cannot be the zero address.13 */14 function _approve(address owner, address spender, uint256 amount) internal virtual {15 require(owner != address(0), "ERC20: approve from the zero address");16 require(spender != address(0), "ERC20: approve to the zero address");1718 _allowances[owner][spender] = amount;ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
Emit an Approval
event. Depending on how the application is written, the spender contract can be told about the
approval either by the owner or by a server that listens to these events.
1 emit Approval(owner, spender, amount);2 }3ನಕಲು
Modify The Decimals Variable
123 /**4 * @dev Sets {decimals} to a value other than the default one of 18.5 *6 * WARNING: This function should only be called from the constructor. Most7 * applications that interact with token contracts will not expect8 * {decimals} to ever change, and may work incorrectly if it does.9 */10 function _setupDecimals(uint8 decimals_) internal {11 _decimals = decimals_;12 }ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
This function modifies the _decimals
variable which is used to tell user interfaces how to interpret the amount.
You should call it from the constructor. It would be dishonest to call it at any subsequent point, and applications
are not designed to handle it.
12 /**3 * @dev Hook that is called before any transfer of tokens. This includes4 * minting and burning.5 *6 * Calling conditions:7 *8 * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens9 * will be to transferred to `to`.10 * - when `from` is zero, `amount` tokens will be minted for `to`.11 * - when `to` is zero, `amount` of ``from``'s tokens will be burned.12 * - `from` and `to` are never both zero.13 *14 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].15 */16 function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }17}ಎಲ್ಲವನ್ನೂ ತೋರಿಸುನಕಲು
This is the hook function to be called during transfers. It is empty here, but if you need it to do something you just override it.
For review, here are some of the most important ideas in this contract (in my opinion, yours is likely to vary):
- There are no secrets on the blockchain. Any information that a smart contract can access is available to the whole world.
- You can control the order of your own transactions, but not when other people's transaction happen. This is the reason that changing an allowance can be dangerous, because it lets the spender spend the sum of both allowances.
- Values of type
wrap around. In other words, 0-1=2^256-1. If that is not desired behavior, you have to check for it (or use the SafeMath library that does it for you). Note that this changed in Solidity 0.8.0(opens in a new tab). - Do all state changes of a specific type in a specific place, because it makes auditing easier.
This is the reason that we have, for example,
, which is called byapprove
, anddecreaseAllowance
- State changes should be atomic, without any other action in their middle (as you can see
). This is because during the state change you have an inconsistent state. For example, between the time you deduct from the balance of the sender and the time you add to the balance of the recipient there are less token in existence than there should be. This could be potentially abused if there are operations between them, especially calls to a different contract.
Now that you've seen how the OpenZeppelin ERC-20 contract is written, and especially how it is made more secure, go and write your own secure contracts and applications.
ಕೊನೆಯ ಸಂಪಾದನೆ: @nhsz(opens in a new tab), ಫೆಬ್ರವರಿ 18, 2024


text:
Tasty solution – bananas lower blood pressure
More than 40% of women and over 50% of men worldwide unknowingly harbor the "silent killer" known as high blood pressure, a startling revelation from the World Health Organization (WHO). With a healthy blood pressure reading below 120/80 millimeters of mercury (mmHg), those exceeding 130/80 mmHg face the specter of hypertension, ranging from early stages to life-threatening crises.
Unchecked high blood pressure poses severe risks, including heart disease, stroke, and heart failure. While medications are available, physicians often advocate for dietary modifications as a primary measure. Increasing intake of leafy greens, nuts, seeds, and lean meats is recommended, with one popular fruit standing out: bananas. Salt is a notorious culprit in hypertension, ubiquitous in processed foods.
Enter the banana, a natural ally against elevated blood pressure. A single banana (126 grams) packs 451 milligrams of potassium, crucial for flushing out sodium through urine, as highlighted by a longitudinal study featured in the European Heart Journal. Research on 24,963 adults in the U.K. revealed a 2.4 mmHg decrease in systolic blood pressure for women with higher potassium intake.
Moreover, participants consuming more potassium exhibited a 13% lower risk of cardiovascular events, suggesting that incorporating bananas into one's diet could mitigate the adverse effects of excessive salt consumption. A 2022 study published in Natural Product Communications investigated the impact of dried and milled banana powder on rats with diabetes and hypertension.
The experiment demonstrated significant drops in blood pressure and heart rate, reinforcing the potential of bananas in combating high blood pressure. While further research is warranted, integrating bananas into one's diet may prove a palatable strategy for managing high blood pressure. Coupled with reduced salt intake, cessation of smoking, moderation in alcohol consumption, and regular exercise, banana consumption could contribute to better cardiovascular health.
Complementing these lifestyle changes, adherence to prescribed medications is paramount for individuals with hypertension. In the battle against high blood pressure, the humble banana emerges as a potent weapon, offering not only nutrition but also a flavorful defense against a silent yet formidable adversary.

subset: commoncrawl


text:
Logo Programming
A Wikibookian believes this page should be split into smaller pages with a narrower subtopic. You can help by splitting this big page into smaller ones. Please make sure to follow the naming policy. Dividing books into smaller sections can provide more focus and allow each one to do one thing well, which benefits everyone. |
A reader requests that the formatting and layout of this book be improved. Good formatting makes a book easier to read and more interesting for readers. See Editing Wikitext for ideas, and WB:FB for examples of good books. Please continue to edit this book and improve formatting, even after this message has been removed. See the discussion page for current progress. |
Logo inherits lists from Lisp, and they are its primary method of storing vectors. Arrays are also provided.
- Operators exist to convert words into lists, and lists into arrays and back again.
- This data type has the advantage over arrays that it is infinitely expandable. Data are extracted using the operations first, butfirst, last, butlast, butmember, member and item. Data elements are added using sentence fput and lput.
- A list can be considered to be a queue with the operators queue and dequeue, or a stack with the operations push and pop.
- Recursion rather than iteration is the natural method to process lists.
Example: using list primitives to extract the first five members of a list
[edit | edit source]One way would be to use iteration.
to firstfive :alist
ifelse lessp count :alist 6 [ op :alist ][make "olist []]
repeat 2 [ make "olist lput first :alist :olist make "alist bf :alist ] output :olist
show firstfive [1 2 3 4 5 6 7 8 9 ]
[1 2 3 4 5]
foreach firstfive [1 2 3 4 5 6 7 8 9 ] [show 10 - ?]
Another, more elegant way would be
to firstn :num :list
if :num = 0 [output []]
output fput (first :list) (firstn :num-1 butfirst :list)
to firstfive :list
output firstn 5 :list
This method uses recursion, and is an example of a functional rather than an imperative programming approach.
And a more general way would be
to tail :num :alist
if or not numberp :num not listp :alist [print [Error: Bad argument(s)] stop]
if not equalp 0 :num - int :num [make "num int :num]
if :num=0 [output []]
if equalp count :alist abs :num [op :alist]
if lessp count :alist abs :num [output :alist]
if :num>0 [output tail.left :num :alist]
if :num<0 [output tail.right abs :num :alist]
to tail.left :num :list
output fput (first :list) (tail.left :num-1 butfirst :list)
to tail.right :num :list
output lput (last :list) (tail.right :num-1 butlast :list)
show tail 5 [1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
show tail -5 [1 2 3 4 5 6 7 8 9]
[5 6 7 8 9]
Control structure commands
[edit | edit source]Logo provides several common control structures.
ifelse test [ do_if_true list ] [do_if_false list]
There are iteration commands
while condition [instruction list]
until condition [instruction list]
repeat number [instruction list]
Recursion is Logo's preferred processing paradigm.
Template iteration
[edit | edit source]Logo also provides list-based control structures. The basic idea is that you have two lists
OPERATION [ a list of commands ] [ many data items ]
each of the commands is applied in turn to each of the data items. There are several of these template commands with names like MAP, APPLY, FILTER, FOREACH, REDUCE and CASCADE. They represent four flavours of template iteration, known as explicit-slot, named-procedure, named-slot (or Lambda), and procedure-text.
show map [? * ? ] [ 5 6 7 ] [25 36 49 ] show filter [ (count ?) > 4 ] [ the quick brown fox jumps over the lazy dog ] [quick brown jumps] show foreach [1 2 3 4 5] [ ? * 10 ] [10 20 30 40 50]
RUN [ list of commands ] ;run a list of commands (or programs) from in a program.
Property lists
[edit | edit source]A property list is a special list where the odd number items are property names, and the even are property values. There are three commands to process property list.
pprop :listname :name :value ;to add a new pair to the list remprop :listname :name :value ;to remove a pair to the list show gprop :listname :name ;to get the matching value from the list
I/O Commands
[edit | edit source]Text may be written to the command window (output stream) using print, show
and to the graphics window using label
The standard commands are readlist readword readchar
with the normal input stream being the keyboard. In Unix tradition the input stream can be changed, so input can come from a disk file. Similarly, output can be redirected.
openread [filename] setread[filename] setreadpos nn readchar setread[] close [filename].
There are equivalent commands to change the output stream, openwrite, openappend, setwrite, setwritepos nn.
dribble [filename]
Creates a transcript of everything that is typed in or outputted to the command window.
This turns it off.
I/O commands can be applied to generate text to resemble a known bitmap, also seen in ASCII art conversion programs. An example of this, a set of crosses resembling the Mandelbrot set.
[edit | edit source]Turtle graphics is a powerful method of introducing thinking but LOGO also has a few useful Cartesian commands
home ;returns the turtle to (0,0) setx xx sety yy ; sends the turtle, still drawing to (xx,yy) seth nn ; sets the turtle on a heading or compass bearing of (nn)
Example: calculating and drawing a sundial for a given latitude
[edit | edit source]This is a typical garden dial. The graphic can be printed and transferred to wood or brass to make an accurate garden timepiece.
to dial
cs show [Type in your latitude as a whole number]
make "latitude readword ;uses keyboard input
for [i 0 6 1][
make "ang arctan product sin :latitude tan product :i 15 ;the calculation
rt :ang fd 200 bk 200 lt :ang ;draw the morning line
lt :ang fd 200 bk 200 rt :ang ;use symmetry to draw the afternoon line
pu setx -300 sety -300 seth 90 pd ;send the turtle to the bottom
fd 300 seth 270 rt 90 - :latitude fd 300 ;draw the [[style]] or [[gnomon]]
pu home pd ;tidy it up
The same code in a different Logo dialect (in this case, NetLogo, would look like this.
to dial
create-turtles 1
let latitude 38 ;Just set this manually
let ang 0
ask turtles [pu set heading ang]
foreach [0 1 2 3 4 5 6][
set ang atan ((sin latitude) * (tan (? * 15))) 1 ;the calculation
ask turtles [pd rt ang fd 10 bk 10 lt ang ;draw the morning line
lt ang fd 10 bk 10 rt ang pu ;use symmetry to draw the afternoon line
ask turtles [pu setxy -15 -15 set heading 90 pd ;send the turtle to the bottom
fd 15 set heading 270 rt (90 - latitude) fd 15 ;draw the [[style]] or [[gnomon]]
pu home pd ;tidy it up
A sundial plate must be adjusted by latitude using the formula
x= arctan( sin(latitude)*tan(HourDiff * 15) )
The Gnomon Angle = latitude.
This dial above is set for 38N, the latitude of Berkeley, California. A small correction should also be made for longitude.
MSWLogo extensions
[edit | edit source]MSWLogo supports multiple turtles, and 3D Graphics. MSWLogo allows input from COM ports and LPT ports and also hardware ports. MSWLogo also supports a windows interface thus I/O is available through this GUI- and keyboard and mouse events can trigger interrupts.
GIF animations
[edit | edit source]Simple GIF animations may also be produced on MSWlogo version 6.5 with the gifsave command. Below is an example of code to generate a simple animation.
to squareani :number setactivearea [-5 -5 105 105] ;we do not want to save the entire screen local "col setpensize [3 3] ;make it a noticeable square make "append "false ;signify that we want to start a new animation repeat :number [ cs make "col 255*(repcount-1)/(:number-1) setpc (list :col :col :col) ;change the square's color repeat 4 [ ; fd 100 rt 90 ;draw the square ] ; (gifsave "squareani.gif 5 :append 0) ;save to squareani.gif make "append "true ;from now on, we want to keep adding frames to squareani.gif ] end
Thus, with a :number variable of 15 frames, the result is given below, along with a slightly more complex example (note that this gifsave feature does not yield the same quality color gradients as Logo would save in bitmap form):
Save/Load Functions
[edit | edit source]MSWLogo and FMSLogo support saving and loading of LOGO procedures and files.
to clone make "generation :generation + 1 make "newfilename (word "reproducer :generation ".lgo) save :newfilename load :newfilename end Make "generation 0 Make "newname "reproducer1.lgo Make "startup [clone]


text:
An Interview with Peter Bradley, Director of Speakers' Corner Trust
by Ryan Black / June 28, 2012 / 1 Comment
By establishing sites for free and open discourse, Speakers' Corner Trust is working to chip away at the cynicism and indifference that can undermine democracy.
For almost 150 years the Speakers' Corner in London's Hyde Park has played host to polemic rant, heartfelt plea, healthy debate, and heckling—all in the spirit of democracy and freedom of speech. In 2004, inspired by the legacy of that public forum, a British ex-pat was able to successfully establish a similar site in Prague. Based on this success, the Speakers' Corner Trust (SCT) was founded in 2007. SCT is an international charity organization that works to promote free speech and establish free, open places for discourse in the UK and around the world.
With projects in several British cities, events in other European countries, and a growing program in Nigeria, SCT aims to reinvigorate the democratic spirit in its home country and nourish it in emerging democracies.
Sampsonia Way recently conducted this e-mail interview with Peter Bradley, former Member of Parliament and current director of the Speakers' Corner Trust. Here Bradley talks about the process of establishing a Speakers' Corner in Nigeria, the importance of face-to-face community interaction, and the work it takes to maintain an effective democracy.
How would you summarize the goals and vision of the Speakers' Corner Trust (SCT)?
Freedom of expression and the right of assembly lie at the heart of all of our civil liberties. They are the aspiration of those who struggle for freedom and the prize of those who have achieved it. But almost 150 years after the creation of the original Speakers' Corner as a platform for debate and a symbol of those freedoms, the importance we attach to them in the UK and other 'mature' democracies has diminished.
We believe that re-engaging citizens in the exchange and development of ideas and opinions is a key to rebuilding trust and participation in mature civil societies. We're trying to create new opportunities for deliberation, discourse, and debate. But we are also asking people to rise to the challenge of citizenship on the basis that democracy is only as good as we collectively make it.
I think two features distinguish what we do from other initiatives seeking to promote active citizenship. First, we have no presumption about what people want to talk about. Second, while we use the internet in our work, we believe that it's vital to bring people out of their houses and into unmediated, spontaneous personal contact so that they can express, test, and develop their—and their neighbors'—opinions face to face in real places, in real time.
"Rights are like muscles; if they're not exercised we might find they've grown weak and flabby when we need them."
Given that the countries where SCT has established sites are all places where free speech is (in principle) guaranteed, what are the advantages of designating a specific site?
In my view, it's not enough for a democratic society to simply guarantee citizens' rights. Rights are like muscles; if they're not exercised we might find they've grown weak and flabby when we need them. We can't take democracy for granted; we must constantly redefine it. We have to give it meaning by living the democratic life.
Creating a space for citizens' rights in city centers conveys a powerful symbolism. Even if we never make use of the platform for expression and engagement, knowing that when we stand in that space we are the equal of anyone else in our community is hugely empowering.
But, though the focus of our work has been in the UK, as funding allows we also work in other countries where, even if the constitution guarantees freedom of expression, there are few opportunities for the vast majority of people to practice it. We believe that Speakers' Corners can play a significant role in embedding civil rights in developing democracies and providing a forum for the public debate, which is vital to the health and progress of civil society.
That is the thinking behind the project we've been developing in Nigeria over the last three years. Now with funding from the Ford Foundation we've been able to establish an equivalent organization there so that the project is owned and managed by Nigerians, as it should be.
Nigeria is Africa's most populous country. A minority of Nigerians are fabulously wealthy, but the majority are extremely poor. There is enormous pride in being Nigerian, and in the country's potential, but there are also deep divisions, and all too frequently, violence. Corruption is endemic, yet fragile though it is, democracy is taking root. Our aim is to play a modest part in providing ordinary Nigerians the opportunity to debate issues that matter to them, participate in their own governance, hold their public servants accountable, and find new ways of avoiding or resolving conflict.
The Speakers' Corner in Prague faced some uncertainty in its early years after it became popular amongst far-right extremists, namely Neo-Nazis. How did this situation resolve? Did this inform SCT's approach at all when it came to establishing new sites or drawing up codes of conduct?
We are always asked about the risk we face in creating platforms for extremists as well as ordinary citizens. We are very clear that there cannot be freedom of speech for some but not for others. We are equally clear that depriving the majority of their rights to free expression in order to deny the few creates problems, not solutions.
So we have a very simple principle: Everyone has an equal right to free expression, within the law. Speakers' Corners do not confer rights that don't exist elsewhere. In the UK, for example, no-one would have the right to incite hatred or violence just because they were standing at a Speakers' Corner. Other than encouraging people to be considerate and courteous, our model code of conduct has very little to say about how speakers should behave. Free speech has to be genuinely free.
"It's no coincidence that extremists emerge more often from oppressive regimes…than they do from democracies."
In Prague as elsewhere, I think democrats have a duty to contest views they find distasteful or abhorrent. It's important to provide people with radical views with the opportunity not only to express them but also, hopefully, to measure and modify them against other more moderate thinking. It's no coincidence that extremists emerge more often from oppressive regimes where free expression is denied than they do from democracies.
But our experience has been that extremists rarely use the Speakers' Corners, precisely because they are only confident enough to preach to their own kind and not prepared to challenge the majority. Also, when people feel that the space is theirs, they tend to be much more positive and constructive in what they say, and more prepared to listen to and respect the views of others.
Has the organization faced any opposition from local governments or groups in establishing any of its sites? Were there any projects that you wanted to establish but couldn't?
We have found both local government and the police in the UK enthusiastic supporters of what we do; they invariably sit on local Speakers' Corner Committees. We have had to contend with very few bureaucratic hurdles in establishing Speakers' Corners.
That said, we are careful in our overseas work to avoid places where the authorities or significant groups are likely to oppose, or only pay lip service to our aims. That means that we are unlikely to be able to work where, arguably, we are most needed. We were, for example, recently considering organizing events in Hungary and Turkey similar to the one which took place in Berlin last year, but we were advised that the current conditions are not conducive to such an initiative. The last thing we want to do is parachute into a political culture about which we know too little, hold an event which may appear to be a great success, then return home, leaving local participants at risk of some kind of retribution.
We need to work with the grain, as I think we have in Nigeria. That does limit the societies we can promote projects in, but I don't think that invalidates our work. Rather it ought to remind us how precious are the freedoms we enjoy. There are so many people still struggling. We should value and cherish our democracies for all the flaws and deficiencies about which we are free to complain.
What has the public response been to these Corners, and what can the organization do to maintain an atmosphere of productive discourse?
I don't want to claim that all the Speakers' Corners we have helped develop are in regular use. Indeed, many of the events that we hope our projects encourage will take place elsewhere. But it's encouraging that wherever we have worked, there has been public enthusiasm for the project. Beneath the cynicism and the apparent indifference, there are huge reservoirs of goodwill and energy which we're trying to tap. I think that the simplicity of our proposition—that citizens should be talking to each other—and the fact that we're only seeking to restore a practice which has been common, in one form or another, in every culture since time immemorial, strikes a chord with most people.
Interestingly, we've discovered that many towns and cities in the UK used to have informal Speakers' Corners in or near market squares, which traditionally were the places where people came to exchange ideas, opinions, and ideologies until mass communication rendered them obsolete.
But, while the internet opens a window on the world, it can also slam the door on our neighbors. I believe that people do intuitively recognize the need to engage with each other face-to-face, as well as electronically. After all, if neighbors aren't talking to neighbors, they're hardly likely to be talking to their politicians either. Without those conversations and relationships, what is the basis for community?
What will SCT focus on for the future?
So long as we can fund our activities—which is a huge challenge especially in the current economic climate—we'll continue to do what we're doing in the UK and elsewhere. We will keep developing resources that we hope enable people to deliberate and debate with each other in ways that are empowering, enriching, and entertaining.
We've just launched, in a joint project with the University of Leeds, a new website that provides educational resources for teachers to help 11 to 18 year-olds acquire the speaking and listening skills they need to overcome their lack of experience and confidence. These insecurities prevent so many young people from fully engaging in their communities, schools, and workplaces. When people exercise their rights it not only makes a difference in their participation in civil society but also improves the quality of their community.
What's the most interesting or inspiring moment that you've witnessed at a Speakers' Corner?
The one which comes most readily to mind is when a ninety year-old man in Lincoln told the crowd at the Speakers' Corner that he had two things he wanted to get off his chest: The need to bring British troops home from Afghanistan as soon as possible and the duty of MPs to pass a law obliging pedestrians to walk only on the left-hand side of pavements in order to avoid collisions.
It's the unexpected and the whimsical, as well as the trenchant and passionate, at the Speakers' Corners that is so rewarding and humanizing.


text:
This is Amadalavalasas best dating site! 100% genuine online dating profiles
in Amadalavalasa singles at wootechie.com. Our premium
website provides free online dating counselling and mentoring. Find a love or find new friends to go out
with. Start meeting techies and geeks in Amadalavalasa today with our free registration and
experience world class online dating service! Amadalavalasa is full of techie men and women like
you looking for dates,lovers,friends,life partners and chat. Finding them is easy with our
free Amadalavalasa dating service. Sign up today to browse singles in Amadalavalasa with
our online dating service! start dating in Amadalavalasa today ! This is worlds first online
dating platform for computing technology experts, geeks, software engineers, and as of now its currently
FREE, where as all other dating website charges users for very simple features such as chatting. It has
so many unique features that you will going to love it. It is best for FREE Premium Features.
Why WOOTECHIE.COM?
- It is currently FREE,it provides various feature such as chatting ,sending e-mails to registered
users. - We dont have artificial profiles in our database.As you might dont know , some dating sites may have
up to 50,000 artificial users. - We have dedicated ticketing system such as service desk,to interact with registered users.
- We have user friendly features as mentioned below


text:
Barack Obama, the US president, has laid out his vision for the Middle East and North Africa during a key speech in Washington.
On the issue of Palestine, Obama said: "The borders of Israel and Palestine should be based on the 1967 lines with mutually agreed swaps, so that secure and recognised borders are established for both states.
"The Palestinian people must have the right to govern themselves, and reach their potential, in a sovereign and contiguous state.
"As for security, every state has the right to self-defence, and Israel must be able to defend itself – by itself – against any threat."
Israeli Reaction
Reacting to the address shortly afterwards, Binyamin Netanyahu, the Israeli prime minister, said a Palestinian state should not be established at the "expense of Israeli existence". He appreciated the US president's address but rejected any withdrawal tp "indefensible" 1967 borders.
Al Jazeera's Nisreen El-Shamayleh, reporting from Jerusalem, said: "In different parts of his speech Obama shifted from a view closer to the Israeli approach to negotiations and at other times closer to the Palestinian approach.
"He supported the Palestinian's idea of territorial contingency – meaning that the Israelis would have to withdraw from some of the settlement blocks in order for the Palestinian state to be viable and enjoy that contingency.
"He also talked about settlement construction had to stop. That is obviously another thing the Palestinians would like to hear from Obama.
"Obama more importantly talked about the status quo and how it was unsustainable. That is bad news for [Binyamin] Netanyahu [the Israeli prime minister].
"On the other hand, Obama supported other approaches of the Israelis that they share in common.
"In that Jerusalem will be discussed later … refugees will be discussed later … the Palestinian state has to be demilitarized … Israel must enjoy security."
Obama's speech came a day ahead of a visit to Washington by Netanyahu.
On Thursday, the Israeli interior ministry requested and received the approval of Netanyahu's office ahead of his US visit to begin holding hearings on an additional 1,550 housing units in the settlements of Har Homa and Pisgat Ze'ev, both located beyond the 1967 borders.
Obama must take "concrete steps" not issue "slogans," the Palestinian Hamas movement said on Thursday following the president's speech.
Hamas Response
"What Obama needs to do is not to add slogans but to take concrete steps to protect the rights of the Palestinian people and the Arab nation," said Sami Abu Zuhri, a Hamas spokesman.
During his address to the US state department on Thursday, Obama said Bashar al-Assad, the Syrian president, must either lead his country through a democratic transition or "get out of the way".
Obama said Syria's brutal crackdown on pro-reform activists was unacceptable.
He said Assad could no longer rule through repression and must change course if he wants international acceptance.
More than 850 people are believed to have been killed in two months of unrest in Syria.
Obama's speech came a day after he imposed sanctions on Assad and six other officials for human rights abuses during the crackdown.
The president said two leaders in the region had stepped down and that more may follow. The president also said the future of the US was bound to the region.
Iran 'Meddling'
Turning to Bahrain and Yemen, Obama said: "We must acknowledge that our friends in the region have not all reacted to the demands for change consistent with the principles that I have outlined today.
"That is true in Yemen, where President [Ali Abdullah] Saleh needs to follow through on his commitment to transfer power. And that is true, today, in Bahrain.
"We have insisted publically and privately that mass arrests and brute force are at odds with the universal rights of Bahrain's citizens, and will not make legitimate calls for reform go away.
"The only way forward is for the government and opposition to engage in a dialogue, and you can't have a real dialogue when parts of the peaceful opposition are in jail.
"The government must create the conditions for dialogue, and the opposition must participate to forge a just future for all Bahrainis."
The president also said that Iran had "tried to take advantage of the turmoil there".
Al Jazeera's Alan Fisher, reporting from Cairo, said the speech basically translated to "democracy good, repression bad".
"He slapped a few American allies, saying if people want change you can't stand in the way," Fisher said.
Economic Investment
Addressing the death of Osama bin Laden, the president said the al-Qaeda leader was a mass murderer, not a martyr, whose ideas were being rejected even before he was killed.
Turning to Libya, he said: "In Libya, we saw the prospect of imminent massacre, had a mandate for action, and heard the Libyan people's call for help.
"Had we not acted along with our NATO allies and regional coalition partners, thousands would have been killed."
Obama also laid out a major economic initiative in the Middle East to encourage democratic change in the region, beginning with Tunisia and Libya.
The president said the Overseas Private Investment Corporation, a US government agency, "will soon launch a $2bn facility to support private investment across the region".
"And we will work with allies to refocus the European Bank for Reconstruction and Development so that it provides the same support for democratic transitions and economic modernisation in the Middle East and North Africa as it has in Europe," he said,
(Al Jazeera and agencies)


text:
Editing help
This wiki uses a simplified version of the wiki syntax used by svnwiki. Below you will find an explanation of the subset that's supported by this wiki:
Text Formatting
Creating a paragraph
To create a paragraph simply enter the text. You can place a single newline anywhere in your paragraph and it will have no effect.
To split a paragraph use two consecutive newlines (an empty line).
The above two paragraphs could have been written as:
To create a paragraph simply enter the text. You can place a single newline anywhere in your paragraph and it will have no effect. To split a paragraph use two consecutive newlines (an empty line).
Creating titles
To create a title, use a line starting with two, three, four or five equal signs:
== Title Name === Sub-title Name ==== Sub-sub-title Name ===== Sub-sub-sub-title Name
If you use two equal signs, you will create a top-level title. The more equal signs you use, the less important your title will be. The levels correspond to HTML's
 up to
 tags. The first level is reserved for use by the wiki itself.
The very first title will be used as the page title of the entire wiki page. This usually appears in your browser's window title and in the search results of a search engine so it's important to choose a good title!
This wiki does not support HTML
..
 syntax for headings.
Font styles (bold, italics, technical)
To create bold text, use three apostrophes ('), as in: '''bold'''. Use two for italics: ''italics''. For type-written text, which is useful for technical documentation, use this syntax: {{text}}.
Bold and italics can be nested, but type-written text is treated as-is. This means ''{{foo}}'' works but {{''foo''}} does not. This is mainly for convenience, because often type-written text is used for identifiers and other programming-like material which can often contain strange sigils that might otherwise affect the wiki.
See also the section below about marking up code for how to mark up entire blocks of program code or technical output.
Organizing your article (Table of contents, lists, tables, horizontal lines)
Table of Contents
If you want to show the table of contents of an article, use the following code:
This will be replaced with the table of contents. You can see an example at the beginning of this page.
Lists of items
You can create lists of bullets or numbers by starting your lines with asterisks or number signs:
* Some item * Another item ** A sub item ** Another sub item **# A numbered sub sub item **# Another numbered sub sub item * The last item
The above list will be rendered as:
- Some item
- Another item
- A sub item
- Another sub item
- A numbered sub sub item
- Another numbered sub sub item
- The last item
As you can see, you can mix bullets and numbered lists any way you want.
Lists of Definitions
You can create a list of definitions by using multiple lines with the following syntax:
This is useful to give a list of terms along with their respective definitions.
; Lassie : A very intelligent dog. ; Garfield : A pessimistic cat. ; Tux : A fearsome pinguin.
This list is shown as:
- Lassie
- A very intelligent dog.
- Garfield
- A pessimistic cat.
- Tux
- A fearsome pinguin.
Using tables
You can create a table using the standard HTML syntax, based on the HTML
 tag.

Country	Number of cities

Colombia	17

Argentina	12

Brasil	31

This is shown as:
Country | Number of cities |
Colombia | 17 |
Argentina | 12 |
Brasil | 31 |
This syntax is rather restricted and clumsy; it is hoped that in a future version there will be better syntax for tables.
Horizontal dividing line
You can include an horizontal dividing line with the following markup:
This is shown as:
Creating Links
To create links use [[dst]], where dst is the link target. You can use relative or absolute URLs; a relative URL will link to a page at the same level. dst is used unchanged as the descriptive text, but the link target will be lowercased, stripped of special characters, and have spaces changed to hyphens.
If you want your link to display a text other than its target, use [[dst|Some text]]. This will be shown as: Some text. When descriptive text is provided, the link target is used without change.
To link to an egg, use
- [[name]] from within another egg page
- [[/egg/name|name]] from outside an egg page
- [[/eggref/3/name|name]] for an egg for a specific CHICKEN version (here, 3)
To link to a manual page, use
- [[/manual/Page name|Page name]] from outside a manual page
- [[/man/3/name|name]] for a man page for a specific CHICKEN version (here, 3)
Note: You can't use the plain [[Page name]] syntax for manual pages, as the page URL will be lowercased and hyphenated.
Here are some examples. Since this page is neither an egg nor a man page, we must use the full /egg or /manual syntax for those:
- [[http://www.call-cc.org/]]: http://www.call-cc.org/
- [[http://www.call-cc.org/|The CHICKEN wiki]]: The CHICKEN wiki
- [[/users/felix-winkelmann|Felix]]: Felix
- [[/manual/Unit posix|Unit posix]]: Unit posix
- [[/egg/awful|the awful egg]] : the awful egg
- [[Internals]] : Internals
- [[/tips and tricks|Tips and tricks]] : Tips and tricks
Including Images
To include images in your articles use the following text:
Here you'll need to replace URL with the URL of your image and ALT with a simple description of the image.
Example: [[image:http://www.call-cc.org/pictures/wiki/logos/chicken-small.png|CHICKEN logo]]
Renders this:
If you keep your images in the wiki repository, the base for the absolute URL is: http://code.call-cc.org/svn/chicken-eggs/wiki/. For example, an image egg-image-1.png uploaded into wiki/eggref/4 has URL http://code.call-cc.org/svn/chicken-eggs/wiki/eggref/4/egg-image-1.png
Marking up code
Syntax coloring
You can embbed code or information in many file formats or programming languages; the wiki will use the colorize egg to add syntax highlighting to it. You can use any language supported by colorize. This is a growing list.
<enscript highlight="c"> static void pinst_check () { pid_t pinst = pinst_find(); if (pinst != -1 && kill(pinst, 0) != -1) printf("%s: server alive (%d)\n", program_name, pinst); else printf("%s: server is not running\n", program_name); exit(EXIT_SUCCESS); } </enscript>
is shown as:
static void pinst_check () { pid_t pinst = pinst_find(); if (pinst != -1 && kill(pinst, 0) != -1) printf("%s: server alive (%d)\n", program_name, pinst); else printf("%s: server is not running\n", program_name); exit(EXIT_SUCCESS); }
Literal blocks of preformatted text
Sometimes you don't want any fancy formatting or interpretation at all, you just want to dump a block of preformatted text as-is onto a wiki page.
Examples include license statements, transcripts of shell sessions, code in alien languages not supported by colorize or when you're frustrated by the wiki because it keeps interpreting what you're trying to put on a page.
This is easily done by simply prefixing each line of the text you are pasting by at least one space.
Like this!
Escaping wiki interpretation
To include something in a page literally (preventing the wiki from converting it to HTML), place it inside a <nowiki> ... </nowiki> pair. This currently only has an effect on HTML output (not the other outputs supported by multidoc, so please don't rely on it too much.
Extensions for CHICKEN documentation
Tags for procedure-like definitions
The following tags are supported:
- procedure
- macro
Each of these should be used as follows:
<procedure>(string-append a b ...)</procedure>
This will be roughly rendered as follows (with some divs and spans for easy CSSing):
[procedure] (string-append a b ...)
Tags for other definitions
The following tags are also supported:
- read
- parameter
- record
- string
- class
- method
- constant
- setter
- syntax
- type
They should be used as follows:
This will be rendered roughly as follows:
[string] doctype:xhtml-1.0-strict
At https://github.com/mario-goulart/el-chicken-wiki you can find some Emacs commands to help editing this wiki.
https://github.com/wasamasa/svnwiki-mode provides a major mode for highlighting buffers using this wiki syntax.


text:
- 100%THC free
- 30 mL bottle
- Available in 100 mg, 250 mg, 500 mg, and 1,000 mg strengths
- Ingredients: 100% natural cannabidiol (CBD) isolate, food grade vegetable glycerin, propylene glycol, natural & artificial flavorings
- Made with 100% natural CBD, with full traceability from the start of extraction
- Enjoy Koi CBD Vape Juice as needed for even distribution of CBD throughout your day
- Can be added and mixed with your favorite e-liquids
- No special settings or wattage requirements
- Can be used in any vape device
- Adults—take one full dropper (approximately 20 drops or 1 mL) 1–3 times per day, or as needed
- Drip and hold underneath the tongue for 15–20 seconds before swallowing for maximum effectiveness
- Wait 3 hours after initial (first time) use to see how the level of CBD may affect you
- Serving size: 1 mL (approximately 1 full dropper)
- Servings per bottle: 30
STORAGE: Store in a cool, dry place away from excessive heat, light, and humidity in order to preserve quality.
WARNING: Not to be used during pregnancy or lactation. If you have a medical condition or take pharmaceutical drugs, please consult your physician before use. Keep out of reach from children.


text:
Unlike Us Reader. Social Media Monopolies and Their Alternatives
edito da Geert Lovink e Miriam Rash [Instituted of Network Culture, Amsterdam].
Qui potete leggerlo in pdf
About the book: The Unlike Us Reader offers a
critical examination of social media, bringing together theoretical
essays, personal discussions, and artistic manifestos. How can we
understand the social media we use everyday, or consciously choose not
to use? We know very well that monopolies control social media, but what
are the alternatives? While Facebook continues to increase its user
population and combines loose privacy restrictions with control over
data, many researchers, programmers, and activists turn towards
designing a decentralized future. Through understanding the big networks
from within, be it by philosophy or art, new perspectives emerge.
Unlike Us is a research network of artists, designers, scholars,
activists, and programmers, with the aim to combine a critique of the
dominant social media platforms with work on 'alternatives in social
media', through workshops, conferences, online dialogues, and
publications. Everyone is invited to be a part of the public discussion
on how we want to shape the network architectures and the future of
social networks we are using so intensely.
Contributors: Solon Barocas, Caroline Bassett,
Tatiana Bazzichelli, David Beer, David M. Berry, Mercedes Bunz,
Florencio Cabello, Paolo Cirio, Joan Donovan, Louis Doulas, Leighton
Evans, Marta G. Franco, Robert W. Gehl, Seda Gürses, Alexandra Haché,
Harry Halpin, Mariann Hardey, Pavlos Hatzopoulos, Yuk Hui, Ippolita,
Nathan Jurgenson, Nelli Kambouri, Jenny Kennedy, Ganaele Langlois,
Simona Lodi, Alessandro Ludovico, Tiziana Mancinelli, Andrew McNicol,
Andrea Miconi, Arvind Narayanan, Wyatt Niehaus, Korinna Patelis, PJ Rey,
Sebastian Sevignani, Bernard Stiegler, Marc Stumpel, Tiziana Terranova,
Vincent Toubiana, Brad Troemel, Lonneke van der Velden, Martin Warnke
and D.E. Wittkower.
Colophon: Editors: Geert Lovink and Miriam Rasch.
Copy-editing: Rachel Somers Miles. Design: Katja van Stiphout. Cover
Design: Giulia Ciliberto and Silvio Lorusso. Printer: Joh. Enschedé,
Amsterdam. Publisher: Institute of Network Cultures, Amsterdam.
Supported by: Create-IT applied research Amsterdam University of Applied
Sciences (Hogeschool van Amsterdam) and Stichting Democratie en Media.
To order a hard copy of the reader, fill in the form below.
Geert Lovink and Miriam Rasch (eds), Unlike Us Reader: Social Media Monopolies and Their Alternatives, Amsterdam: Institute of Network Cultures, 2013. ISBN: 978-90-818575-2-9, paperback, 384 pages.


text:
-Chalk Art Training-
LeGrand Products offers complete Training and Resources
for the Christian Chalk Artist
2024 LIVE Chalk Art Classes
Chalkmart.com is a full service site to provide all the instruction and chalk art training for the beginning chalk artist or the advanced chalk talk artist.
The LeGrand Products state-of-the-art studio provides seminars and workshops several times a year to equip Christian chalk artists for ministry. These classes afford many ideas for drawing any type of picture for gospel messages using all the colors of lecturer.s chalk and black light chalk to illustrate Bible truth.
For those not able to attend these chalk art classes, LeGrand Products provides video chalk art training resources covering all the basics of chalk art methods and materials. These DVD.s clearly explain the kinds of chalk, preparation of bogus drawing paper, easel lights, strokes, color combinations, and everything else needed to begin or advance your chalk art ministry.
Each chalk art training DVD is taught by a noted chalk artist including Ding Teuling, David Tueling, Matthew Bowman, Esther Frye, Wanda Cummings Vincent, Peggy Esher, Gloria Kohlmann, Ray Dombeck, David LeGrand and others.
The chalk art training book entitled "Chalk Art for Christian Ministry" is an e-book format so it can be instantly downloaded and ideas regularly added. Also available on this site are FREE downloadable e-books on several Bible subjects and ministry helps including Evangelism, Bible Doctrine, Teaching Methods, Biblical Interpretation, Marriage and others.
This site is continually updated for dates of future teaching and learning opportunities and resources.
945 Holland Street
Winston-Salem, NC 27101
(336) 725-2041


text:
The B.C. NDP government's cancellation of B.C. Hydro's contract power program is a step toward new ways of adding clean energy to the province's electricity grid, Energy Minister Michelle Mungall says.
B.C. Hydro has excess power now and is losing billions selling it on the North American energy market while locked into long-term contracts, but that's not the end of the need, Mungall said in an interview with Black Press Monday.
The cancellation of B.C. Hydro's "standing offer" program for run-of-river, wind, solar and biomass power projects leaves the door open for Indigenous energy developments to proceed.
"When we went forward with Site C we committed to working with Indigenous nations on future power procurement," Mungall said. "A lot of Indigenous nations have seen energy as a part of economic reconciliation, but also for remote communities to get off diesel and onto more renewable sources that they own as well."
With the Site C dam on the Peace River not scheduled to come online until 2024, new renewable projects are to be considered in the second phase of the government's B.C. Hydro review, Mungall said. That includes removing the B.C. Liberal government's ban on the utility owning and operating its own small projects, or allowing local governments to get into the power production business.
READ MORE: B.C. Hydro bailout keeps rate rise to 8.1% over five years
READ MORE: B.C.'s private power shows up as big charge on hydro bills
Mungall's home community of Nelson has its own power utility and hydro dam on the Kootenay River that supplies more than half of its own needs, buying the rest from FortisBC.
"Would it be better for local governments to develop an asset and then have an agreement with B.C. Hydro for transmission," Mungall said. "There is a variety of ways we can deliver the power that future generations are going to need."
Clean Energy B.C., the industry organization for private producers, objected to the government's characterization of billions being lost in power contracts that run for as long as 40 years. A review by a former B.C. Treasury Board official also supported the long-time NDP claim that run-of-river power comes in the spring, when B.C. Hydro's dams may be filled to overflowing with melting snow.
"Intermittence in electricity generation is an element of the equation, but B.C.'s large storage dams provide ideal backing for a system that still has far less intermittent power than Washington State, the U.K., Denmark, Germany and many other jurisdictions," Clean Energy B.C. said it its response. "Not all run-of-river hydro plants are affected by the spring freshet snow melt."
Like us on Facebook and follow us on Twitter.


text:
Via del Porto 1/A, 25080 - Moniga del Garda (ITALY)
Explore Our Location
Via del Porto 1/A, 25080 - Moniga del Garda (ITALY)
Explore Our Location
Regolamento (UE) 2016/679
Information Document EX Art.13 of E.U. regulation N.2016/679 (General Data Protection Regulation - GDPR)
Anna Holiday srl Via Dante, 7 - 25080 Moniga del Garda, email email@example.com; Phone: 0365504259 (in seguito, "Titolare"), as holder of the data processing, informs you according to �GDPR� art.13 E.U. Regulation n.2016/679 your data will be processed in the following manner and for the following purposes:
1. Processing modality
The personal data provided by you will be processed by the holder in hard copy form, electronically or by computer.
2. Purpose of the processing
Your personal data is treated without your prior expressed consent, in compliance with what required by Art. 6 lett. Paragraph 1 lett. b) of the GDPR for the following purposes:
The processing of your personal data is done through the modalities indicated in the GDPR art. 4 paragraph 1 n. 2) and in the detail: collection, registration, organisation, conservation, consultation, elaboration, modification, selection, extraction, comparison, use, interconnection, block, communication, cancellation and destruction of the data. Your personal data undergoes both hard copy and/or electronic and/or automatised process.
Ai sensi del comma 3 dell'art. 7 l'interessato ha il diritto di revocare in qualsiasi momento il proprio consenso, con le modalità di seguito riportate.
3. Conservation
The personal data given for the purposes listed above will be kept for the entire length of the contract and for the 10 years following the expiry date of the contract itself, for accounting and fiscal purposes, according to the current legislation.
4. Access to the personal data
Your data will be made accessible for the above purposes:
5. Communication of the data
Without your expressed consent ex GDPR art. 6 paragraph 1 lett. b) and c), the holder will be allowed to communicate your data for the purposes listed in point 2 to supervisory bodies and legal authorities when required to by law. Your data won�t be divulged.
6. Data Transfer
The management and the conservation of the personal data will take place on servers located in the E.U. The data won�t be subject to transfers outside the E.U. However, it is intended that the holder, if necessary, will be entitled to move the location of the servers in Italy and/or in the E.U. and/or to countries outside the E.U. In this case, the Holder ensures, as of now, that the transfer of the extra-E.U data will take place in accordance with the applicable laws by stipulating, if necessary, agreements that guarantee an adequate level of protection and or/ by adopting standard contractual clauses provided for by the E.U.
7. Nature of data provision and consequences of refusal
The provision of the data for the purposes listed in point 2 is mandatory. In their absence, we won�t be able to ensure the correct management of the contractual relationship created.
8. Rights of the involved subjects.
As involved subjects, you will have the rights listed in GDPR art.15 and precisely the rights to::
9. Procedures for the exercise of rights
At any moment, you will be able to exercise your rights by sending an email, a fax or a registered letter to the Holder�s address.
10. Holder and persons in charge
The holder of the processing is Anna Holiday Via Dante, 7 - 25180 Moniga del Garda, Indirizzo e-mail email@example.com; Phone: +390365504259
The adjourned list of the persons in charge of the processing is kept at the premises of the holder of the processing.


text: Smart website design increases conversions. Mobile responsive designs help you get found by the right audience. We have the best web designers in the world on contract, and can create custom websites that meet your needs, including eCommerce. We create brilliant, responsive designs that will drive conversions. Do you need a mobile-responsive update on your website? Is your design clunky and outdated? Please email us or use the contact form below and we can help you! … [Read more...]


text:
WASHINGTON (CNN) -- Sen. Ted Cruz urged fellow Republicans Tuesday to quickly "honor the promises" the party made over the years to repeal Obamacare.
"2010, 2014, 2016, I believe were a mandate from the voters. We're tired of the premiums going up. We're tired of deductibles going up," Cruz said at a CNN town hall debate with Sen. Bernie Sanders over the future of Obamacare. "Should Congress move swiftly to repeal Obamacare? Absolutely."
Cruz and Sanders -- two senators with diametrically opposed views of government's role in health care -- faced off at the debate moderated by CNN's Jake Tapper and Dana Bash and featuring questions from an audience consisting of both defenders and critics of the Affordable Care Act.
Cruz's call on his party to "repeal every word of Obamacare" came as the GOP is grappling with how quickly to repeal the law. The party hasn't yet reached a consensus on an alternative to the law. President Donald Trump said Sunday that a replacement plan may not be rolled out until next year.
The town hall debate underscored the many challenges surrounding efforts to dismantle the Affordable Care Act -- a sweeping health care law that covers some 20 million Americans. The evening began with each lawmaker laying out starkly different views of the controversial law.
"If you are one of 20 million Americans who finally has received health insurance, forget about it -- you're gone," Sanders warned about repealing Obamacare. "That means when you get sick, you ain't gonna be able to go to the doctor. And when you end up in the hospital, you'll be paying those bills for the rest of your life, or maybe you'll go bankrupt."
Cruz, a Texas Republican who made his name in national politics by fiercely opposing the health care law, said former President Barack Obama made a series of promises that were broken.
"If you like your doctor, you can keep your doctor," Cruz said. "Millions discovered that was not true."
Policy issues
Several policy questions are at the center of the ongoing battle about reforming Obamacare, including the popular provision to protect people with pre-existing conditions and the controversial mandate that nearly all Americans get coverage. Republican lawmakers are also wrestling with how to live up to their promises to make Obamacare more affordable and to reform Medicaid.
The CNN debate highlighted how Republicans and Democrats fundamentally disagree on many of these issues.
One woman in the audience, Neosho Ponder, spoke about her fight against breast cancer and said she was undergoing radiation treatment. Ponder expressed fear that without Obamacare, she wouldn't be able to afford health insurance.
Cruz insisted that Republican lawmakers support prohibiting insurance companies from canceling coverage for someone just because they are sick. All GOP proposals that have been introduced to replace Obamacare with, Cruz said, "prohibit companies from jacking up the insurance rates because they got sick or injured."
Sanders was incredulous.
"Ted, I cannot believe what you just said. It's a direct contradiction of everything you ran for President on," he said. "What Ted has said is he wants to get rid of all federal mandates. Did you say that a hundred times?"
"I didn't say it once," Cruz said. "Virtually all of the Republican legislation that has been filed --- that the Democrats have opposed --- maintains a continuity of coverage."
The issue of pre-existing conditions came up again when Maria Shahid Rowe, a woman who is five-months pregnant, said she was worried she wouldn't be able to get health coverage without Obamacare.
Cruz responded that Democrats are mandating that people get "every coverage on earth -- and it sounds really good."
However, "you should get the policies that meet your needs," he said.
Sanders shot back that before Obamacare, Shahid Rowe's pregnancy would have been treated as a pre-existing condition. "What Ted is really telling you is they will not guarantee coverage for you."
Another woman in the audience, Melissa Borkowski, told Sanders she simply can't afford the health services she needs. Burkowski recently had an abnormal Pap smear, but said she couldn't get additional tests because she hasn't met her out-of-pocket deductible. Her fear: that she may now have undiagnosed cancer.
Sanders, who repeatedly stressed that Obamacare was far from perfect, said it is "totally absurd" that Borkowski has such an "outrageous deductible."
"If you were in Canada, you know what? You would get the health care that you need," he said. "The idea that we have policies like that, like the one you describe, is clearly an outrage."
Cruz lamented that coverage choices have gone down "dramatically" since Obamacare became law. The senator, whose Canadian birthplace became a political controversy during his 2016 presidential run, also added: "Bernie mentions Canada quite a bit. I know quite a bit about Canadian health care. I was born there. You know Bernie, that may be the best argument against your position. Look what it produced."
Sanders joked as he gestured at Cruz: "Look what the result is."
'Employer mandate'
Another key pillar of Obamacare that came up was the so-called "employer mandate" -- the law's requirement that small businesses employing 50 or more workers to provide healthcare for its employees.
LaRonda Hunter, who owns five hair salons in Texas, said she can't afford to provide coverage to her employees because of low profit margins and that the Obamacare rule is preventing her from growing her business.
Sanders responded with what he prefaced would be "an answer you will not be happy with."
"I'm sorry, I think that in America today, everybody should have health care. And if you have more than 50 people, you know what, I think I'm afraid to tell you, but I think you will have to provide health insurance," Sanders said.
Cruz shot back that Democrats have turned small businesses into a "bad actor."
"Millions of businesses are being told by Democrats: tough luck," Sanders said. "It's one of the most damaging things about Obamacare."
One more area where the parties diverge is Medicaid. Democrats championed expanding coverage for low-income Americans by expanding Medicaid to more adults. Republicans, on the other hand, want to curtail federal responsibility for the program by capping funding.
At Tuesday night's debate, Carol Hardaway shared that she has multiple sclerosis, which created challenges in her walking, speech and vision. When the Affordable Care Act passed, Hardaway said, she moved from Texas -- a state that has not expanded Medicaid -- to Maryland, which has, and was able to receive treatments right away.
Hardaway posed a question to Cruz that Republicans are struggling to answer: Can he guarantee that people like her would continue to be protected?
Cruz referred to Medicaid as a "profoundly troubled program" akin to "rationed care."
"We should have a system that allows as many people as possible to be on the private health insurance of your choice rather than Medicaid," Cruz said, noting that wait times under the program has gone up.
But when Tapper asked Hardaway whether Cruz had answered her question, she indicated that he had not.
Drastically different approaches
Cruz and Sanders both ran unsuccessfully for president in 2016 and have their own ideas on reforming the health care system and making coverage more affordable for everyone. Their approaches, however, are drastically different.
Sanders is a proponent of a "single-payer" federal health care system, or as he refers to it: "Medicare for All." During the presidential campaign, the Vermont senator outlined a government-run program that would offer Americans comprehensive care covering everything from doctors' visits to hospital stays, to vision, dental and mental health services.
He is a proponent of hiking taxes on the wealthy to pay for his proposed system.
Cruz, meanwhile, has railed against Obamacare for years and has vowed to fully repeal "every word" of the law. The Texas firebrand made his name in national politics in 2013 when he gave a more than 20-hour marathon speech to oppose funding for the Affordable Care Act.
Taking aim at pharmaceutical industry
Despite their contrasting views on health care, there was a rare moment of agreement for the two senators: the pharmaceutical industry. Sanders asked Cruz to partner with him in taking on drug companies -- "the greediest of many greedy corporate interests in Washington" -- by supporting legislation to have Medicare negotiate prices with the industry.
"I would love for us to work together in going after big Pharma," Cruz said, though he stressed that it is the U.S. Food and Drug Administration that is enforcing an important ban.
Congressional Republicans are paving the way to repeal significant portions of Obamacare. Senior lawmakers are currently crafting an Obamacare repeal bill that requires just a simple majority of senators for approval.
But the discussions over creating an alternative to the controversial law has exposed tensions within the GOP. Many Republican lawmakers have grown increasingly wary of the political consequences of a quick and sweeping repeal of Obamacare, and some have more openly begun to discuss "repairing" the law and keeping aspects of it that are popular.
That note of caution clashes with impatience among some conservative members of the GOP conference, who fear that anything short of a swift repeal of Obamacare will be unacceptable to their constituents.
Trump, who campaigned on repealing and replacing Obamacare, said over the weekend that rolling out a new healthcare system will likely be a drawn-out process.
"I would like to say by the end of the year at least the rudiments, but we should have something within the year and the following year," Trump said.
CNN's Tami Luhby contributed to this report
™ & © 2017 Cable News Network, Inc., a Time Warner Company. All rights reserved.