FA1.2 Lorentz
Створення контракту на базі стандарту токену FA1.2 Tezos блокчейна

Вступ до lorentz-contract-param

lorentz-contract-metadata - є версією FA1.2 з метаданими FA2.
Більше інформації за стандартом метаданих FA2 може бути знайдено в TZIP-12.
Встановіть інструментиlorentz-contract-metadata слідуючи iнструкціям з встановлення lorentz-contract-metadata.

Створення смарт-контракту

Контракт стандарту FA1.2 слід буде ініціалізувати з наступними параметрами зберігання:
1
Pair
2
{} -- Empty ledger big_map
3
(Pair
4
"$ALICE_ADDRESS" -- Administrator address
5
(Pair
6
False -- Is all activity currently paused? (no)
7
0 -- Total supply of tokens
8
)
9
)
Copied!
А також мати вбудовані мета-параметри:
  • symbol: string
  • name: string
  • decimals: nat, кількість цифр після десяткової точки при виведенні.
  • extras: map string string, всі інші мета-параметри
Важливо відзначити: метадані FA2 також включають nat значення: token_id яке визначено як 0 для контрактів з єдиним токеном, таких як FA1.2
У цьому прикладі ми будемо використовувати:
  • symbol: TOK
  • name: Token
  • decimals: 0
  • extras: {}
Замість того, щоб надавати параметри контракту в сирому вигляді на мові Michelson, ми можемо використовувати lorentz-contract-metadata, щоб згенерувати їх.
Щоб створити контракт, запустіть наступний код:
1
$ tezos-client --wait none originate contract ManagedLedger \
2
transferring 0 from $ALICE_ADDRESS running \
3
"$(lorentz-contract-metadata Metadata print \
4
--token-symbol "TOK" \
5
--token-name "Token" \
6
--token-decimals 0 \
7
--oneline)" \
8
--init "$(lorentz-contract-metadata Metadata init \
9
--admin $ALICE_ADDRESS \
10
--initial-ledger '[]')" --burn-cap 5.033 --force
11
12
Waiting for the node to be bootstrapped before injection...
13
Current head: BLoWu4vMmzZb (timestamp: 2020-03-31T19:35:39-00:00, validation: 2020-03-31T19:36:23-00:00)
14
Node is bootstrapped, ready for injecting operations.
15
Estimated gas: 142649 units (will add 100 for safety)
16
Estimated storage: 5033 bytes added (will add 20 for safety)
17
Operation successfully injected in the node.
18
Operation hash is 'onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC'
19
NOT waiting for the operation to be included.
20
Use command
21
tezos-client wait for onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC to be included --confirmations 30 --branch BLoWu4vMmzZbwYkJG8VimgkLis2xS3YSFAMFi4jEuWJ9mHVmKP5
22
and/or an external block explorer to make sure that it has been included.
23
This sequence of operations was run:
24
Manager signed operations:
25
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
26
Fee to the baker: ꜩ0.001259
27
Expected counter: 623911
28
Gas limit: 10000
29
Storage limit: 0 bytes
30
Balance updates:
31
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001259
32
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001259
33
Revelation of manager public key:
34
Contract: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
35
Key: edpkuPTVBFtbYd6gZWryXypSYYq6g7FvyucwphoU78T1vmGkbhj6qb
36
This revelation was successfully applied
37
Consumed gas: 10000
38
Manager signed operations:
39
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
40
Fee to the baker: ꜩ0.019169
41
Expected counter: 623912
42
Gas limit: 142749
43
Storage limit: 5053 bytes
44
Balance updates:
45
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.019169
46
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.019169
47
Origination:
48
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
49
Credit: ꜩ0
50
Script:
51
{...}
52
Initial storage:
53
(Pair {} (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 0)))
54
No delegate for this contract
55
This origination was successfully applied
56
Originated contracts:
57
KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
58
Storage size: 4776 bytes
59
Updated big_maps:
60
New map(735) of type (big_map address (pair nat (map address nat)))
61
Paid storage size diff: 4776 bytes
62
Consumed gas: 142649
63
Balance updates:
64
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ4.776
65
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
66
67
New contract KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me originated.
Copied!
Зверніть увагу, що ми скорочуємо великий вміст скрипта за допомогою {...}
Створіть змінну для нової адреси контракту:
1
FA12_ADDRESS=KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
Copied!
Зверніть увагу, що на включення наших операцій в мережу блокчейнов може знадобитися деякий час (зазвичай не більше кількох хвилин). Щоб перевірити статус операції, використовуйте її хеш для отримання квитанції:
1
$ tezos-client get receipt for onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC
2
3
Operation found in block: BLBBGyNZKoi7hrZeszBUmjtfeg8JcjdZMxpUyVTPj24cyyRJQeF (pass: 3, offset: 1)
4
Manager signed operations:
5
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
6
Fee to the baker: ꜩ0.001259
7
Expected counter: 623911
8
Gas limit: 10000
9
Storage limit: 0 bytes
10
Balance updates:
11
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001259
12
fees(tz1RomaiWJV3NFDZWTMVR2aEeHknsn3iF5Gi,150) ... +ꜩ0.001259
13
Revelation of manager public key:
14
Contract: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
15
Key: edpkuPTVBFtbYd6gZWryXypSYYq6g7FvyucwphoU78T1vmGkbhj6qb
16
This revelation was successfully applied
17
Consumed gas: 10000
18
Manager signed operations:
19
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
20
Fee to the baker: ꜩ0.019169
21
Expected counter: 623912
22
Gas limit: 142749
23
Storage limit: 5053 bytes
24
Balance updates:
25
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.019169
26
fees(tz1RomaiWJV3NFDZWTMVR2aEeHknsn3iF5Gi,150) ... +ꜩ0.019169
27
Origination:
28
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
29
Credit: ꜩ0
30
Script:
31
{...}
32
Initial storage:
33
(Pair {} (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 0)))
34
No delegate for this contract
35
This origination was successfully applied
36
Originated contracts:
37
KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
38
Storage size: 4776 bytes
39
Updated big_maps:
40
New map(735) of type (big_map address (pair nat (map address nat)))
41
Paid storage size diff: 4776 bytes
42
Consumed gas: 142649
43
Balance updates:
44
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ4.776
45
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
Copied!

