Skip to content

Commit 352b154

Browse files
committed
fix: encoding
1 parent e66f37d commit 352b154

File tree

4 files changed

+133
-68
lines changed

4 files changed

+133
-68
lines changed

Sources/SolanaSwift/Programs/TokenPrograms/Token2022Program/Token2022AccountState.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import Foundation
22

33
public struct Token2022AccountState: TokenAccountState {
4+
static var ACCOUNT_TYPE: UInt8 { 2 }
5+
46
public let mint: PublicKey
57
public let owner: PublicKey
68
public let lamports: UInt64
@@ -59,7 +61,7 @@ public struct Token2022AccountState: TokenAccountState {
5961
extension Token2022AccountState: BorshCodable {
6062
public func serialize(to writer: inout Data) throws {
6163
try serializeCommonProperties(to: &writer)
62-
try UInt8(0).serialize(to: &writer)
64+
try Self.ACCOUNT_TYPE.serialize(to: &writer)
6365
for ext in extensions {
6466
try ext.serialize(to: &writer)
6567
}
@@ -88,7 +90,12 @@ extension Token2022AccountState: BorshCodable {
8890
return
8991
}
9092

91-
_ = try reader.read(count: 1) // account type
93+
let accountType = try reader.read(count: 1)
94+
95+
// AccountType == 2 for AccountState
96+
guard accountType.first == Self.ACCOUNT_TYPE else {
97+
throw BinaryReaderError.dataMismatch
98+
}
9299

93100
var extensions = [AnyToken2022ExtensionState]()
94101
repeat {

Sources/SolanaSwift/Programs/TokenPrograms/Token2022Program/Token2022MintState.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import Foundation
22

33
public struct Token2022MintState: TokenMintState {
4+
private static var ACCOUNT_TYPE: UInt8 { 1 }
5+
46
public let mintAuthorityOption: UInt32
57
public let mintAuthority: PublicKey?
68
public let supply: UInt64
@@ -34,7 +36,13 @@ extension Token2022MintState: BorshCodable {
3436
}
3537

3638
_ = try reader.read(count: 83) // padding
37-
_ = try reader.read(count: 1) // mint type
39+
40+
let accountType = try reader.read(count: 1)
41+
42+
// AccountType == 1 for MintState
43+
guard accountType.first == Self.ACCOUNT_TYPE else {
44+
throw BinaryReaderError.dataMismatch
45+
}
3846

3947
var extensions = [AnyToken2022ExtensionState]()
4048
repeat {
@@ -48,7 +56,7 @@ extension Token2022MintState: BorshCodable {
4856
public func serialize(to writer: inout Data) throws {
4957
try serializeCommonProperties(to: &writer)
5058
try Data(repeating: UInt8(0), count: 83).serialize(to: &writer)
51-
try UInt8(1).serialize(to: &writer)
59+
try Self.ACCOUNT_TYPE.serialize(to: &writer)
5260
for ext in extensions {
5361
try ext.serialize(to: &writer)
5462
}

Tests/SolanaSwiftUnitTests/Other/BufferLayout/BufferLayoutDecodingTests.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,28 @@ class BufferLayoutDecodingTests: XCTestCase {
265265
var binaryReader = BinaryReader(bytes: data.bytes)
266266
let state = try Token2022AccountState(from: &binaryReader)
267267

268+
XCTAssertEqual(state.isNativeRaw, 0)
269+
XCTAssertEqual(state.delegatedAmount, 0)
270+
XCTAssertEqual(state.mint.base58EncodedString, "8nxJnGJDyvehdEHw4PgRc7ccJ1Zi134PhM2USK3WE8mS")
271+
XCTAssertEqual(state.delegateOption, 0)
272+
XCTAssertNil(state.delegate)
273+
XCTAssertEqual(state.isFrozen, false)
274+
XCTAssertEqual(state.closeAuthorityOption, 0)
275+
XCTAssertEqual(state.isNativeOption, 0)
276+
XCTAssertEqual(state.owner.base58EncodedString, "E8E6GvyCpbGu7YSFxfhTXGx6SW4VhzVmxWh3gbrgXZNd")
277+
XCTAssertEqual(state.lamports, 0)
278+
XCTAssertEqual(state.isInitialized, true)
279+
XCTAssertEqual(state.isNative, false)
280+
XCTAssertEqual(state.state, 1)
281+
268282
XCTAssertEqual(state.extensions.count, 1)
283+
284+
// Assertions for the extension state
285+
let firstExtension = state.extensions[0]
286+
XCTAssertEqual(firstExtension.type, .immutableOwner)
287+
288+
let extensionState = firstExtension.state as! VecU8<UInt16>
289+
XCTAssertEqual(extensionState.length, 0)
290+
XCTAssertEqual(extensionState.data, Data())
269291
}
270292
}

Tests/SolanaSwiftUnitTests/Other/BufferLayout/BufferLayoutEncodingTests.swift

Lines changed: 92 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -200,68 +200,96 @@ final class BufferLayoutEncodingTests: XCTestCase {
200200
)
201201
}
202202

203-
// func testEncodingToken2022MintState2() throws {
204-
// // Mint FZYEgCWzzedxcmxYvGXSkMrj7TaA3bXoaEv6XMnwtLKh
205-
// let state = Token2022MintState(
206-
// mintAuthorityOption: 1,
207-
// mintAuthority: "FZYEgCWzzedxcmxYvGXSkMrj7TaA3bXoaEv6XMnwtLKh",
208-
// supply: 1_000_000_000_000,
209-
// decimals: 10,
210-
// isInitialized: true,
211-
// freezeAuthorityOption: 10,
212-
// freezeAuthority: nil,
213-
// extensions: []
214-
// )
215-
//
216-
// // Add TransferFeeConfigExtensionState
217-
// let transferConfig = TransferFeeConfigExtensionState(
218-
// length: 108,
219-
// transferFeeConfigAuthority: "11111111111111111111111111111111",
220-
// withdrawWithHeldAuthority: "11111111111111111111111111111111",
221-
// withheldAmount: 1_299_782_865_324_245_038,
222-
// olderTransferFee: .init(
223-
// epoch: 489,
224-
// maximumFee: 8_888_888_888_888_889_344,
225-
// transferFeeBasisPoints: 300
226-
// ),
227-
// newerTransferFee: .init(
228-
// epoch: 489,
229-
// maximumFee: 8_888_888_888_888_889_344,
230-
// transferFeeBasisPoints: 300
231-
// )
232-
// )
233-
// state.extensions.append(TokenExtension(type: 1, state: transferConfig))
234-
//
235-
// // Add InterestBearingConfigExtensionState
236-
// let interestBearingConfig = InterestBearingConfigExtensionState(
237-
// length: 52,
238-
// rateAuthority: "2a9H7uNfUxt7YdS5yH3ZEijdPqpeBtyq7JPtVyi6XKtk",
239-
// initializationTimestamp: 1_692_005_389,
240-
// preUpdateAverageRate: 0,
241-
// lastUpdateTimestamp: 1_692_005_389,
242-
// currentRate: 0
243-
// )
244-
// state.extensions.append(TokenExtension(type: 2, state: interestBearingConfig))
245-
//
246-
// // Serialize the state
247-
// var data = Data()
248-
// try state.serialize(to: &data)
249-
//
250-
// // Base64 encode the serialized data and compare with the expected value
251-
// XCTAssertEqual(
252-
// data.base64EncodedString(),
253-
// "AAAAABdZNqd8UPqRoeBHXdhoEwzZNLf6UnDQ1UDsr4oXimfhquOLA1BVIXECAQAAAAAXWTanfFD6kaHgR13YaBMM2TS3+lJw0NVA7K+KF4pn4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoDKJKHBCRLpAQAAAAAAAACQI15ZrVt7LAHpAQAAAAAAAACQI15ZrVt7LAEKADQAF1k2p3xQ+pGh4Edd2GgTDNk0t/pScNDVQOyviheKZ+EN9NlkAAAAAAAADfTZZAAAAAAAAAYAAQAB"
254-
// )
255-
// }
256-
257-
//
258-
// func testEncodingToken2022AccountState() throws {
259-
// let string =
260-
// "c8d675Tc8/enuGEbVogbaWoW6iY9JFkJIswLnf/gvCXDAcw04n4gWtOj5P12Rb7RAxY9RRwFQOwFWCWPS3OnJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcAAAA="
261-
// let data = Data(base64Encoded: string)!
262-
// var binaryReader = BinaryReader(bytes: data.bytes)
263-
// let state = try Token2022AccountState(from: &binaryReader)
264-
//
265-
// XCTAssertEqual(state.extensions.count, 1)
266-
// }
203+
func testEncodingToken2022MintState2() throws {
204+
// Mint FZYEgCWzzedxcmxYvGXSkMrj7TaA3bXoaEv6XMnwtLKh
205+
var state = Token2022MintState(
206+
mintAuthorityOption: 0,
207+
mintAuthority: "2a9H7uNfUxt7YdS5yH3ZEijdPqpeBtyq7JPtVyi6XKtk",
208+
supply: 8_151_890_602_662_552_490,
209+
decimals: 2,
210+
isInitialized: true,
211+
freezeAuthorityOption: 0,
212+
freezeAuthority: "2a9H7uNfUxt7YdS5yH3ZEijdPqpeBtyq7JPtVyi6XKtk",
213+
extensions: []
214+
)
215+
216+
// Add TransferFeeConfigExtensionState
217+
let transferConfig = TransferFeeConfigExtensionState(
218+
length: 108,
219+
transferFeeConfigAuthority: "11111111111111111111111111111111",
220+
withdrawWithHeldAuthority: "11111111111111111111111111111111",
221+
withheldAmount: 1_299_782_865_324_245_038,
222+
olderTransferFee: .init(
223+
epoch: 489,
224+
maximumFee: 8_888_888_888_888_889_344,
225+
transferFeeBasisPoints: 300
226+
),
227+
newerTransferFee: .init(
228+
epoch: 489,
229+
maximumFee: 8_888_888_888_888_889_344,
230+
transferFeeBasisPoints: 300
231+
)
232+
)
233+
234+
// Add InterestBearingConfigExtensionState
235+
let interestBearingConfig = InterestBearingConfigExtensionState(
236+
length: 52,
237+
rateAuthority: "2a9H7uNfUxt7YdS5yH3ZEijdPqpeBtyq7JPtVyi6XKtk",
238+
initializationTimestamp: 1_692_005_389,
239+
preUpdateAverageRate: 0,
240+
lastUpdateTimestamp: 1_692_005_389,
241+
currentRate: 0
242+
)
243+
244+
state.extensions = [
245+
.init(type: .transferFeeConfig, state: transferConfig),
246+
.init(type: .interestBearingConfig, state: interestBearingConfig),
247+
.init(type: .defaultAccountState, state: VecU8(length: UInt16(1), data: Data([1]))),
248+
]
249+
250+
// Serialize the state
251+
var data = Data()
252+
try state.serialize(to: &data)
253+
254+
// Base64 encode the serialized data and compare with the expected value
255+
XCTAssertEqual(
256+
data.base64EncodedString(),
257+
"AAAAABdZNqd8UPqRoeBHXdhoEwzZNLf6UnDQ1UDsr4oXimfhquOLA1BVIXECAQAAAAAXWTanfFD6kaHgR13YaBMM2TS3+lJw0NVA7K+KF4pn4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoDKJKHBCRLpAQAAAAAAAACQI15ZrVt7LAHpAQAAAAAAAACQI15ZrVt7LAEKADQAF1k2p3xQ+pGh4Edd2GgTDNk0t/pScNDVQOyviheKZ+EN9NlkAAAAAAAADfTZZAAAAAAAAAYAAQAB"
258+
)
259+
}
260+
261+
func testEncodingTokenAccountState() throws {
262+
let accountState = Token2022AccountState(
263+
mint: "8nxJnGJDyvehdEHw4PgRc7ccJ1Zi134PhM2USK3WE8mS",
264+
owner: "E8E6GvyCpbGu7YSFxfhTXGx6SW4VhzVmxWh3gbrgXZNd",
265+
lamports: 0,
266+
delegateOption: 0,
267+
delegate: nil,
268+
isInitialized: true,
269+
isFrozen: false,
270+
state: 1,
271+
isNativeOption: 0,
272+
rentExemptReserve: nil,
273+
isNativeRaw: 0,
274+
isNative: false,
275+
delegatedAmount: 0,
276+
closeAuthorityOption: 0,
277+
extensions: [
278+
.init(
279+
type: .immutableOwner,
280+
state: VecU8<UInt16>(length: 0, data: Data())
281+
),
282+
]
283+
)
284+
285+
// Serialize the state
286+
var data = Data()
287+
try accountState.serialize(to: &data)
288+
289+
// Base64 encode the serialized data and compare with the expected value
290+
XCTAssertEqual(
291+
data.base64EncodedString(),
292+
"c8d675Tc8/enuGEbVogbaWoW6iY9JFkJIswLnf/gvCXDAcw04n4gWtOj5P12Rb7RAxY9RRwFQOwFWCWPS3OnJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcAAAA="
293+
)
294+
}
267295
}

0 commit comments

Comments
 (0)