А есть практика интеграционных тестов на ton?
Поднимается например свой тестнет в контейнере, деплоятся нужные контракты, и проводятся тесты на живой сети?
TON Дев Чат
INFO:
🥰 First time run - i'll create config folder 4you and save some stuff there
INFO:
🤖 Check all executables are installed...
WARNING:
🤖 Can't find executable for func, please specify it, e.g.: /usr/bin/func
Path: ton/crypto/func
ERROR: [Errno 13] Permission denied: '/
~/ton/crypto/func'
WARNING:
😅 Path is not correct, please double check it
WARNING:
🤖 Can't find executable for func, please specify it, e.g.: /usr/bin/func
Path:
-rwxrwxrwx 1
username admin 259 Aug 26 23:33 /Library/Frameworks/Python.framework/Versions/3.10/bin/toncl
TestsRunner
принимал data_params
Её
( cell ) data_cell()
asm "C{1F8FEA3803EAD9C1BF9E7EC9169021091BD10558FC24599B72C83149221DF5E1} PUSH";
не
запихать? Или я просто что-то не так делаю
variable @prev_c4
ref,: not a cell builder
<b
wc owner_addr Addr, // Adding owner addr to data
0 64 u,
content @ ref,
nft_path include ref,
swap ref, // We got royalty cell here on the stack
b>
Р
угается именно на строку с includenft_path
константа
Откуда этот tuple берётся я без понятия
[ [ "get_nft_data" 102351 ] [ [ "transfer_ownership" 10 ] [ [ "send_msg" 9 ] [ [ "store_data" 8 ] [ [ "load_data" 7 ] [ [ "force_chain" 6 ] [ [ "log2" 5 ] [ [ "exp" 4 ] [ [ "avg" 3 ] [ [ "sqrt" 2 ] [ [ "power" 1 ] [ [ "main" 0 ] (null) ] ] ] ] ] ] ] ] ] ] ] ] C{A4AF7C8EBA847AA87861E871C48A72B4DFB5A34018462DDBC0CD475AE856BEA6}
CS{Cell{0295000000000000169180001ae5786d0780857378e31cba2eda96c63672aeebf266e5a6a5ea97f6ec38bc5001a1f191ecb34b2f5bcbc1d72d349f5b80630effa6aebee838a5138455a7e29afe} bits: 64..331; refs: 0..0}
Когда читаю целл, то у меня перед байтами строки лежат 2 байта с длиной строки x2.
<b
"some_long_string" $>B B,
b>
$>s s,
и просто $,
разницы нет.
<bот так вот кладу, а оторбражается ttps...
"https://raw.githubusercontent.com/ton-blockchain/token-contract/main/nft/web-example/my_collection.json"
$>B B,
b>
В
If the URI does not fit into one cell, then it uses the "Snake format" described in the "Data serialization" paragraph, the snake-format-prefix 0x00 is dropped.
offchain#01 uri:Text = FullContent;
text#_ {n:#} data:(SnakeData ~n) = Text;
parseOffchainUriCell
#_ {bn:#} b:(bits bn) = SnakeData ~0;
cons#_ {bn:#} {n:#} b:(bits bn) next:^(SnakeData ~n) = SnakeData ~(n + 1);
{bn:#}
SDEQ
мы сравниваем только данные первого уровня или рекурсивно по рефам тоже?
// "test" =: test_constant
def? test_constant { ."Defined" } { ."Not defined" } cond
test_constant def? { ."Defined" } { ."Not defined" } cond
compilation-mode-only
len:(#< n) value:(uint (len * 8))
= VarUInteger n;
Fift.fif
: cannot locate file Fift.fif
nothing$0 {X:Type} = Maybe X;
just$1 {X:Type} value:X = Maybe X;
50000000 =: storage_grams
<b
"my_nft.json" $,
b>
<b
1 32 u, // op deploy_nft
123 64 u, // query_id
0 64 u, // nft_idx b>
storage_grams
<{ STVARUINT16 }>s // Executing STVARUINT16 to store coins
runvmcode drop // Droping exit code from the stack
swap ref, // Storing content ref
b>
toncli run_transaction -f 0 -n mainnet 29292053000005 PL/kuEBv01FQT820X9joEKuRVXUz32qQ1y2MvI77C60= EQBj0sX-_qLFMPEx8KFZWX_aukEzjV7DR_Zai0I-NZ_mnzv3
toncli run_transaction -f 0 3470660000005 'mAAV828tHpzyKjuMwH7K0F-0NFRO2BWgwgx_tYcMcDk=' 'EQAox8P13VjB0hNwZmHx3fxNc82xzjtZK5G5RR9gWc6zrxfI'
toncli run_transaction -f 0 -n testnet 3473136000005 yPJU0r+TS1X5jL6lcXEI2s0jaGHtlLw9jTlasY2QnIw= EQAox8P13VjB0hNwZmHx3fxNc82xzjtZK5G5RR9gWc6zrxfI
https://ton.org/img/img_1.svg`
А-то пример с битыми ссылками это некультурно
EQBIW8thNDxyqMsmIp45y0ocgy6gl1Zel42duxk776wwc-rB
liteApi.runSmcMethod(4, blockIdExt, liteServerAccountId, "seqno"), значит это можно как-то в обход создания кошелька сделать?
sender wants to pay transfer fees separately
? means that any errors arising while processing this message during the action phase should be ignored
Т.е что бы не случилось,- назад не отправлять. А обычно отправляешь, и если ошибка, то прилетает назад (bounced) нет?
destination - address of the new owner of the jettons.
response_destination - address where to send a response with confirmation of a successful transfer and the rest of the incoming message Toncoins.
if forward_amount > 0 ensure that receiver's jetton-wallet send message to destination address with forward_amount nanotons attached and with the following layout
EQC7UeCc9J4DtZP7WTEUzwvKNhJ5sXGnpcRtH_E7cpfEHAik
TonUtil
из testnet ветки."TonUtil.fif" include
"Color.fif" include
// In stack: init?, index, collection address, owner_address, body
4 roll // In stack: index, collection address, owner_address, body, init?
^reset ."👋 NFT is inited: " ^magenta (dump) type cr
3 roll // In stack: collection address, owner_address, body, index
constant index
^reset ."👿 NFT index: " ^green index (dump) type cr
^reset 2 roll addr@ ."🤗 Collection address: " ^yellow print-addr cr // In stack: owner_address, body, collection address SLICE
constant nft-body
^reset ."🤯 NFT Body: " nft-body <s ^cyan (dump) type cr // In stack: owner_address, collection address SLICE, body SLICE
^reset ."👻 NFT owner: " addr@ ^green print-addr cr // In stack: collection address SLICE, body SLICE, owner_address SLICE
"TonUtil.fif" include
"Color.fif" include
^reset ."👻 Address: " addr@ ^green print-addr cr
build_init_state
(возможно принимающую параметры) и выдающую ячейку. Далее эту ячейку и использовать в качестве init_storage
deploy
в тонкли
// Basic nft item data
let nftItemData = new Cell()
nftItemData.bits.writeUint(itemIndex, 64)
nftItemData.bits.writeAddress(collection.address)
// As a result of mint query, collection contract should send stateInit message to NFT item contract
expect(res.actionList.length).toBe(1)
let [initMessage] = res.actionList as [SendMsgAction]
expect(initMessage.message.init!.code!.toString()).toEqual(defaultConfig.nftItemCode.toString())
expect(initMessage.message.init!.data!.toString()).toEqual(nftItemData.toString())
() deploy_nft_item(int item_index, cell nft_item_code, int amount, cell nft_content) impure {
cell state_init = calculate_nft_item_state_init(item_index, nft_item_code);
slice nft_address = calculate_nft_item_address(workchain(), state_init);
var msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(nft_address)
.store_coins(amount)
.store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
.store_ref(state_init)
.store_ref(nft_content);
send_raw_message(msg.end_cell(), 1); ;; pay transfer fees separately, revert on errors
}
func -APS -o build/my-mega-contract.fif contracts/imports/stdlib.fc contracts/my-mega-contract.fc contracts/imports/params.fc contracts/imports/utils.fc contracts/imports/my-mega-contract/constants.fc contracts/imports/my-mega-contract/core.fc