# Asset 変数の定義について
| type | from other user | primitive? | remarks |
| :--: | :--: | :--: | :--: |
| uint | ADD only | primitive| |
| int | ADD only | primitive|deprecation |
| ufixed | ADD only | primitive|deprecation |
| fixed | ADD only | primitive|deprecation |
| bool | Nobody | primitive| |
| address | Nobody |primitive| should be recipient address or contract address |
| bytes | Nobody | primitive?||
| string | Nobody | primitive?||
| fixed-sized array | For each element, follow the type of the element |primitive?| |
| dynamiccally-sized array | PUSH only. For each element, follow the type of the element | referenced||
| set | PUSH only. For each element follow the type of the element | referenced|It is a set. It is needed for the representation of ERC721. Alike dynamically-sized array. |
| enums | Nobody |primitive| |
| function | Nobody |referenced| |
| struct | For each element, follow the type of the element | primitive(For each element, follow the type of the element)| |
| mapping | INSERT only. For each element, follow the type of the element |referenced| |
### ※ set 型について
集合を扱う型。内部的にはB木を使って表現される。次のメソッドが用意されている。
- `has(elm)` : elm が集合内にあるかを真偽値判定する
- `push(elm)` : elm を集合に加える
- `remove(elm)` : elm を集合から削除する
- `length` : 集合のサイズを返す
## Example
### zERC20
```solidity=
contract zERC20 {
// Mapping owner address to balances of token.
asset uint256 _balances;
uint256 _totalSupply;
...
function balanceOf(onlyContract address account) public view returns(uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(recipient != address(0), "zERC20: transfer to the zero address");
// fetch user state value or sender contract state if not others happened error.
uint256 senderBalance = _balances[msg.sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
// output state diff `(txHash, senderOnetimeAddress, - amount)` or change contract state
_balances[msg.sender] = senderBalance - amount;
// output state diff `(txHash, recipientAddress, + amount)` or change contract state
_balances[recipient] += amount;
// output event (senderOnetimeAddress or sender contract address, recipienetAddress, amount);
emit Transfer(msg.sender, recipient, amount);
}
function transferFrom(address recipient, uint256 amount) returns (bool) {
require(recipient != address(0), "zERC20: transfer to the zero address");
// fetch user state value if not state value error.
uint256 senderBalance = _balances[tx.origin];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
// output state diff `(txHash, senderOnetimeAddress, - amount)`
_balances[tx.origin] = senderBalance - amount;
// output state diff `(txHash, recipientAddress, + amount)` or change contract state
_balances[recipient] += amount;
// output event (senderOnetimeAddress, recipienetAddress, amount);
emit Transfer(tx.origin, recipient, amount);
}
...
}
```
### zERC721
```solidity=
contract zERC721 {
// Mapping from owner address to token ID set
asset set _owns;
// Mapping owner address to token count
asset uint256 _balances;
function transfer(
address to,
uint256 tokenId
) public returns (bool) {
require(_owns.has(msg.sender), "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_balances[msg.sender] -= 1;
_balances[to] += 1;
_owns[msg.sender].remove(tokenId);
_owns[to].push(tokenId);
emit Transfer(from, to, tokenId);
}
function transferFrom(
address to,
uint256 tokenId
) public returns (bool) {
require(_owns.has(tx.origin), "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_balances[tx.origin] -= 1;
_balances[to] += 1;
_owns[tx.origin].remove(tokenId);
_owns[to].push(tokenId);
emit Transfer(from, to, tokenId);
}
}
```
### zERC1155
```solidity=
contract zERC1155 {
// Mapping from account to [from token ID to account balances]
asset mapping(uint256 => uint256) _balances;
function safeTransfer(
address to,
uint256 tokenId,
uint256 amount
) public returns (bool) {
require(to != address(0), "ERC1155: transfer to the zero address");
uint256 fromBalance = _balances[msg.sender][tokenId];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[msg.sender][tokenId] = fromBalance - amount;
_balances[to][tokenId] += amount;
emit TransferSingle(from, to, tokenId, amount);
}
function transferFrom(
address to,
uint256 tokenId,
uint256 amount
) public returns (bool) {
require(to != address(0), "ERC1155: transfer to the zero address");
uint256 fromBalance = _balances[tx.origin][tokenId];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[tx.origin][tokenId] = fromBalance - amount;
_balances[to][tokenId] += amount;
emit TransferSingle(from, to, tokenId, amount);
}
function safeBatchTransfer(
address to,
uint256[] tokenIds,
uint256[] amounts
) public returns (bool) {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[msg.sender][tokenId];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[msg.sender][tokenId] = fromBalance - amount;
_balances[to][tokenId] += amount;
}
emit TransferSingle(from, to, tokenId, amount);
}
function safeBatchTransferFrom(
address to,
uint256[] tokenIds,
uint256[] amounts
) public returns (bool) {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[tx.origin][tokenId];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[tx.origin][tokenId] = fromBalance - amount;
_balances[to][tokenId] += amount;
}
emit TransferSingle(from, to, tokenId, amount);
}
}
```
###### tags: `zkEVM` `Zolidity` `secret contract`