# Til (Test instructions language) Language to define sets of instructions to simulate Hermez transactions (L1 & L2) with real data. ## Syntax ### Global - Set type definition - Blockchain: generate the transactions that would come from the Hermez smart contract on the blockchain. ``` Type: Blockchain ``` - PoolL2: generate the transactions that would come from the Pool of L2Txs ``` Type: PoolL2 ``` ### Blockchain set of instructions Available instructions: ```go Type: Blockchain // register the TokenID: RegisterToken(1) // deposit of TokenID=1, on the account of tokenID=1 for the user A, of an // amount of 50 units CreateAccountDeposit(1) A: 50 // create the account of TokenID=1 for the user B, deposit of TokenID=1, on the // account of tokenID=1 for the user B, of an amount of 40 units and atomically // transfer 10 units to account of tokenID=1 for the user A, paying a fee of 2 CreateAccountDepositTransfer(1) B-A: 40, 10 (2) // transaction generated by the Coordinator, create account for user User0 for // the TokenID=2, with a deposit of 0 CreateAccountDepositCoordinator(2) User0 // deposit of TokenID=1, at the account A, of 6 units Deposit(1) A: 6 // deposit of TokenID=1, on the account of tokenID=1 for the user B, of an // amount of 6 units and atomically transfer 10 units to account of tokenID=1 for // the user A, paying a fee of 2 DepositTransfer(1) B-A: 6, 4 (2) // transfer of TokenID=1, from the account A to B (for that token), of 6 units, // paying a fee of 3. Transaction will be a L2Tx Transfer(1) A-B: 6 (3) // exit of TokenID=1, from the account A (for that token), of 5 units. // Transaction will be a L2Tx Exit(1) A: 5 // force-transfer of TokenID=1, from the account A to B (for that token), of 6 // units, paying a fee of 3. Transaction will be L1UserTx of ForceTransfer type ForceTransfer(1) A-B: 6 (3) // force-exit of TokenID=1, from the account A (for that token), of 5 units. // Transaction will be L1UserTx of ForceExit type ForceExit(1) A: 5 // advance one batch, forging without L1UserTxs, only can contain L2Txs and // L1CoordinatorTxs > batch // advance one batch, forging with L1UserTxs (and L2Txs and L1CoordinatorTxs) > batchL1 // advance an ethereum block > block ``` ### PoolL2 set of instructions Available instructions: ```go Type: PoolL2 // transfer of TokenID=1, from the account A to B (for that token), of 6 units, // paying a fee of 4 PoolTransfer(1) A-B: 6 (4) // exit of TokenID=1, from the account A (for that token), of 3 units PoolExit(1) A: 3 ``` ## Usage ```go // create a new til.Context tc := til.NewContext(eth.RollupConstMaxL1UserTx) // generate Blockchain blocks data from the common.SetBlockcahin0 instructions set blocks, err = tc.GenerateBlocks(common.SetBlockchain0) assert.Nil(t, err) // generate PoolL2 transactions data from the common.SetPool0 instructions set poolL2Txs, err = tc.GenerateBlocks(common.SetPool0) assert.Nil(t, err) ``` Where `blocks` will contain: ```go // BatchData contains the information of a Batch type BatchData struct { L1CoordinatorTxs []common.L1Tx L2Txs []common.L2Tx CreatedAccounts []common.Account } // BlockData contains the information of a Block type BlockData struct { L1UserTxs []common.L1Tx Batches []BatchData RegisteredTokens []common.Token } ```