Skip to content

Commit 18a7c3b

Browse files
Merge branch 'develop' into feature/EIP-1559
2 parents 0abdb5d + f14a1bb commit 18a7c3b

File tree

4 files changed

+125
-26
lines changed

4 files changed

+125
-26
lines changed

Sources/web3swift/Convenience/Base58.swift

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ struct Base58 {
5656
}
5757

5858
for b in base58 {
59-
// str = "\(str)\(base58Alphabet[String.Index(encodedOffset: Int(b))])"
6059
str = "\(str)\(base58Alphabet[String.Index(utf16Offset: Int(b), in: base58Alphabet)])"
6160
}
6261

@@ -67,23 +66,27 @@ struct Base58 {
6766
static func bytesFromBase58(_ base58: String) -> [UInt8] {
6867
// remove leading and trailing whitespaces
6968
let string = base58.trimmingCharacters(in: CharacterSet.whitespaces)
70-
7169
guard !string.isEmpty else { return [] }
7270

73-
var zerosCount = 0
74-
var length = 0
71+
// count leading ASCII "1"'s [decodes directly to binary zero bytes]
72+
var leadingZeros = 0
7573
for c in string {
7674
if c != "1" { break }
77-
zerosCount += 1
75+
leadingZeros += 1
7876
}
7977

80-
let size = string.lengthOfBytes(using: String.Encoding.utf8) * 733 / 1000 + 1 - zerosCount
81-
var base58: [UInt8] = Array(repeating: 0, count: size)
78+
// calculate the size of the decoded output, rounded up
79+
let size = (string.lengthOfBytes(using: String.Encoding.utf8) - leadingZeros) * 733 / 1000 + 1
80+
81+
// allocate a buffer large enough for the decoded output
82+
var base58: [UInt8] = Array(repeating: 0, count: size + leadingZeros)
83+
84+
// decode what remains of the data
85+
var length = 0
8286
for c in string where c != " " {
8387
// search for base58 character
84-
guard let base58Index = base58Alphabet.index(of: c) else { return [] }
88+
guard let base58Index = base58Alphabet.firstIndex(of: c) else { return [] }
8589

86-
// var carry = base58Index.encodedOffset
8790
var carry = base58Index.utf16Offset(in: base58Alphabet)
8891
var i = 0
8992
for j in 0...base58.count where carry != 0 || i < length {
@@ -97,20 +100,16 @@ struct Base58 {
97100
length = i
98101
}
99102

100-
// skip leading zeros
101-
var zerosToRemove = 0
102-
103+
// calculate how many leading zero bytes we have
104+
var totalZeros = 0
103105
for b in base58 {
104106
if b != 0 { break }
105-
zerosToRemove += 1
107+
totalZeros += 1
106108
}
107-
base58.removeFirst(zerosToRemove)
109+
// remove the excess zero bytes
110+
base58.removeFirst(totalZeros - leadingZeros)
108111

109-
var result: [UInt8] = Array(repeating: 0, count: zerosCount)
110-
for b in base58 {
111-
result.append(b)
112-
}
113-
return result
112+
return base58
114113
}
115114
}
116115

@@ -158,11 +157,4 @@ extension String {
158157
return bytes
159158
}
160159

161-
// public var littleEndianHexToUInt: UInt {
162-
// let data = Data.fromHex(self)!
163-
// let revensed =
164-
// return UInt(sel)
165-
// return UInt(self.dataWithHexString().bytes.reversed().fullHexString, radix: 16)!
166-
// }
167-
168160
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Package: web3swift
2+
// Created by Alex Vlasov.
3+
// Copyright © 2018 Alex Vlasov. All rights reserved.
4+
//
5+
// Base58 tests by Mark Loit 2022
6+
//
7+
8+
import XCTest
9+
10+
@testable import web3swift
11+
12+
//
13+
// This Test suite is intended to hold various tests for our data conversion code
14+
// that don't seem to fit elsewhere
15+
//
16+
17+
// Some base58 test vectors pulled from: https://tools.ietf.org/id/draft-msporny-base58-01.html
18+
// note that one of the return values is incorrect in the reference above, it is corrected here
19+
class DataConversionTests: XCTestCase {
20+
// test an empty input for the base58 decoder & decoder
21+
func testBase58() throws {
22+
let vector = ""
23+
24+
print("Testing Base58 Decode \"\(vector)\"")
25+
guard let resultDecoded = vector.base58DecodedData else { return XCTFail("base58 decode unexpectedly returned nil") }
26+
XCTAssert(resultDecoded.count == 0)
27+
28+
print("Testing Base58 Encode \"\(vector)\"")
29+
let resultEncoded1 = vector.base58EncodedString
30+
XCTAssert(resultEncoded1 == vector)
31+
32+
print("Testing Base58 Encode [empty]")
33+
let arr = resultDecoded.withUnsafeBytes { Array($0) }
34+
let resultEncoded2 = arr.base58EncodedString
35+
XCTAssert(resultEncoded2 == vector)
36+
}
37+
38+
// test a reference string "Hello World!"
39+
func testBase58HelloWorld() throws {
40+
let vector = "2NEpo7TZRRrLZSi2U"
41+
let expected = "Hello World!"
42+
43+
print("Testing Base58 Decode \"\(vector)\"")
44+
guard let resultDecoded = vector.base58DecodedData else { return XCTFail("base58 decode unexpectedly returned nil") }
45+
let arr = resultDecoded.withUnsafeBytes { Array($0) }
46+
let str = String(bytes: arr, encoding: .utf8)
47+
XCTAssert(str == expected)
48+
49+
print("Testing Base58 Encode \"\(expected)\"")
50+
let resultEncoded = expected.base58EncodedString
51+
XCTAssert(resultEncoded == vector)
52+
}
53+
54+
// test a reference string "The quick brown fox jumps over the lazy dog."
55+
func testBase58LazyFox() throws {
56+
let vector = "USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z"
57+
let expected = "The quick brown fox jumps over the lazy dog."
58+
59+
print("Testing Base58 Decode \"\( vector )\"")
60+
guard let resultDecoded = vector.base58DecodedData else { return XCTFail("base58 decode unexpectedly returned nil") }
61+
let arr = resultDecoded.withUnsafeBytes { Array($0) }
62+
let str = String(bytes: arr, encoding: .utf8)
63+
XCTAssert(str == expected)
64+
65+
print("Testing Base58 Encode \"\(expected)\"")
66+
let resultEncoded = expected.base58EncodedString
67+
XCTAssert(resultEncoded == vector)
68+
}
69+
70+
// test a reference binary value "0x000000287fb4cd" (tested as a hex string to validate length) **corrected from ref document
71+
func testBase58HexData() throws {
72+
let vector = "111233QC4"
73+
let expected = "0x000000287fb4cd"
74+
75+
print("Testing Base58 Decode \"\(vector)\"")
76+
guard let resultDecoded = vector.base58DecodedData else { return XCTFail("base58 decode unexpectedly returned nil") }
77+
let str = resultDecoded.toHexString().addHexPrefix()
78+
XCTAssert(str == expected)
79+
80+
print("Testing Base58 Encode \(expected)")
81+
let arr = resultDecoded.withUnsafeBytes { Array($0) }
82+
let resultEncoded = arr.base58EncodedString
83+
XCTAssert(resultEncoded == vector)
84+
}
85+
86+
// test all zero encoded data from issue 424
87+
func testBase58Zero() throws {
88+
let vector = "11111111111111111111111111111111"
89+
let expected = "0x0000000000000000000000000000000000000000000000000000000000000000"
90+
91+
print("Testing Base58 Decode \"\(vector)\"")
92+
guard let resultDecoded = vector.base58DecodedData else { return XCTFail("base58 decode unexpectedly returned nil") }
93+
let str = resultDecoded.toHexString().addHexPrefix()
94+
XCTAssert(str == expected)
95+
96+
print("Testing Base58 Encode \(expected)")
97+
let arr = resultDecoded.withUnsafeBytes { Array($0) }
98+
let resultEncoded = arr.base58EncodedString
99+
XCTAssert(resultEncoded == vector)
100+
}
101+
102+
}

Tests/web3swiftTests/remoteTests/RemoteTests.xctestplan

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
{
1616
"skippedTests" : [
1717
"EIP1559Tests",
18+
"DataConversionTests",
1819
"EIP712Tests",
1920
"web3swiftAdvancedABIv2Tests",
2021
"web3swiftBasicLocalNodeTests",

web3swift.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@
192192
5CF7E8BA276B79380009900F /* web3swiftGanacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF7E8B5276B79380009900F /* web3swiftGanacheTests.swift */; };
193193
5CF7E8BB276B79380009900F /* web3swiftENSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF7E8B6276B79380009900F /* web3swiftENSTests.swift */; };
194194
5CF7E8BC276B79380009900F /* web3swiftWebsocketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF7E8B7276B79380009900F /* web3swiftWebsocketTests.swift */; };
195+
604FA4FF27ECBDC80021108F /* DataConversionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 604FA4FE27ECBDC80021108F /* DataConversionTests.swift */; };
195196
CB50A52827060BD600D7E39B /* EIP712Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB50A52727060BD600D7E39B /* EIP712Tests.swift */; };
196197
E22A911F241ED71A00EC1021 /* browser.min.js in Resources */ = {isa = PBXBuildFile; fileRef = E22A911E241ED71A00EC1021 /* browser.min.js */; };
197198
E2B76710241ED479007EBFE3 /* browser.js in Resources */ = {isa = PBXBuildFile; fileRef = E2B7670F241ED479007EBFE3 /* browser.js */; };
@@ -411,6 +412,7 @@
411412
5CF7E8B5276B79380009900F /* web3swiftGanacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = web3swiftGanacheTests.swift; sourceTree = "<group>"; };
412413
5CF7E8B6276B79380009900F /* web3swiftENSTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = web3swiftENSTests.swift; sourceTree = "<group>"; };
413414
5CF7E8B7276B79380009900F /* web3swiftWebsocketTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = web3swiftWebsocketTests.swift; sourceTree = "<group>"; };
415+
604FA4FE27ECBDC80021108F /* DataConversionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataConversionTests.swift; sourceTree = "<group>"; };
414416
CB50A52727060BD600D7E39B /* EIP712Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EIP712Tests.swift; sourceTree = "<group>"; };
415417
CB50A52927060C5300D7E39B /* EIP712.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EIP712.swift; sourceTree = "<group>"; };
416418
E22A911E241ED71A00EC1021 /* browser.min.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = browser.min.js; sourceTree = "<group>"; };
@@ -989,6 +991,7 @@
989991
isa = PBXGroup;
990992
children = (
991993
5C26D89F27F3725500431EB0 /* EIP1559BlockTests.swift */,
994+
604FA4FE27ECBDC80021108F /* DataConversionTests.swift */,
992995
5CF7E8A0276B79290009900F /* web3swiftAdvancedABIv2Tests.swift */,
993996
5CF7E89C276B79280009900F /* web3swiftBasicLocalNodeTests.swift */,
994997
5CF7E8A1276B79290009900F /* web3swiftEIP67Tests.swift */,
@@ -1396,6 +1399,7 @@
13961399
5CF7E8B2276B792A0009900F /* web3swiftEIP67Tests.swift in Sources */,
13971400
5CF7E8AE276B792A0009900F /* web3swiftPromisesTests.swift in Sources */,
13981401
5CF7E8A2276B79290009900F /* web3swiftEIP681Tests.swift in Sources */,
1402+
604FA4FF27ECBDC80021108F /* DataConversionTests.swift in Sources */,
13991403
5CF7E8B1276B792A0009900F /* web3swiftAdvancedABIv2Tests.swift in Sources */,
14001404
5CF7E8A6276B792A0009900F /* web3swiftHelpers.swift in Sources */,
14011405
5CF7E8BA276B79380009900F /* web3swiftGanacheTests.swift in Sources */,

0 commit comments

Comments
 (0)