Skip to content

Commit

Permalink
feat: use transport mutex in ton/token wallets
Browse files Browse the repository at this point in the history
  • Loading branch information
Egor Komarov committed Nov 26, 2024
1 parent 0eaf93a commit 5eaa828
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,19 @@ class TokenWallet extends RustToDartMirrorInterface
}) async {
final instance = TokenWallet._(transport, rootTokenContract);

final lib = createLib();
instance.wallet = await lib.subscribeStaticMethodTokenWalletDartWrapper(
instanceHash: instance.instanceHash,
transport: transport.transportBox,
rootTokenContract: rootTokenContract.address,
owner: owner.address,
);

await instance._initInstance();

return instance;
return transport.use(() async {
final lib = createLib();
instance.wallet = await lib.subscribeStaticMethodTokenWalletDartWrapper(
instanceHash: instance.instanceHash,
transport: transport.transportBox,
rootTokenContract: rootTokenContract.address,
owner: owner.address,
);

await instance._initInstance();

return instance;
});
}

/// If any error occurs during first initialization of wallet, it will dispose
Expand Down Expand Up @@ -221,8 +223,10 @@ class TokenWallet extends RustToDartMirrorInterface

try {
_isRefreshing = true;
await wallet.refresh();
await _updateData();
transport.use(() async {
await wallet.refresh();
await _updateData();
});
} finally {
_isRefreshing = false;
}
Expand Down Expand Up @@ -258,12 +262,13 @@ class TokenWallet extends RustToDartMirrorInterface
required Transport transport,
required Address address,
}) async {
final lib = createLib();
final encoded =
await lib.getTokenWalletDetailsStaticMethodTokenWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
);
final encoded = await transport.use(() async {
final lib = createLib();
return lib.getTokenWalletDetailsStaticMethodTokenWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
);
});
final decoded = jsonDecode(encoded) as List<dynamic>;
return Tuple2(
TokenWalletDetails.fromJson(decoded.first as Map<String, dynamic>),
Expand All @@ -280,12 +285,14 @@ class TokenWallet extends RustToDartMirrorInterface
required Transport transport,
required Address address,
}) async {
final lib = createLib();
final encoded = await lib
.getTokenRootDetailsFromTokenWalletStaticMethodTokenWalletDartWrapper(
tokenWalletAddress: address.address,
transport: transport.transportBox,
);
final encoded = await transport.use(() async {
final lib = createLib();
return lib
.getTokenRootDetailsFromTokenWalletStaticMethodTokenWalletDartWrapper(
tokenWalletAddress: address.address,
transport: transport.transportBox,
);
});
final decoded = jsonDecode(encoded) as List<dynamic>;
return Tuple2(
Address(address: (decoded.first as String)),
Expand All @@ -301,12 +308,13 @@ class TokenWallet extends RustToDartMirrorInterface
required Transport transport,
required Address tokenRoot,
}) async {
final lib = createLib();
final encoded =
await lib.getTokenRootDetailsStaticMethodTokenWalletDartWrapper(
tokenRootAddress: tokenRoot.address,
transport: transport.transportBox,
);
final encoded = await transport.use(() async {
final lib = createLib();
return lib.getTokenRootDetailsStaticMethodTokenWalletDartWrapper(
tokenRootAddress: tokenRoot.address,
transport: transport.transportBox,
);
});
return RootTokenContractDetails.fromJson(jsonDecode(encoded));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,18 +65,20 @@ class TonWallet extends RustToDartMirrorInterface
}) async {
final instance = TonWallet._(transport);

final lib = createLib();
instance.wallet = await lib.subscribeStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
publicKey: publicKey.publicKey,
walletType: jsonEncode(walletType),
workchainId: workchainId,
transport: transport.transportBox,
);
return transport.use(() async {
final lib = createLib();
instance.wallet = await lib.subscribeStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
publicKey: publicKey.publicKey,
walletType: jsonEncode(walletType),
workchainId: workchainId,
transport: transport.transportBox,
);

await instance._initInstance();
await instance._initInstance();

return instance;
return instance;
});
}

