Skip to content

Commit 28b0e50

Browse files
committed
improve Swift bindings for public key
1 parent 70d517b commit 28b0e50

File tree

6 files changed

+55
-4
lines changed

6 files changed

+55
-4
lines changed

.fleet/settings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"backend.maxHeapSizeMb": 2048
2+
"backend.maxHeapSizeMb": 8192
33
}

libs.versions.toml

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ detekt = "1.23.5"
1111
jacoco = "0.8.7"
1212
kotlin = "1.9.23"
1313
mavenPublish = "0.27.0"
14+
skie = "0.6.2"
1415

1516
# Libraries
1617
junit5 = "5.10.2"
@@ -43,6 +44,7 @@ okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
4344
okhttpLoggingInterceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" }
4445
serializationCore = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" }
4546
serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
47+
skie-configurationAnnotations = { module = "co.touchlab.skie:configuration-annotations", version.ref = "skie" }
4648
tweetNaClJava = { module = "net.avianlabs:tweetnacl-java", version = "1.1.2" }
4749

4850
# Test Libs
@@ -68,3 +70,5 @@ kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref =
6870
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
6971
nmcp = { id = "com.gradleup.nmcp", version = "0.0.4" }
7072
mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "mavenPublish" }
73+
multiplatform-swiftpackage = { id = "io.github.luca992.multiplatform-swiftpackage", version = "2.2.2" }
74+
skie = { id = "co.touchlab.skie", version.ref = "skie" }

solana-kotlin/build.gradle.kts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import co.touchlab.skie.configuration.ClassInterop
2+
import co.touchlab.skie.configuration.DefaultArgumentInterop
3+
14
plugins {
25
alias(libs.plugins.kotlinMultiplatform)
36
alias(libs.plugins.kotlinSerialization)
47
alias(libs.plugins.mavenPublish)
58
alias(libs.plugins.dokka)
69
signing
7-
id("io.github.luca992.multiplatform-swiftpackage") version "2.2.2"
10+
alias(libs.plugins.multiplatform.swiftpackage)
11+
alias(libs.plugins.skie)
812
}
913

1014
group = "net.avianlabs.solana"
@@ -29,6 +33,7 @@ kotlin {
2933
).forEach { iosTarget ->
3034
iosTarget.binaries.framework {
3135
baseName = "SolanaKotlin"
36+
export(project(":tweetnacl-multiplatform"))
3237
isStatic = true
3338
}
3439
}
@@ -55,6 +60,7 @@ kotlin {
5560
implementation(libs.ktorSerializationKotlinxJson)
5661
implementation(libs.kermit)
5762
implementation(libs.okio)
63+
implementation(libs.skie.configurationAnnotations)
5864
}
5965
}
6066
val commonTest by getting {
@@ -77,6 +83,15 @@ kotlin {
7783
}
7884
}
7985

86+
skie {
87+
features {
88+
group("net.avianlabs.solana.tweetnacl") {
89+
ClassInterop.CInteropFrameworkName("TweetNaClMultiplatform")
90+
DefaultArgumentInterop.Enabled(true)
91+
}
92+
}
93+
}
94+
8095
multiplatformSwiftPackage {
8196
swiftToolsVersion("5.9")
8297
targetPlatforms {

tweetnacl-multiplatform/build.gradle.kts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import co.touchlab.cklib.gradle.CompileToBitcode.Language
2+
import co.touchlab.skie.configuration.ClassInterop
23
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
34

45
plugins {
@@ -8,7 +9,8 @@ plugins {
89
alias(libs.plugins.mavenPublish)
910
alias(libs.plugins.dokka)
1011
signing
11-
id("io.github.luca992.multiplatform-swiftpackage") version "2.2.2"
12+
alias(libs.plugins.multiplatform.swiftpackage)
13+
alias(libs.plugins.skie)
1214
}
1315

1416
group = "net.avianlabs.solana"

tweetnacl-multiplatform/src/commonMain/kotlin/net/avianlabs/solana/tweetnacl/ed25519/PublicKey.kt

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public data class PublicKey(public val bytes: ByteArray) {
4040
public fun isOnCurve(): Boolean = TweetNaCl.Signature.isOnCurve(this.bytes)
4141

4242
public companion object {
43-
4443
public fun fromBase58(base58: String): PublicKey = PublicKey(base58.decodeBase58())
4544
}
4645
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
@file:OptIn(
2+
ExperimentalForeignApi::class,
3+
BetaInteropApi::class,
4+
)
5+
6+
package net.avianlabs.solana.tweetnacl.ed25519
7+
8+
import kotlinx.cinterop.*
9+
import platform.Foundation.NSData
10+
import platform.Foundation.create
11+
import platform.posix.memcpy
12+
13+
public fun PublicKey(data: NSData): PublicKey = PublicKey(
14+
bytes = ByteArray(data.length.toInt()).apply {
15+
usePinned { pinned ->
16+
memcpy(
17+
__dst = pinned.addressOf(0),
18+
__src = data.bytes,
19+
__n = data.length,
20+
)
21+
}
22+
}
23+
)
24+
25+
public val PublicKey.data: NSData
26+
get() = memScoped {
27+
NSData.create(
28+
bytes = allocArrayOf(bytes),
29+
length = bytes.size.toULong(),
30+
)
31+
}

0 commit comments

Comments
 (0)