dero_dvm_basic 0.1.3 copy "dero_dvm_basic: ^0.1.3" to clipboard
dero_dvm_basic: ^0.1.3 copied to clipboard

DVM-BASIC parser to convert a Dero smart contract into a data structure.

example/dero_dvm_basic_example.dart

import 'dart:io';

import 'package:dero_dvm_basic/dero_dvm_basic.dart';
import 'package:dero_dvm_basic/src/exceptions/dbasic_parser_exception.dart';
import 'package:path/path.dart' as p;

const String nameServiceSC = '''
/* Name Service SMART CONTRACT in DVM-BASIC.
Allows a user to register names which could be looked by wallets for easy to use name while transfer
*/

// This function is used to initialize parameters during install time
Function Initialize() Uint64
10  RETURN 0
End Function

// Register a name, limit names of 5 or less length
Function Register(name String) Uint64
10  IF EXISTS(name) THEN GOTO 50   // if name is already used, it cannot reregistered
20  IF STRLEN(name) >= 6 THEN GOTO 40
30  IF SIGNER() != address_raw("deto1qyvyeyzrcm2fzf6kyq7egkes2ufgny5xn77y6typhfx9s7w3mvyd5qqynr5hx") GOTO 50
40  STORE(name,SIGNER())
50  RETURN 0
End Function

// This function is used to change owner
// owner is an string form of address
Function TransferOwnership(name String,newowner String) Uint64
10  IF LOAD(name) != SIGNER() THEN GOTO 30
20  STORE(name,ADDRESS_RAW(newowner))
30  RETURN 0
End Function
''';

Future<void> main() async {
  DBasicRepository dBasicRepository;
  try {
    dBasicRepository = DBasicRepository.loadSmartContract(nameServiceSC);
  } on DBasicParserException catch (exception) {
    // Print the position in the buffer where parsing failed
    print(exception.position);
    // Get the row and column where the parsing failed
    int line = exception.lineAndColumn[0];
    int column = exception.lineAndColumn[1];
  } catch (e) {
    print(e);
  }

  // Loading a contract from a BAS file
  var filePath = p.join(
      Directory.current.path, 'playground/smart_contracts', 'lottery.bas');

  try {
    File file = File(filePath);
    String data = await file.readAsString();
    dBasicRepository = DBasicRepository.loadSmartContract(data);

    // Get all functions defined in the SC
    List<DBasicFunction> functions = dBasicRepository.functions;

    // Get all function signatures ...
    List<DBasicFunctionSignature> functionSignatures =
        dBasicRepository.sc.getAllFunctionSignatures();

    // ... or "pretty" print it
    dBasicRepository.sc.prettyPrintFunctionSignatures();

    // Convert SC data structure back into code unit
    String code = dBasicRepository.sc.toDBasicCode();
    print(code);
    // Console output:
    // -------------------------------------------------------------------------
    // Function Initialize() Uint64
    // 10 RETURN 0
    // End Function
    //
    // Function Register(name String) Uint64
    // 10 IF EXISTS(name) THEN GOTO 50
    // 20 IF STRLEN(name) >= 6 THEN GOTO 40
    // 30 IF SIGNER() != address_raw("deto1qyvyeyzrcm2fzf6kyq7egkes2ufgny5xn77y6typhfx9s7w3mvyd5qqynr5hx") THEN GOTO 50
    // 40 STORE(name, SIGNER())
    // 50 RETURN 0
    // End Function
    //
    // Function TransferOwnership(name String, newowner String) Uint64
    // 10 IF LOAD(name) != SIGNER() THEN GOTO 30
    // 20 STORE(name, ADDRESS_RAW(newowner))
    // 30 RETURN 0
    // End Function
    // -------------------------------------------------------------------------

    // It is also possible to create directly an Expression data structure.
    var expression = DBasicRepository.createArithmeticExpression(
        '(p2 / base * base + p1 / base) - q1 * ch');

    // And then print the AST of the Expression.
    expression.prettyPrintTree();
    // Console output:
    // -------------------------------------------------------------------------
    //          /----- ch
    //  /----- *
    //  |       \----- q1
    // -
    //  |               /----- base
    //  |       /----- /
    //  |       |       \----- p1
    //  \----- +
    //          |       /----- base
    //          \----- *
    //                  |       /----- base
    //                  \----- /
    //                          \----- p2

    // Or transform the AST into code again.
    print(expression.toDBasicCode());
    // Console output:
    // -------------------------------------------------------------------------
    // (p2 / base * base + p1 / base) - q1 * ch
  } catch (e) {
    print(e);
  }
}
2
likes
0
points
62
downloads

Publisher

unverified uploader

Weekly Downloads

DVM-BASIC parser to convert a Dero smart contract into a data structure.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

freezed_annotation, path, petitparser

More

Packages that depend on dero_dvm_basic