Skip to content

Commit 108c08c

Browse files
committed
Add TON WalletConnect support
1 parent 9343178 commit 108c08c

File tree

8 files changed

+59
-9
lines changed

8 files changed

+59
-9
lines changed

Features/WalletConnector/Sources/WalletConnector/Services/WalletConnectorSigner.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public final class WalletConnectorSigner: WalletConnectorSignable {
145145
switch transaction {
146146
case .ethereum:
147147
throw AnyError("Not supported yet")
148-
case .solana(let transaction, let outputType), .sui(let transaction, let outputType):
148+
case .solana(let transaction, let outputType), .sui(let transaction, let outputType), .ton(let transaction, let outputType):
149149
let transferData = buildTransferData(
150150
chain: chain,
151151
metadata: session.session.metadata,
@@ -207,7 +207,7 @@ public final class WalletConnectorSigner: WalletConnectorSignable {
207207
)
208208

209209
return try await walletConnectorInteractor.sendTransaction(transferData: WCTransferData(tranferData: transferData, wallet: wallet))
210-
case .solana(let transaction, let outputType), .sui(let transaction, let outputType):
210+
case .solana(let transaction, let outputType), .sui(let transaction, let outputType), .ton(let transaction, let outputType):
211211
let transferData = buildTransferData(
212212
chain: chain,
213213
metadata: session.session.metadata,

Features/WalletConnector/Sources/WalletConnector/ViewModels/SignMessageSceneViewModel.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ public final class SignMessageSceneViewModel {
8585
return
8686
}
8787

88+
if messageChain == .ton {
89+
// TODO: implement ton_signData signing
90+
throw AnyError("ton_signData is not supported yet")
91+
}
92+
8893
let hash: Data = decoder.hash()
8994
let signature = try await keystore.sign(hash: hash, wallet: payload.wallet, chain: payload.chain)
9095
let result = decoder.getResult(data: signature)

Packages/ChainServices/WalletConnectorService/Extensions/WalletConnectTransaction+ChainServices.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@ import enum Gemstone.WalletConnectTransaction
55
import struct Gemstone.WcEthereumTransactionData
66
import struct Gemstone.WcSolanaTransactionData
77
import struct Gemstone.WcSuiTransactionData
8+
import struct Gemstone.WcTonTransactionData
89
import Primitives
910

1011
extension WalletConnectTransaction {
1112
func map() -> WalletConnectorTransaction {
1213
switch self {
13-
case .ethereum(let data):
14-
return .ethereum(data.map())
15-
case .solana(let data, let outputType):
16-
return .solana(data.transaction, outputType.map())
17-
case .sui(let data, let outputType):
18-
return .sui(data.transaction, outputType.map())
14+
case .ethereum(let data): .ethereum(data.map())
15+
case .solana(let data, let outputType): .solana(data.transaction, outputType.map())
16+
case .sui(let data, let outputType): .sui(data.transaction, outputType.map())
17+
case .ton(let data, let outputType): .ton(data.messages, outputType.map())
1918
}
2019
}
2120
}

Packages/ChainServices/WalletConnectorService/WalletConnectorTransaction.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public enum WalletConnectorTransaction {
77
case ethereum(WCEthereumTransaction)
88
case solana(String, TransferDataOutputType)
99
case sui(String, TransferDataOutputType)
10+
case ton(String, TransferDataOutputType)
1011
}

Packages/Primitives/Sources/WalletConnect.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,17 @@ public struct WCEthereumTransaction: Codable, Equatable, Hashable, Sendable {
3131
self.data = data
3232
}
3333
}
34+
35+
public struct WCTonMessage: Codable, Equatable, Hashable, Sendable {
36+
public let address: String
37+
public let amount: String
38+
public let payload: String?
39+
public let stateInit: String?
40+
41+
public init(address: String, amount: String, payload: String?, stateInit: String?) {
42+
self.address = address
43+
self.amount = amount
44+
self.payload = payload
45+
self.stateInit = stateInit
46+
}
47+
}

Packages/Primitives/Sources/WalletConnector.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,6 @@ public enum WalletConnectionMethods: String, Codable, CaseIterable, Sendable {
109109
case suiSignPersonalMessage = "sui_signPersonalMessage"
110110
case suiSignTransaction = "sui_signTransaction"
111111
case suiSignAndExecuteTransaction = "sui_signAndExecuteTransaction"
112+
case tonSendMessage = "ton_sendMessage"
113+
case tonSignData = "ton_signData"
112114
}

Packages/Signer/Sources/Chains/TonSigner.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,35 @@ public struct TonSigner: Signable {
6666
]
6767
}
6868

69+
public func signData(input: SignerInput, privateKey: Data) throws -> String {
70+
guard
71+
case .generic(_, _, let extra) = input.type,
72+
let data = extra.data
73+
else {
74+
throw AnyError("Invalid input data")
75+
}
76+
77+
let messages = try JSONDecoder().decode([WCTonMessage].self, from: data)
78+
let transfers = try messages.map { message -> TW_TheOpenNetwork_Proto_Transfer in
79+
try TheOpenNetworkTransfer.with {
80+
$0.dest = message.address
81+
$0.amount = try BigInt.from(string: message.amount).serialize()
82+
$0.mode = TheOpenNetworkSendMode.defaultMode()
83+
$0.bounceable = true
84+
if let payload = message.payload {
85+
$0.customPayload = payload
86+
}
87+
}
88+
}
89+
90+
return try sign(
91+
input: input,
92+
messages: transfers,
93+
coinType: input.coinType,
94+
privateKey: privateKey
95+
)
96+
}
97+
6998
private func expireAt() -> UInt32 {
7099
UInt32(Date.now.timeIntervalSince1970 + TimeInterval(600))
71100
}

0 commit comments

Comments
 (0)