/// Create TonWallet by subscribing to its instance by address of wallet.
Expand All @@ -86,17 +88,19 @@ class TonWallet extends RustToDartMirrorInterface
}) async {
final instance = TonWallet._(transport);

final lib = createLib();
instance.wallet =
await lib.subscribeByAddressStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
address: address.address,
transport: transport.transportBox,
);
return transport.use(() async {
final lib = createLib();
instance.wallet =
await lib.subscribeByAddressStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
address: address.address,
transport: transport.transportBox,
);

await instance._initInstance();
await instance._initInstance();

return instance;
return instance;
});
}

/// Create TonWallet by subscribing to its instance by existed instance.
Expand All @@ -106,17 +110,19 @@ class TonWallet extends RustToDartMirrorInterface
}) async {
final instance = TonWallet._(transport);

final lib = createLib();
instance.wallet =
await lib.subscribeByExistingStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
existingWallet: jsonEncode(existingWallet),
transport: transport.transportBox,
);
return transport.use(() async {
final lib = createLib();
instance.wallet =
await lib.subscribeByExistingStaticMethodTonWalletDartWrapper(
instanceHash: instance.instanceHash,
existingWallet: jsonEncode(existingWallet),
transport: transport.transportBox,
);

await instance._initInstance();
await instance._initInstance();

return instance;
return instance;
});
}

/// If any error occurs during first initialization of wallet, it will dispose
Expand Down Expand Up @@ -352,8 +358,10 @@ class TonWallet extends RustToDartMirrorInterface

try {
_isRefreshing = true;
await wallet.refresh();
await _updateData();
transport.use(() async {
await wallet.refresh();
await _updateData();
});
} finally {
_isRefreshing = false;
}
Expand Down Expand Up @@ -388,14 +396,15 @@ class TonWallet extends RustToDartMirrorInterface
required PublicKey publicKey,
required List<WalletType> walletTypes,
}) async {
final lib = createLib();
final encoded =
await lib.findExistingWalletsStaticMethodTonWalletDartWrapper(
publicKey: publicKey.publicKey,
walletTypes: jsonEncode(walletTypes),
workchainId: workchainId,
transport: transport.transportBox,
);
final encoded = await transport.use(() {
final lib = createLib();
return lib.findExistingWalletsStaticMethodTonWalletDartWrapper(
publicKey: publicKey.publicKey,
walletTypes: jsonEncode(walletTypes),
workchainId: workchainId,
transport: transport.transportBox,
);
});
final decoded = jsonDecode(encoded) as List<dynamic>;
return decoded
.map((e) => ExistingWalletInfo.fromJson(e as Map<String, dynamic>))
Expand All @@ -408,12 +417,13 @@ class TonWallet extends RustToDartMirrorInterface
required Transport transport,
required Address address,
}) async {
final lib = createLib();
final encoded =
await lib.getExistingWalletInfoStaticMethodTonWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
);
final encoded = await transport.use(() {
final lib = createLib();
return lib.getExistingWalletInfoStaticMethodTonWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
);
});
final decoded = jsonDecode(encoded) as Map<String, dynamic>;
return ExistingWalletInfo.fromJson(decoded);
}
Expand All @@ -425,13 +435,15 @@ class TonWallet extends RustToDartMirrorInterface
required Transport transport,
required Address address,
}) async {
final lib = createLib();
return (await lib.getCustodiansStaticMethodTonWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
))
.map((key) => PublicKey(publicKey: key))
.toList();
final encoded = await transport.use(() {
final lib = createLib();
return lib.getCustodiansStaticMethodTonWalletDartWrapper(
address: address.address,
transport: transport.transportBox,
);
});

return encoded.map((key) => PublicKey(publicKey: key)).toList();
}

/// Calls from rust side when message has been sent to blockchain
Expand Down

0 comments on commit 5eaa828

Please # to comment.