Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions flutter_plugin/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
[package]
name = "dlcplazacryptlib"
version = "0.2.0"
version = "2.0.1"
edition = "2021"

[lib]
name = "dlcplazacryptlib"
crate-type = ["cdylib", "staticlib"]

[dependencies]
bip39 = "2.1.0"
bitcoin = "0.32.4"
dlccryptlib = "=2.0.1"
dlccryptlib-py = "=2.0.1"
pyo3 = { version = "0.23.1", optional = true }
secp256k1-sys = "0.10.1"
secp256k1-zkp = "0.11.0"

[features]
default = ["std"]
std = ["bitcoin/std", "secp256k1-zkp/rand-std"]
default = []
with-pyo3 = ["pyo3"]
9 changes: 5 additions & 4 deletions flutter_plugin/DLC_FUNCTIONS_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ final address = await DlcWallet.getAddress(0);
```dart
final signature = await DlcWallet.signHashEcdsa(
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
0,
0, 0,
pubkey
);
```
Expand Down Expand Up @@ -114,6 +114,7 @@ final signatures = await DlcWallet.createCetAdaptorSigs(
digitStringTemplate: 'BTCUSD',
oraclePublicKey: '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
signingKeyIndex: 0,
signingKeyIndex4: 0,
signingPublicKey: await DlcWallet.getPublicKey(0),
nonces: ['nonce1', 'nonce2'],
intervalWildcards: ['50000-60000', '60000-70000'],
Expand Down Expand Up @@ -156,7 +157,7 @@ final xpub = await DlcWallet.initWithEntropy(entropy, "signet");
final addresses = await DlcWallet.generateAddresses(10);

// Sign transaction
final signature = await DlcWallet.signTransaction(txHash, keyIndex);
final signature = await DlcWallet.signTransaction(txHash, keyIndex, keyIndex4);
```

### **2. DLC Contract Creation**
Expand All @@ -183,13 +184,13 @@ final nonces = dlcSetup['nonces'];
// Sign Bitcoin transaction
final txSignature = await DlcWallet.signTransaction(
transactionHash,
keyIndex
keyIndex, keyIndex4,
);

// Sign arbitrary hash
final hashSignature = await DlcWallet.signHashEcdsa(
messageHash,
keyIndex,
keyIndex, keyIndex4,
publicKey
);
```
Expand Down
4 changes: 4 additions & 0 deletions flutter_plugin/flutter_plugin/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,12 @@ class _WalletScreenState extends State<WalletScreen> with TickerProviderStateMix

try {
final index = int.parse(_indexController.text);
final index4 = 0;
final publicKey = await DlcWallet.getPublicKey(index);
final signature = await DlcWallet.signHashEcdsa(
_hashController.text,
index,
index4,
publicKey,
);

Expand Down Expand Up @@ -162,6 +164,7 @@ class _WalletScreenState extends State<WalletScreen> with TickerProviderStateMix
final signature = await DlcWallet.signTransaction(
_hashController.text,
int.parse(_indexController.text),
0,
);

_showResult('Transaction Signature', signature);
Expand Down Expand Up @@ -226,6 +229,7 @@ class _WalletScreenState extends State<WalletScreen> with TickerProviderStateMix
digitStringTemplate: 'BTCUSD',
oraclePublicKey: '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
signingKeyIndex: int.parse(_indexController.text),
signingKeyIndex4: 0,
signingPublicKey: await DlcWallet.getPublicKey(int.parse(_indexController.text)),
nonces: [
'0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
Expand Down
4 changes: 2 additions & 2 deletions flutter_plugin/flutter_plugin/ios/Classes/DlcWalletPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ - (void)handleSignHashEcdsa:(FlutterMethodCall*)call result:(FlutterResult)resul
const char *signerPubkeyCStr = [signerPubkey UTF8String];
uint32_t signerIndexU32 = [signerIndex unsignedIntValue];

char *signatureCStr = sign_hash_ecdsa_c(hashCStr, signerIndexU32, signerPubkeyCStr);
char *signatureCStr = sign_hash_ecdsa_c(hashCStr, 0, signerIndexU32, signerPubkeyCStr);

if (signatureCStr == NULL) {
result([FlutterError errorWithCode:@"SIGNATURE_ERROR"
Expand Down Expand Up @@ -109,7 +109,7 @@ - (void)handleCreateCetAdaptorSigs:(FlutterMethodCall*)call result:(FlutterResul

char *signaturesCStr = create_cet_adaptor_sigs_c(
numDigitsU8, numCetsU32, digitStringTemplateCStr, oraclePublicKeyCStr,
signingKeyIndexU32, signingPublicKeyCStr, noncesCStr, intervalWildcardsCStr, sighashesCStr
0, signingKeyIndexU32, signingPublicKeyCStr, noncesCStr, intervalWildcardsCStr, sighashesCStr
);

if (signaturesCStr == NULL) {
Expand Down
10 changes: 5 additions & 5 deletions flutter_plugin/flutter_plugin/ios/Classes/dlc_wallet_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ extern "C" {

// Function declarations for the Rust library
char* init_with_entropy_c(const char* entropy, const char* network);
char* get_public_key_c(uint32_t index);
char* sign_hash_ecdsa_c(const char* hash, uint32_t signer_index, const char* signer_pubkey);
char* create_cet_adaptor_sigs_c(uint8_t num_digits, uint32_t num_cets, const char* digit_string_template, const char* oracle_public_key, uint32_t signing_key_index, const char* signing_public_key, const char* nonces, const char* interval_wildcards, const char* sighashes);
char* get_public_key_c(uint32_t index4, uint32_t index5);
char* sign_hash_ecdsa_c(const char* hash, uint32_t signer_index4, uint32_t signer_index5, const char* signer_pubkey);
char* create_cet_adaptor_sigs_c(uint8_t num_digits, uint32_t num_cets, const char* digit_string_template, const char* oracle_public_key, uint32_t signing_key_index4, uint32_t signing_key_index5, const char* signing_public_key, const char* nonces, const char* interval_wildcards, const char* sighashes);
char* create_deterministic_nonce_c(const char* event_id, uint32_t index);
char* get_xpub_c(void);
char* get_address_c(uint32_t index);
char* init_from_file_c(const char* path, const char* password);
char* get_address_c(uint32_t index4, uint32_t index5);
// char* init_from_file_c(const char* path, const char* password);
void free_cstring(char* s);

#ifdef __cplusplus
Expand Down
152 changes: 78 additions & 74 deletions flutter_plugin/flutter_plugin/lib/dlc_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ typedef FreeCStringCDart = void Function(Pointer<Utf8> s);
class DlcWallet {
static DynamicLibrary? _lib;
static late final InitWithEntropyCDart _initWithEntropy;
static late final InitFromFileCDart _initFromFile;
// static late final InitFromFileCDart _initFromFile;
static late final GetXpubCDart _getXpub;
static late final GetPublicKeyCDart _getPublicKey;
static late final GetAddressCDart _getAddress;
Expand Down Expand Up @@ -100,9 +100,9 @@ class DlcWallet {
_initWithEntropy = _lib!
.lookup<NativeFunction<InitWithEntropyC>>('init_with_entropy_c')
.asFunction();
_initFromFile = _lib!
.lookup<NativeFunction<InitFromFileC>>('init_from_file_c')
.asFunction();
// _initFromFile = _lib!
// .lookup<NativeFunction<InitFromFileC>>('init_from_file_c')
// .asFunction();
_getXpub =
_lib!.lookup<NativeFunction<GetXpubC>>('get_xpub_c').asFunction();
_getPublicKey = _lib!
Expand Down Expand Up @@ -185,20 +185,20 @@ class DlcWallet {

/// Initialize wallet from encrypted file
/// Used for: Loading existing wallets
static Future<String> initFromFile(String path, String password) async {
_loadLibrary();
// static Future<String> initFromFile(String path, String password) async {
// _loadLibrary();

final pathPtr = path.toNativeUtf8();
final passwordPtr = password.toNativeUtf8();
// final pathPtr = path.toNativeUtf8();
// final passwordPtr = password.toNativeUtf8();

try {
final result = _initFromFile(pathPtr, passwordPtr);
return _convertCStringAndFree(result);
} finally {
malloc.free(pathPtr);
malloc.free(passwordPtr);
}
}
// try {
// final result = _initFromFile(pathPtr, passwordPtr);
// return _convertCStringAndFree(result);
// } finally {
// malloc.free(pathPtr);
// malloc.free(passwordPtr);
// }
// }

/// Get extended public key
/// Used for: Wallet identification, sharing public wallet info
Expand All @@ -212,15 +212,15 @@ class DlcWallet {
/// Used for: Address generation, verification
static Future<String> getPublicKey(int index) async {
_loadLibrary();
final result = _getPublicKey(index);
final result = _getPublicKey(0, index);
return _convertCStringAndFree(result);
}

/// Get address for child index
/// Used for: Receiving Bitcoin payments
static Future<String> getAddress(int index) async {
_loadLibrary();
final result = _getAddress(index);
final result = _getAddress(0, index);
return _convertCStringAndFree(result);
}

Expand All @@ -229,13 +229,14 @@ class DlcWallet {
/// Sign hash with ECDSA
/// Used for: Transaction signing, message authentication
static Future<String> signHashEcdsa(
String hash, int signerIndex, String signerPubkey) async {
String hash, int signerIndex, int signerIndex4, String signerPubkey) async {
if (Platform.isIOS) {
// Use method channel for iOS
try {
final result = await _channel.invokeMethod('signHashEcdsa', {
'hash': hash,
'signerIndex': signerIndex,
'signerIndex4': signerIndex4,
'signerPubkey': signerPubkey,
});
return result.toString();
Expand All @@ -254,7 +255,7 @@ class DlcWallet {
final signerPubkeyPtr = signerPubkey.toNativeUtf8();

try {
final result = _signHashEcdsa(hashPtr, signerIndex, signerPubkeyPtr);
final result = _signHashEcdsa(hashPtr, 0, signerIndex, signerPubkeyPtr);

return _convertCStringAndFree(result);
} finally {
Expand Down Expand Up @@ -301,6 +302,7 @@ class DlcWallet {
required String digitStringTemplate,
required String oraclePublicKey,
required int signingKeyIndex,
required int signingKeyIndex4,
required String signingPublicKey,
required List<String> nonces,
required List<String> intervalWildcards,
Expand All @@ -315,6 +317,7 @@ class DlcWallet {
'digitStringTemplate': digitStringTemplate,
'oraclePublicKey': oraclePublicKey,
'signingKeyIndex': signingKeyIndex,
'signingKeyIndex4': signingKeyIndex4,
'signingPublicKey': signingPublicKey,
'nonces': nonces,
'intervalWildcards': intervalWildcards,
Expand Down Expand Up @@ -353,6 +356,7 @@ class DlcWallet {
numCets,
digitStringTemplatePtr,
oraclePublicKeyPtr,
signingKeyIndex4,
signingKeyIndex,
signingPublicKeyPtr,
noncesPtr,
Expand Down Expand Up @@ -395,64 +399,64 @@ class DlcWallet {
return addresses;
}

/// Create a complete DLC setup
/// Used for: Setting up DLC contracts with all required components
static Future<Map<String, dynamic>> createDlcSetup({
required String eventId,
required int keyIndex,
required String digitStringTemplate,
required String oraclePublicKey,
required List<String> intervalWildcards,
required List<String> sighashes,
required int numDigits,
}) async {
// Create deterministic nonce
final nonce = await createDeterministicNonce(eventId, keyIndex);

// Get signing public key
final signingPublicKey = await getPublicKey(keyIndex);

// Create multiple nonces for multi-digit outcomes
final nonces = <String>[];
for (int i = 0; i < numDigits; i++) {
final n = await createDeterministicNonce('$eventId-$i', keyIndex);
nonces.add(n['public']!);
}

// Create CET adaptor signatures
final signatures = await createCetAdaptorSigs(
numDigits: numDigits,
numCets: intervalWildcards.length,
digitStringTemplate: digitStringTemplate,
oraclePublicKey: oraclePublicKey,
signingKeyIndex: keyIndex,
signingPublicKey: signingPublicKey,
nonces: nonces,
intervalWildcards: intervalWildcards,
sighashes: sighashes,
);

return {
'eventId': eventId,
'keyIndex': keyIndex,
'signingPublicKey': signingPublicKey,
'nonce': nonce,
'nonces': nonces,
'signatures': signatures,
'setup': {
'digitStringTemplate': digitStringTemplate,
'oraclePublicKey': oraclePublicKey,
'intervalWildcards': intervalWildcards,
'sighashes': sighashes,
}
};
}
// /// Create a complete DLC setup
// /// Used for: Setting up DLC contracts with all required components
// static Future<Map<String, dynamic>> createDlcSetup({
// required String eventId,
// required int keyIndex,
// required String digitStringTemplate,
// required String oraclePublicKey,
// required List<String> intervalWildcards,
// required List<String> sighashes,
// required int numDigits,
// }) async {
// // Create deterministic nonce
// final nonce = await createDeterministicNonce(eventId, keyIndex);

// // Get signing public key
// final signingPublicKey = await getPublicKey(keyIndex);

// // Create multiple nonces for multi-digit outcomes
// final nonces = <String>[];
// for (int i = 0; i < numDigits; i++) {
// final n = await createDeterministicNonce('$eventId-$i', keyIndex);
// nonces.add(n['public']!);
// }

// // Create CET adaptor signatures
// final signatures = await createCetAdaptorSigs(
// numDigits: numDigits,
// numCets: intervalWildcards.length,
// digitStringTemplate: digitStringTemplate,
// oraclePublicKey: oraclePublicKey,
// signingKeyIndex: keyIndex,
// signingPublicKey: signingPublicKey,
// nonces: nonces,
// intervalWildcards: intervalWildcards,
// sighashes: sighashes,
// );

// return {
// 'eventId': eventId,
// 'keyIndex': keyIndex,
// 'signingPublicKey': signingPublicKey,
// 'nonce': nonce,
// 'nonces': nonces,
// 'signatures': signatures,
// 'setup': {
// 'digitStringTemplate': digitStringTemplate,
// 'oraclePublicKey': oraclePublicKey,
// 'intervalWildcards': intervalWildcards,
// 'sighashes': sighashes,
// }
// };
// }

/// Sign a Bitcoin transaction hash
/// Used for: Transaction signing in wallet applications
static Future<String> signTransaction(String txHash, int keyIndex) async {
static Future<String> signTransaction(String txHash, int keyIndex, int keyIndex4) async {
final publicKey = await getPublicKey(keyIndex);
return await signHashEcdsa(txHash, keyIndex, publicKey);
return await signHashEcdsa(txHash, keyIndex, keyIndex4, publicKey);
}

/// Check if the native library is loaded
Expand Down
Loading