Перегляди

Коли параметр контракту має не одиничний тип повернення, наприклад Get Total Supply, який повертає загальну кількість токенів, сам контракт повинен мати можливість зберігати результат в якомусь місці. Наприклад, інший контракт може приймати значення результату.
Для наступних прикладів нам потрібні контракти, що приймають значенняaddress, nat та token_metadata:

Для nat

1
$ tezos-client --wait none originate contract nat_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter nat ; storage nat ; code { CAR ; NIL operation ; PAIR } }" \
3
--init 0 --burn-cap 0.295
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BKspjAccRQML (timestamp: 2020-03-31T19:40:49-00:00, validation: 2020-03-31T19:41:12-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 10909 units (will add 100 for safety)
9
Estimated storage: 295 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'onfjhheM6UMKwGYbr93a1XiJMEFUa4GyCgxfWJUvZrdGQVrL5RC'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for onfjhheM6UMKwGYbr93a1XiJMEFUa4GyCgxfWJUvZrdGQVrL5RC to be included --confirmations 30 --branch BKspjAccRQMLX8JFRtGUzRzenRnBStZiyPWigNihmUmWq3nwyf1
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001368
20
Expected counter: 623913
21
Gas limit: 11009
22
Storage limit: 315 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001368
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001368
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter nat ; storage nat ; code { CAR ; NIL operation ; PAIR } }
31
Initial storage: 0
32
No delegate for this contract
33
This origination was successfully applied
34
Originated contracts:
35
KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34
36
Storage size: 38 bytes
37
Paid storage size diff: 38 bytes
38
Consumed gas: 10909
39
Balance updates:
40
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.038
41
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
42
43
New contract KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34 originated.
Copied!

Для address

