Skip to content

Commit 16b9aa5

Browse files
committed
feat: add raw transaction payload rlp decoding
1 parent 43e671f commit 16b9aa5

File tree

2 files changed

+44
-18
lines changed

2 files changed

+44
-18
lines changed

Sources/FlowSDK/Models/Transaction.swift

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -388,13 +388,22 @@ extension Transaction: RLPDecodable {
388388
public init(rlpItem: RLPItem) throws {
389389
let items = try rlpItem.getListItems()
390390

391-
guard items.count == 3 else {
391+
let payloadRLPListItemCount = 9
392+
let payloadRLPListItems: [RLPItem]
393+
let hasSignature: Bool
394+
switch items.count {
395+
case 3:
396+
hasSignature = true
397+
payloadRLPListItems = try items[0].getListItems()
398+
case payloadRLPListItemCount:
399+
hasSignature = false
400+
payloadRLPListItems = items
401+
default:
392402
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
393403
}
394404

395405
// payload
396-
let payloadRLPListItems = try items[0].getListItems()
397-
guard payloadRLPListItems.count == 9 else {
406+
guard payloadRLPListItems.count == payloadRLPListItemCount else {
398407
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
399408
}
400409
self.script = try Data(rlpItem: payloadRLPListItems[0])
@@ -410,23 +419,28 @@ extension Transaction: RLPDecodable {
410419
self.authorizers = try payloadRLPListItems[8].getListItems()
411420
.map { Address(data: try Data(rlpItem: $0)) }
412421

413-
// payloadSignatures & envelopeSignatures
414-
self.payloadSignatures = try items[1].getListItems()
415-
.map { try Transaction.Signature(rlpItem: $0) }
416-
self.envelopeSignatures = try items[2].getListItems()
417-
.map { try Transaction.Signature(rlpItem: $0) }
418-
419-
for (index, payloadSignature) in payloadSignatures.enumerated() {
420-
guard payloadSignature.signerIndex < signerList.count else {
421-
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
422+
if hasSignature {
423+
// payloadSignatures & envelopeSignatures
424+
self.payloadSignatures = try items[1].getListItems()
425+
.map { try Transaction.Signature(rlpItem: $0) }
426+
self.envelopeSignatures = try items[2].getListItems()
427+
.map { try Transaction.Signature(rlpItem: $0) }
428+
429+
for (index, payloadSignature) in payloadSignatures.enumerated() {
430+
guard payloadSignature.signerIndex < signerList.count else {
431+
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
432+
}
433+
payloadSignatures[index].address = signerList[payloadSignature.signerIndex]
422434
}
423-
payloadSignatures[index].address = signerList[payloadSignature.signerIndex]
424-
}
425-
for (index, envelopeSignature) in envelopeSignatures.enumerated() {
426-
guard envelopeSignature.signerIndex < signerList.count else {
427-
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
435+
for (index, envelopeSignature) in envelopeSignatures.enumerated() {
436+
guard envelopeSignature.signerIndex < signerList.count else {
437+
throw RLPDecodingError.invalidType(rlpItem, type: Self.self)
438+
}
439+
envelopeSignatures[index].address = signerList[envelopeSignature.signerIndex]
428440
}
429-
envelopeSignatures[index].address = signerList[envelopeSignature.signerIndex]
441+
} else {
442+
self.payloadSignatures = []
443+
self.envelopeSignatures = []
430444
}
431445
}
432446
}

Tests/FlowSDKTests/Models/TransactionTests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,18 @@ final class TransactionTests: XCTestCase {
548548
XCTAssertEqual(result, transaction)
549549
}
550550

551+
func testRLPDecodeWithoutSignature() throws {
552+
// Arrange
553+
let rlpEncodedData = Data(hex: "f90646b905ad696d706f72742046756e6769626c65546f6b656e2066726f6d203078396130373636643933623636303862370a696d706f727420466c6f77546f6b656e2066726f6d203078376536306466303432613963303836380a696d706f727420426c6f63746f546f6b656e2066726f6d203078366530373937616339383730303566350a696d706f727420466c6f7753776170506169722066726f6d203078643938353433323962376564663133360a696d706f727420426c745573647453776170506169722066726f6d203078633539363034643465363566313462330a0a7472616e73616374696f6e28616d6f756e74496e3a205546697836342c206d696e416d6f756e744f75743a2055466978363429207b0a202070726570617265287369676e65723a20417574684163636f756e7429207b0a202020200a202020200a0a202020206c657420666c6f77546f6b656e5661756c74203d207369676e65722e626f72726f773c26466c6f77546f6b656e2e5661756c743e2866726f6d3a202f73746f726167652f666c6f77546f6b656e5661756c7429200a2020202020203f3f2070616e69632822436f756c64206e6f7420626f72726f772061207265666572656e636520746f205661756c7422290a0a202020206c657420746f6b656e305661756c74203c2d20666c6f77546f6b656e5661756c742e776974686472617728616d6f756e743a20616d6f756e74496e29206173212040466c6f77546f6b656e2e5661756c740a202020206c657420746f6b656e315661756c74203c2d20466c6f7753776170506169722e73776170546f6b656e31466f72546f6b656e322866726f6d3a203c2d20746f6b656e305661756c74290a6c657420746f6b656e325661756c74203c2d20426c745573647453776170506169722e73776170546f6b656e32466f72546f6b656e312866726f6d3a203c2d20746f6b656e315661756c74290a0a2020202020206966207369676e65722e626f72726f773c26426c6f63746f546f6b656e2e5661756c743e2866726f6d3a202f73746f726167652f626c6f63746f546f6b656e5661756c7429203d3d206e696c207b0a202020207369676e65722e73617665283c2d426c6f63746f546f6b656e2e637265617465456d7074795661756c7428292c20746f3a202f73746f726167652f626c6f63746f546f6b656e5661756c74290a202020207369676e65722e6c696e6b3c26426c6f63746f546f6b656e2e5661756c747b46756e6769626c65546f6b656e2e52656365697665727d3e280a2020202020202f7075626c69632f626c6f63746f546f6b656e52656365697665722c0a2020202020207461726765743a202f73746f726167652f626c6f63746f546f6b656e5661756c740a20202020290a202020207369676e65722e6c696e6b3c26426c6f63746f546f6b656e2e5661756c747b46756e6769626c65546f6b656e2e42616c616e63657d3e280a2020202020202f7075626c69632f626c6f63746f546f6b656e42616c616e63652c0a2020202020207461726765743a202f73746f726167652f626c6f63746f546f6b656e5661756c740a20202020290a20207d0a202020206c657420626c6f63746f546f6b656e5661756c74203d207369676e65722e626f72726f773c26426c6f63746f546f6b656e2e5661756c743e2866726f6d3a202f73746f726167652f626c6f63746f546f6b656e5661756c7429200a2020202020203f3f2070616e69632822436f756c64206e6f7420626f72726f772061207265666572656e636520746f205661756c7422290a0a2020202061737365727428746f6b656e325661756c742e62616c616e6365203e3d206d696e416d6f756e744f75742c206d6573736167653a20224f757470757420616d6f756e7420746f6f20736d616c6c22290a0a20202020626c6f63746f546f6b656e5661756c742e6465706f7369742866726f6d3a203c2d20746f6b656e325661756c74290a20207d0a7d0af84ea67b2274797065223a22554669783634222c2276616c7565223a22312e3030303030303030227da67b2274797065223a22554669783634222c2276616c7565223a22302e3030323439323530227da0658fb5339ede5a0e66a6a47db465c3fb07ecc00dabb97ce5c5ebf6509cadf58182012c88f086a545ce3c552d8201dd8201a188f086a545ce3c552dc98816cf982698f55d39")
554+
555+
// Act
556+
let transaction = try Transaction(rlpData: rlpEncodedData)
557+
558+
// Assert
559+
XCTAssertEqual(transaction.payloadSignatures, [])
560+
XCTAssertEqual(transaction.envelopeSignatures, [])
561+
}
562+
551563
}
552564

553565
private extension Transaction {

0 commit comments

Comments
 (0)