summaryrefslogtreecommitdiff
path: root/impls/monero.dart/README.md
blob: 72504e72489a2e19ff0cbf7faf6a625828f06de5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# monero.dart

## Usage

```
monero:
  git:
    url: https://github.com/mrcyjanek/monero_c
    ref: master
    path: impls/monero.dart
```

```dart
import 'package: monero/monero.dart' as monero;

void main() {
    final wm = monero.WalletManagerFactory_getWalletManager();
    final w = monero.WalletManager_openWallet({...});
    print(monero.Wallet_balance(w));
}
```

If you need more advanced usage, to for example use the code in an isolate, some workarounding is required **NOTE: from now on you manage your own memory partialy**.

Simplest example is this:

```dart
final addr = w.address; 
final height = await Isolate.run(() async {
    return monero.lib.MONERO_Wallet_daemonBlockChainHeight(Pointer.fromAddress(addr));
});
```

It gets even funnier when sending a transaction

```dart
final ptrAddr = xmrwPtr!.address;
final dstAddrPtr = txData.recipients!.first.address.toNativeUtf8().address;
final paymentAddrPtr = ''.toNativeUtf8().address;
final preferredInputsPtr = ''.toNativeUtf8().address;
final separatorPtr = ''.toNativeUtf8().address;
final amount = txData.recipients!.first.amount.raw.toInt();
final txPtrAddr = await Isolate.run(
    () {
        monero.lib ??= MoneroC(DynamicLibrary.open(monero.libPath));
        final txPtr = monero.lib!.MONERO_Wallet_createTransaction(
            Pointer.fromAddress(ptrAddr), 
            Pointer.fromAddress(dstAddrPtr).cast(), 
            Pointer.fromAddress(paymentAddrPtr).cast(), 
            amount, 0, 0, 0, 
            Pointer.fromAddress(preferredInputsPtr).cast(), 
            Pointer.fromAddress(separatorPtr).cast(),
        );
        // Nothing hits better than managing memory in GC language :)
        return txPtr.address;
    },
    debugName: 'MONERO_Wallet_createTransaction',
);

final txPtr = Pointer.fromAddress(txPtrAddr).cast<Void>();
calloc.free(Pointer.fromAddress(dstAddrPtr));
calloc.free(Pointer.fromAddress(paymentAddrPtr));
calloc.free(Pointer.fromAddress(preferredInputsPtr));
calloc.free(Pointer.fromAddress(separatorPtr));
```

Async api will be made as a part of the generator update, too much effort under current design.

## Building

```bash
$ bash update_bindings.sh
$ # you are done, this is a library, what more did you expect?
```