1
$ tezos-client --wait none originate contract address_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter address ; storage address ; code { CAR ; NIL operation ; PAIR } }" \
3
--init "\"$ALICE_ADDRESS\"" --burn-cap 0.32
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BKveReSTZqs9 (timestamp: 2020-03-31T19:46:17-00:00, validation: 2020-03-31T19:46:29-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 11314 units (will add 100 for safety)
9
Estimated storage: 320 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'oo8CFWkqaRuV4UGm6Ng87WJNYnU3q4YjC1txQcngF4BiF2URQ1V'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for oo8CFWkqaRuV4UGm6Ng87WJNYnU3q4YjC1txQcngF4BiF2URQ1V to be included --confirmations 30 --branch BKveReSTZqs9u1hCQzubvS2zm5c3vpeRjxNHnphpsULhNgwjgAZ
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001448
20
Expected counter: 623914
21
Gas limit: 11414
22
Storage limit: 340 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001448
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001448
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter address ;
31
storage address ;
32
code { CAR ; NIL operation ; PAIR } }
33
Initial storage: "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
34
No delegate for this contract
35
This origination was successfully applied
36
Originated contracts:
37
KT1LHvWNJhjGBehhNjd6BeNd1bzJkxhDd4fJ
38
Storage size: 63 bytes
39
Paid storage size diff: 63 bytes
40
Consumed gas: 11314
41
Balance updates:
42
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.063
43
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
44
45
New contract KT1LHvWNJhjGBehhNjd6BeNd1bzJkxhDd4fJ originated.
Copied!

Для token_metadata

Спочатку визначимо:
1
TOKEN_METADATA_TYPE="(list (pair (nat %token_id) (pair (string %symbol) (pair (string %name) (pair (nat %decimals) (map %extras string string))))))"
Copied!
1
$ tezos-client --wait none originate contract metadata_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter $TOKEN_METADATA_TYPE ; storage $TOKEN_METADATA_TYPE ; code { CAR ; NIL operation ; PAIR } }" \
3
--init '{Pair 0 (Pair "SYMBOL" (Pair "NAME" (Pair 0 {})))}' --burn-cap 0.493 --force
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BLFoMNaKmThy (timestamp: 2020-03-31T20:40:53-00:00, validation: 2020-03-31T20:41:04-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 14859 units (will add 100 for safety)
9
Estimated storage: 493 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'opBNgPdvWG6siEEZTFdZXJgpm6gVF6SeZLjR7HJwab2BFjoPoWY'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for opBNgPdvWG6siEEZTFdZXJgpm6gVF6SeZLjR7HJwab2BFjoPoWY to be included --confirmations 30 --branch BLFoMNaKmThye5b5qa5yJA2hzNWNhtu6c1wvz84xCg3d3oaa3Pg
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001961
20
Expected counter: 623925
21
Gas limit: 14959
22
Storage limit: 513 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001961
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001961
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter
31
(list (pair (nat %token_id)
32
(pair (string %symbol)
33
(pair (string %name) (pair (nat %decimals) (map %extras string string)))))) ;
34
storage
35
(list (pair (nat %token_id)
36
(pair (string %symbol)
37
(pair (string %name) (pair (nat %decimals) (map %extras string string)))))) ;
38
code { CAR ; NIL operation ; PAIR } }
39
Initial storage: { Pair 0 (Pair "SYMBOL" (Pair "NAME" (Pair 0 {}))) }
40
No delegate for this contract
41
This origination was successfully applied
42
Originated contracts:
43
KT1MRPDw2zXGPdL8CrzSaFS9jiqUDM8tpPNn
44
Storage size: 236 bytes
45
Paid storage size diff: 236 bytes
46
Consumed gas: 14859
47
Balance updates:
48
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.236
49
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
50
51
New contract KT1MRPDw2zXGPdL8CrzSaFS9jiqUDM8tpPNn originated.
Copied!
Примітка: вам може знадобитися встановити / збільшити ліміт запису, щоб дозволити створення контракту(ів), наприклад:
1
$ tezos-client --wait none originate contract address_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter address ; storage address ; code { CAR ; NIL operation ; PAIR } }" \
3
--init "\"$ALICE_ADDRESS\"" --burn-cap 0.0001 --dry-run
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BLY4388F8VTU (timestamp: 2019-08-30T17:03:46-00:00, validation: 2019-08-30T17:04:08-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Fatal error:
9
The operation will burn ꜩ0.32 which is higher than the configured burn cap (ꜩ0.0001).
10
Use `--burn-cap 0.32` to emit this operation.
Copied!
Потім за допомогою tezos-client get receipt for [Operation hash] для кожного хешу операції, зберегти адреси контрактів в змінних:
1
NAT_STORAGE_ADDRESS="KT1.."
2
ADDRESS_STORAGE_ADDRESS="KT1.."
3
METADATA_STORAGE_ADDRESS="KT1.."
Copied!
Потім ви можете отримати доступ до збережених значень за допомогою наступних двох команд для nat і address відповідно:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
4
5
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
6
7
"tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
Copied!

Взаємодії за допомогою тезос-клієнта

Команди для взаємодії з нашим екземпляром контракту ManagedLedger з використанням tezos-client і lorentz-contract-param слідують одному і тому ж шаблону зі зміною тільки декількох параметрів в залежності від того, яку точку входу в контракт ми викликаємо. На прикладі getTotalSupply виклик буде виглядати так:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS \
2
--arg "$(lorentz-contract-metadata \
3
Metadata getTotalSupply \
4
--callback-contract $NAT_STORAGE_ADDRESS)"
Copied!
Давайте запишемо шаблон в функцію оболонки:
1
$ fa12(){tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --burn-cap 0.5 --arg "$(lorentz-contract-metadata Metadata [email protected];)"}
Copied!
Зверніть увагу, що тут ми також встановлюємо --burn-cap заглушку.

Отримання загальної пропозиції через getTotalSupply

Визначивши функцію fa12, ми можемо тепер викликати точку входу контракту getTotalSupply наступним чином:
1
$ fa12 getTotalSupply --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Висновок цієї команди виглядає так:
1
Waiting for the node to be bootstrapped before injection...
2
Current head: BLkmHajH44cY (timestamp: 2020-03-31T19:51:39-00:00, validation: 2020-03-31T19:52:00-00:00)
3
Node is bootstrapped, ready for injecting operations.
4
Estimated gas: 132442 units (will add 100 for safety)
5
Estimated storage: no bytes added
6
Operation successfully injected in the node.
7
Operation hash is 'oothedERdD6hkD45S9ncrnS3u6ienY3px92iSyfjAd4ijLtUjqs'
8
NOT waiting for the operation to be included.
9
Use command
10
tezos-client wait for oothedERdD6hkD45S9ncrnS3u6ienY3px92iSyfjAd4ijLtUjqs to be included --confirmations 30 --branch BLkmHajH44cYRFJzTqmdBnh3efUHGQnjZyKbjAmBB6bgeQbuXzV
11
and/or an external block explorer to make sure that it has been included.
12
This sequence of operations was run:
13
Manager signed operations:
14
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
15
Fee to the baker: ꜩ0.013564
16
Expected counter: 623915
17
Gas limit: 132542
18
Storage limit: 0 bytes
19
Balance updates:
20
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.013564
21
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.013564
22
Transaction:
23
Amount: ꜩ0
24
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
25
To: KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
26
Parameter: (Left (Right (Right (Right (Pair Unit "KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34")))))
27
This transaction was successfully applied
28
Updated storage:
29
(Pair 735 (Pair 0x0000aad02222472cdf9892a3011c01caf6407f027081 (Pair False 0)))
30
Storage size: 4776 bytes
31
Consumed gas: 121125
32
Internal operations:
33
Transaction:
34
Amount: ꜩ0
35
From: KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
36
To: KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34
37
Parameter: 0
38
This transaction was successfully applied
39
Updated storage: 0
40
Storage size: 38 bytes
41
Consumed gas: 11317
Copied!
Всі команди в разі успіху дають однаковий вивід, тому ми опускаємо його в наступних прикладах.
Значення загальної кількості токенів буде записано в просте сховище контракту за адресою NAT_STORAGE_ADDRESS, яку ми можемо побачити за допомогою наступної команди (як тільки мережа tezos включить наші операції):
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Отримання даних адміністратора

Щоб отримати адресу поточного адміністратора, спочатку помістіть його в контракт ADDRESS_STORAGE_ADDRESS:
1
$ fa12 getAdministrator --callback-contract $ADDRESS_STORAGE_ADDRESS
Copied!
Як і у випадку з NAT_STORAGE_ADDRESS, ми можемо отримати доступ до результату, використовуючи get contract storage for і переконатися, що він відповідає адресі Аліси, використовуючи echo $ ALICE_ADDRESS:
1
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
2
3
"tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
4
5
$ echo $ALICE_ADDRESS
6
7
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
Copied!

Отримання балансу

Щоб отримати баланс токенів для певної адреси (зберігається в контракті NAT_STORAGE_ADDRESS) використовуйте:
1
$ fa12 getBalance --owner $ALICE_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Потім ми можемо отримати доступ до результату, використовуючи:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Отримання метаданих

Щоб отримати метадані токена для конкретного контракту в стилі FA1.2 + FA2 (що зберігається в METADATA_STORAGE_ADDRESS) використовуйте:
1
$ fa12 getMetadata --callback-contract $METADATA_STORAGE_ADDRESS
Copied!
Потім ми можемо отримати доступ до результату, використовуючи:
1
$ tezos-client get contract storage for $METADATA_STORAGE_ADDRESS
2
3
{ Pair 0 (Pair "TOK" (Pair "Token" (Pair 0 {}))) }
Copied!

Отримання дозволів

Щоб отримати дозвіл Боба на зняття коштів з рахунку Аліси, де адреса Боба - BOB_ADDRESS використовуйте:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Потім ми можемо отримати доступ до результату, використовуючи:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Переведення

З GetBalance вище ми знаємо, що у Alice немає токенів.
Щоб передати токени від Аліси Бобу, нам спочатку потрібно дати Алісі кілька токенів. Ми можемо зробити це, випустивши 5 токенів і призначивши їх Алісі (див. Підрозділ «Випуск токена» нижче):
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
Copied!
Щоб передати 2 токена від Аліси Бобу:
1
$ fa12 transfer --value 2 --from $ALICE_ADDRESS --to $BOB_ADDRESS
Copied!
Перевірте баланс Боба:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
2
Copied!

Підтвердження операцій

Щоб Аліса дозволила Бобу зняти до 2 токена з її адреси:
1
$ fa12 approve --value 2 --spender $BOB_ADDRESS
Copied!
Потім ми можемо перевірити отриманий дозвіл, використовуючи:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
2
Copied!
Якщо ми спробуємо встановити інший дозвіл (4) для зняття Бобом токенов з рахунку Аліси, ми зазнаємо невдачі:
1
$ fa12 approve --value 4 --spender $BOB_ADDRESS
2
...
3
At line 294 characters 85 to 93,
4
script reached FAILWITH instruction
5
with (Pair "UnsafeAllowanceChange" 2)
Copied!
Контракт FA1.2 забороняє пряму зміну дозволу з ненульового значення на інше ненульове значення, щоб запобігти відомій уразливісті до зміни дозволів.
Отже, щоб зробити таку зміну дозволу можливим, нам потрібно спочатку встановити його в 0:
1
$ fa12 approve --value 0 --spender $BOB_ADDRESS
Copied!
а потім встановити нове значення 4:
1
$ fa12 approve --value 4 --spender $BOB_ADDRESS
Copied!
тепер операція не призведе до провалу.
Зверніть увагу, що, в цілому, це не зовсім безпечно, тому що Боб міг витратити частину отриманого від Аліси в проміжку часу між транзакцією, коли ми спочатку встановили дозвіл на 2, і тією, де воно було встановлено в 0.
Щоб правильно розрахувати нове значення, відмінне від 0, нам потрібно було б просканувати всі транзакції, що відбулися між цими двома, але тут ми, для простоти, припустимо, що їх не було.
Тепер ми можемо знову перевірити дозвіл і побачити, що він змінився:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
4
Copied!

Випуск токена

Щоб випустити 5 токенов і призначити їх Алісі:
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
2
$ fa12 getBalance --owner $ALICE_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
3
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
4
5
Copied!

Спалювання токена

Якщо ви покроково йшли по цьому керівництву, на даний момент в обліковому запису Боба повинно бути 3 токена. Якщо цього не відбулося, додайте хоча б 1 за допомогою Transfer або Mint.
Перед спалюванням ми спочатку додаємо 2 токена на аккаунт Боба:
1
$ fa12 mint --value 2 --to $BOB_ADDRESS
Copied!
Ми можемо гарантувати, що у Боба є як мінімум 3 токена, використовуючи:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
5
Copied!
Нарешті, ми можемо спалити 2 токена Боба, використовуючи:
1
$ fa12 burn --value 2 --from $BOB_ADDRESS
Copied!
І тоді ми можемо підтвердити, що два токена були відняті з аккаунта Боба:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
3
Copied!

Призупинення контракту

Щоб призупинити контракт:
1
$ fa12 setPause --paused True
Copied!
Ми можемо перевірити, чи призупинено контракт, використовуючи:
1
$ tezos-client get contract storage for $FA12_ADDRESS
2
Pair 0 (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair True 7))
Copied!
Значення True вказує, що він припинений, значення False вказує, що він не призупинений.
Передачі і підтвердження відключені, поки контракт призупинений. Спробуйте:
1
$ fa12 transfer --value 1 --from $ALICE_ADDRESS --to $BOB_ADDRESS
Copied!
Команда видає наступний результат (для стислості опускаючи включений в контракт код Майкельсона):
1
Node is bootstrapped, ready for injecting operations.
2
This simulation failed:
3
Manager signed operations:
4
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
5
Fee to the baker: ꜩ0
6
Expected counter: 32
7
Gas limit: 800000
8
Storage limit: 60000 bytes
9
Transaction:
10
Amount: ꜩ0
11
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
12
To: KT1P33YQj5LQGBAYxvpXCsa6v2BXJ8N4i6PF
13
Parameter: (Left (Left (Left (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
14
(Pair "tz1aSkwEot3L2kmUvcoxzjMomb9mvBNuzFK6" 1)))))
15
This operation FAILED.
16
17
Runtime error in contract KT1P33YQj5LQGBAYxvpXCsa6v2BXJ8N4i6PF:
18
001: { parameter
19
...
20
585: NIL operation ;
21
586: PAIR } } } } } }
22
At line 23 characters 87 to 95,
23
script reached FAILWITH instruction
24
with (Pair "TokenOperationsArePaused" Unit)
25
Fatal error:
26
transfer simulation failed
Copied!
Щоб відновити контракт:
1
$ fa12 setPause --paused False
Copied!
1
$ tezos-client get contract storage for $FA12_ADDRESS
2
3
Pair 0 (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 7))
Copied!

Установка нового адміністратора

Щоб зробити Боба новим адміністратором:
1
$ fa12 setAdministrator --new-administrator-address $BOB_ADDRESS
Copied!
Ми можемо переконатися, що адміністратор був оновлений, використовуючи:
1
$ fa12 getAdministrator --callback-contract $ADDRESS_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
3
"tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir"
Copied!
1
$ echo $BOB_ADDRESS
2
3
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Copied!
Наша функція оболонки fa12 налаштована для виклику операцій з використанням $ALICE_ADDRESS, так що тепер, коли $ALICE_ADDRESS більше не є перевіреним адміністратором, спроби викликати точки входу адміністратора з цієї адреси зазнають невдачі:
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
2
...
3
586: PAIR } } } } } }
4
At line 447 characters 86 to 94,
5
script reached FAILWITH instruction
6
with (Pair "SenderIsNotAdmin" Unit)
Copied!

Взаємодія з використанням PyTezos

Встановлення PyTezos

Якщо ви використовуєте Debian або Ubuntu Linux, встановіть залежності за допомогою apt:
1
sudo apt install libsodium-dev libsecp256k1-dev libgmp-dev
Copied!
У Arch Linux встановіть ці пакети за допомогою pacman:
1
sudo pacman libsodium libsec256k1 gmp
Copied!
Вам також може знадобитися встановити python-wheel
В іншому випадку, якщо у вас Mac OS, встановіть пакети з допомогою brew:
1
brew tap cuber/homebrew-libsecp256k1
2
brew install libsodium libsecp256k1 gmp
Copied!
Потім встановіть PyTezos за допомогою pip3:
1
pip3 install pytezos
Copied!

Створення контракту

Припускаючи, що $ALICE_ADDRESS визначено, ми можемо створити копію FA1.2 майже так само, як з lorentz-contracts.
Примітка: Див. Посібник з налаштування клієнта, щоб створити гаманець і визначити $ALICE_ADDRESS.
Почнемо з відкриття python3, установки key і shell і вказівки fa12 як контракту:
Примітка: замініть ~/Downloads/tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr.json на шлях до файлу .json вашого гаманця.
1
$ python3
2
Python 3.7.4 (default, Sep 7 2019, 18:27:02)
3
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
4
Type "help", "copyright", "credits" or "license" for more information.
5
>>> from pytezos import pytezos
6
>>> pytezos = pytezos.using(key='~/Downloads/tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr.json', shell='babylonnet')
7
8
>>> alice_address = 'tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr'
9
>>> bob_address = 'tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm'
10
>>> nat_storage_address = 'KT1J4mhVAaMYAPC4aPEkhC9i48PHBHxavkJ2'
Copied!
Потім ми визначаємо Contract з копії ManagedLedger.tz з анотаціями:
1
>>> from pytezos import Contract
2
>>> import requests
3
4
>>> contract_url = 'https://gitlab.com/tzip/tzip/raw/16ca4fbb60f2ab52958136b76a1d12b342beba58/Proposals/TZIP-0007/ManagedLedger.tz'
5
>>> fa12src = Contract.from_michelson(requests.get(contract_url).text)
Copied!
Нам потрібно створити початкове сховище для створення контракту.
Щоб допомогти з цим, ми можемо переглянути схему сховища контракту:
1
>>> fa12src.storage
2
<pytezos.michelson.contract.ContractStorage object at 0x10d984590>
3
4
$storage:
5
{
6
"ledger": { $address : $ledger_item , ... } /* big_map */,
7
"admin": $address,
8
"paused": bool,
9
"totalSupply": $nat
10
}
11
12
$ledger_item:
13
{
14
"balance": $nat,
15
"approvals": { $address : $nat , ... }
16
}
17
18
$nat:
19
int /* Natural number */
20
21
$address:
22
string /* Base58 encoded `tz` or `KT` address */
23
24
25
Helpers
26
.big_map_decode()
27
.big_map_diff_decode()
28
.big_map_diff_encode()
29
.big_map_id()
30
.big_map_init()
31
.big_map_query()
32
.decode()
33
.default()
34
.encode()
Copied!
Потім ми вибираємо початкові значення сховища і кодуємо їх для підготовки до створення контракту:
1
>>> init_storage = fa12src.storage.encode({
2
...: "ledger": {},
3
...: "admin": pytezos.key.public_key_hash(),
4
...: "paused": False,
5
...: "totalSupply": 0
6
...: } )
Copied!
Потім ми створюємо контракт:
1
>>> origination_op = pytezos.origination(script=dict(code=fa12src.code, storage=init_storage)).autofill().sign().inject()
2
>>> origination_hash = origination_op['hash']
3
>>> origination_hash
4
'opXxLwE3j9ZY9Rv99Pomh6u7SonKAoywzpU6KkdWtFryUhBbXdP'
Copied!
Однак створення контракту не повертає адресу отриманого контракту, тому нам потрібно знайти нашу завершену операцію в мережі і отримати з неї адресу контракту:
1
>>> opg = pytezos.shell.blocks[-5:].find_operation(origination_hash)
2
>>> contract_id = opg['contents'][0]['metadata']['operation_result']['originated_contracts'][0]
3
>>> contract_id
4
'KT1GV7wkUgZpEznQ48VR1UUSgXAU5Lk1SfpH'
5
6
>>> fa12 = pytezos.contract(contract_id)
Copied!
Примітка: команда find_operation може завершитися помилкою, якщо операція ще не була оброблена:
1
>>> opg = pytezos.shell.blocks[-5:].find_operation(origination_op)
2
Traceback (most recent call last):
3
File "<stdin>", line 1, in <module>
4
File "/usr/local/lib/python3.7/site-packages/pytezos/tools/docstring.py", line 67, in __call__
5
return method(self.class_instance, *args, **kwargs)
6
File "/usr/local/lib/python3.7/site-packages/pytezos/rpc/search.py", line 207, in find_operation
7
raise StopIteration(operation_group_hash)
8
StopIteration: oonhxpbH9Jc7fpbjfzvfbetppEBnjUTFmkbziVFV3B5KhjVdzpd
Copied!

Перегляд схеми контракту

Ми можемо переглянути схему параметрів контракту, щоб дізнатися, які точки входу підтримує контракт і які їхні аргументи:
1
>>> fa12.contract.parameter
2
<pytezos.michelson.contract.ContractParameter object at 0x10ce5d910>
3
4
$parameter:
5
{ "transfer": $transfer } ||
6
{ "approve": $approve } ||
7
{ "getAllowance": [ $address , $address , $contract (nat) ] } ||
8
{ "getBalance": [ $address , $contract (nat) ] } ||
9
{ "getTotalSupply": [ $unit , $contract (nat) ] } ||
10
{ "setPause": bool /* setPause */ } ||
11
{ "setAdministrator": $address /* setAdministrator */ } ||
12
{ "getAdministrator": [ $unit , $contract (address) ] } ||
13
{ "mint": $mint } ||
14
{ "burn": $burn }
15
16
$burn:
17
{
18
"from": $address,
19
"value": $nat
20
}
21
22
$mint:
23
{
24
"to": $address,
25
"value": $nat
26
}
27
28
$approve:
29
{
30
"spender": $address,
31
"value": $nat
32
}
33
34
$transfer:
35
{
36
"from": $address,
37
"to": $address,
38
"value": $nat
39
}
40
41
$contract:
42
string /* Base58 encoded `KT` address */
43
44
$nat:
45
int /* Natural number */
46
47
$address:
48
string /* Base58 encoded `tz` or `KT` address */
49
50
$unit:
51
None /* Void */
52
53
54
Helpers
55
.decode()
56
.encode()
57
.entries()
Copied!

Взаємодія з FA1.2

Нарешті, використовуючи схему параметрів, ми можемо виконати передачу, використовуючи наступні кроки:
  • Выпуск 5 токенів на alice_address
  • Переведення 3 токенів від alice_address до bob_address
  • Зберігання балансу bob_address в nat_storage_address
  • Отримати значення, яке зберігатися в nat_storage_address
1
>>> op = fa12.mint(to=alice_address, value=5).inject()
2
>>> op['hash']
3
'opDS6FUYmzXBRpX1DxpnucWBrcyEvCmAsSdjmHJMNpf7xQhGsRW'
4
5
>>> op = fa12.transfer(**{'from': alice_address, 'to': bob_address, 'value': 3}).inject()
6
>>> op['hash']
7
'ooQRsxqkV3vEtaDdarMzvzFuZLeKe6qfJkZEx9PntzqHGxVo8FU'
8
9
>>> op = fa12.getBalance(bob_address, nat_storage_address).inject()
10
>>> op['hash']
11
'opUVaphfSFgeUTACVmspr6bXrY82RLJ4mSf4DgT2kNZ6SiEcuh6'
12
13
>>> pytezos.contract(nat_storage_address).storage()
14
3
Copied!
Примітка. Чому .transfer(**{'from': ..}) замість .transfer(from=..)? В Python from є ключовим словом і не може використовуватися для вказівки аргументу, тому ми використовуємо **{..} для перетворення словника в аргументи ключового слова.

Виправлення проблем

Counter _ already used

Ця помилка виникає, коли залежна операція ще не включена, і може приймати одну з наступних форм:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BMe8VmYBa1Ye (timestamp: 2019-08-12T15:34:56-00:00, validation: 2019-08-12T15:35:00-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Counter 565668 already used for contract tz1QLne6uZFxPRdRfJG8msx5RouENpJoRsfP (expected 565669)
7
Fatal error:
8
transfer simulation failed
Copied!
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BL7QrQjGhkut (timestamp: 2019-08-12T15:39:26-00:00, validation: 2019-08-12T15:39:45-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Estimated gas: 212314 units (will add 100 for safety)
7
Estimated storage: no bytes added
8
Unregistred error:
9
{ "kind": "generic",
10
"error":
11
"Error while applying operation op1imCEMKFm7bTN9cwX4uoKPb6FjHJDv6NCkWKGVE7srh4XN6UP:\nbranch refused (Error:\n
12
Counter 565670 already used for contract tz1QLne6uZFxPRdRfJG8msx5RouENpJoRsfP (expected 565671)\n)" }
13
Fatal error:
14
transfer simulation failed
Copied!
Щоб виправити цю помилку ви можете зробити одне з двох:
  • Дочекайтеся включення операції
  • Запустіть tezos-client wait for [Operation Hash] to be included з залежними операціямиOperation Hash перш ніж продовжити
    • В якості альтернативи ви можете запустити: `tz get receipt for
      [Operation Hash]`

Higher than the configured burn cap

Ця помилка може виникнути, якщо параметр --burn-cap не зазначено або встановлено занадто низьким для поточної операції:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BLBsvLowXAPf (timestamp: 2019-08-12T15:41:56-00:00, validation: 2019-08-12T15:42:45-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Fatal error:
7
The operation will burn ꜩ0.021 which is higher than the configured burn cap (ꜩ0).
8
Use `--burn-cap 0.021` to emit this operation.
Copied!
Щоб виправити, замініть або додайте --burn-cap з цією рекомендацією (в даному випадку --burn-cap 0.021)
Матеріали розроблені TQ Tezos перекладені українською мовою Tezos Ukraine