Skip to content

Commit 8ad5264

Browse files
Merge pull request #12 from BaldyAsh/erc1400improvementsAndRequiredERCs
A lot of fixies in ERCs. Added ERCs: 1410, 1594, 1633, 1643, 1644, 1376…
2 parents 2cfc5ce + 607a4e3 commit 8ad5264

File tree

17 files changed

+5030
-124
lines changed

17 files changed

+5030
-124
lines changed

web3swift.xcodeproj/project.pbxproj

+96
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,14 @@
222222
E2DCA655218C879900F94FBA /* ENSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B219DC162154F3EE0035BF94 /* ENSResolver.swift */; };
223223
E2DCA656218C87A500F94FBA /* ENS.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E668CD214F8A7B00C3CC2D /* ENS.swift */; };
224224
E2DCA657218C87A500F94FBA /* ENSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B219DC162154F3EE0035BF94 /* ENSResolver.swift */; };
225+
E2F8081F21CA90BA00B6BF15 /* Web3+ERC1410.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8081E21CA90BA00B6BF15 /* Web3+ERC1410.swift */; };
226+
E2F8082421CA9C3B00B6BF15 /* Web3+ERC1594.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8082321CA9C3B00B6BF15 /* Web3+ERC1594.swift */; };
227+
E2F8082721CA9F3100B6BF15 /* Web3+ERC1644.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8082621CA9F3100B6BF15 /* Web3+ERC1644.swift */; };
228+
E2F8082A21CAA07000B6BF15 /* Web3+ERC1643.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8082921CAA07000B6BF15 /* Web3+ERC1643.swift */; };
229+
E2F8082D21CB009A00B6BF15 /* Web3+ERC1633.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8082C21CB009A00B6BF15 /* Web3+ERC1633.swift */; };
230+
E2F8083021CB096D00B6BF15 /* Web3+ERC721x.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8082F21CB096D00B6BF15 /* Web3+ERC721x.swift */; };
231+
E2F8083321CB0EF300B6BF15 /* Web3+ERC1155.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8083221CB0EF300B6BF15 /* Web3+ERC1155.swift */; };
232+
E2F8083621CB142000B6BF15 /* Web3+ERC1376.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F8083521CB142000B6BF15 /* Web3+ERC1376.swift */; };
225233
/* End PBXBuildFile section */
226234

227235
/* Begin PBXContainerItemProxy section */
@@ -404,6 +412,14 @@
404412
E279C9FD21C48A570081695F /* Web3+ERC888.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC888.swift"; sourceTree = "<group>"; };
405413
E2C590752152835400FF53D3 /* JSONRPCrequestDispatcher+ObjC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONRPCrequestDispatcher+ObjC.swift"; sourceTree = "<group>"; };
406414
E2E94C5F217788E0005F54A0 /* Web3+ERC721.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC721.swift"; sourceTree = "<group>"; };
415+
E2F8081E21CA90BA00B6BF15 /* Web3+ERC1410.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1410.swift"; sourceTree = "<group>"; };
416+
E2F8082321CA9C3B00B6BF15 /* Web3+ERC1594.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1594.swift"; sourceTree = "<group>"; };
417+
E2F8082621CA9F3100B6BF15 /* Web3+ERC1644.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1644.swift"; sourceTree = "<group>"; };
418+
E2F8082921CAA07000B6BF15 /* Web3+ERC1643.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1643.swift"; sourceTree = "<group>"; };
419+
E2F8082C21CB009A00B6BF15 /* Web3+ERC1633.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1633.swift"; sourceTree = "<group>"; };
420+
E2F8082F21CB096D00B6BF15 /* Web3+ERC721x.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC721x.swift"; sourceTree = "<group>"; };
421+
E2F8083221CB0EF300B6BF15 /* Web3+ERC1155.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1155.swift"; sourceTree = "<group>"; };
422+
E2F8083521CB142000B6BF15 /* Web3+ERC1376.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Web3+ERC1376.swift"; sourceTree = "<group>"; };
407423
FB43EC035C593F9E5A3644B6 /* Pods-web3swift-macOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-web3swift-macOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-web3swift-macOS/Pods-web3swift-macOS.debug.xcconfig"; sourceTree = "<group>"; };
408424
FC1E6C115639177F2629E42A /* Pods_web3swift_osx.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_web3swift_osx.framework; sourceTree = BUILT_PRODUCTS_DIR; };
409425
/* End PBXFileReference section */
@@ -622,6 +638,14 @@
622638
8159C50921343EF900197B91 /* PrecompiledContracts */ = {
623639
isa = PBXGroup;
624640
children = (
641+
E2F8083421CB140E00B6BF15 /* ERC1376 */,
642+
E2F8083121CB0ED400B6BF15 /* ERC1155 */,
643+
E2F8082E21CB095A00B6BF15 /* ERC721x */,
644+
E2F8082B21CB008800B6BF15 /* ERC1633 */,
645+
E2F8082821CAA05C00B6BF15 /* ERC1643 */,
646+
E2F8082521CA9F1400B6BF15 /* ERC1644 */,
647+
E2F8082221CA9C1600B6BF15 /* ERC1594 */,
648+
E2F8081D21CA8F5800B6BF15 /* ERC1410 */,
625649
E279C9FC21C48A430081695F /* ERC888 */,
626650
E279C9F921C484400081695F /* ERC1400 */,
627651
E279C9F621C47CC10081695F /* ERC820 */,
@@ -1010,6 +1034,70 @@
10101034
path = ERC721;
10111035
sourceTree = "<group>";
10121036
};
1037+
E2F8081D21CA8F5800B6BF15 /* ERC1410 */ = {
1038+
isa = PBXGroup;
1039+
children = (
1040+
E2F8081E21CA90BA00B6BF15 /* Web3+ERC1410.swift */,
1041+
);
1042+
path = ERC1410;
1043+
sourceTree = "<group>";
1044+
};
1045+
E2F8082221CA9C1600B6BF15 /* ERC1594 */ = {
1046+
isa = PBXGroup;
1047+
children = (
1048+
E2F8082321CA9C3B00B6BF15 /* Web3+ERC1594.swift */,
1049+
);
1050+
path = ERC1594;
1051+
sourceTree = "<group>";
1052+
};
1053+
E2F8082521CA9F1400B6BF15 /* ERC1644 */ = {
1054+
isa = PBXGroup;
1055+
children = (
1056+
E2F8082621CA9F3100B6BF15 /* Web3+ERC1644.swift */,
1057+
);
1058+
path = ERC1644;
1059+
sourceTree = "<group>";
1060+
};
1061+
E2F8082821CAA05C00B6BF15 /* ERC1643 */ = {
1062+
isa = PBXGroup;
1063+
children = (
1064+
E2F8082921CAA07000B6BF15 /* Web3+ERC1643.swift */,
1065+
);
1066+
path = ERC1643;
1067+
sourceTree = "<group>";
1068+
};
1069+
E2F8082B21CB008800B6BF15 /* ERC1633 */ = {
1070+
isa = PBXGroup;
1071+
children = (
1072+
E2F8082C21CB009A00B6BF15 /* Web3+ERC1633.swift */,
1073+
);
1074+
path = ERC1633;
1075+
sourceTree = "<group>";
1076+
};
1077+
E2F8082E21CB095A00B6BF15 /* ERC721x */ = {
1078+
isa = PBXGroup;
1079+
children = (
1080+
E2F8082F21CB096D00B6BF15 /* Web3+ERC721x.swift */,
1081+
);
1082+
path = ERC721x;
1083+
sourceTree = "<group>";
1084+
};
1085+
E2F8083121CB0ED400B6BF15 /* ERC1155 */ = {
1086+
isa = PBXGroup;
1087+
children = (
1088+
E2F8083221CB0EF300B6BF15 /* Web3+ERC1155.swift */,
1089+
);
1090+
path = ERC1155;
1091+
sourceTree = "<group>";
1092+
};
1093+
E2F8083421CB140E00B6BF15 /* ERC1376 */ = {
1094+
isa = PBXGroup;
1095+
children = (
1096+
E2F8083521CB142000B6BF15 /* Web3+ERC1376.swift */,
1097+
);
1098+
path = ERC1376;
1099+
sourceTree = "<group>";
1100+
};
10131101
/* End PBXGroup section */
10141102

10151103
/* Begin PBXHeadersBuildPhase section */
@@ -1270,6 +1358,7 @@
12701358
files = (
12711359
E2DCA654218C879900F94FBA /* ENS.swift in Sources */,
12721360
E2DCA655218C879900F94FBA /* ENSResolver.swift in Sources */,
1361+
E2F8082421CA9C3B00B6BF15 /* Web3+ERC1594.swift in Sources */,
12731362
81C146F71FF274B200AA943E /* Web3+Structures.swift in Sources */,
12741363
8104E2281FE82BDC00F952CB /* Web3+Utils.swift in Sources */,
12751364
E228BE3E21A4492A0085268C /* Web3Legacy+Options.swift in Sources */,
@@ -1288,6 +1377,7 @@
12881377
81EB1E4B208173D7003BD47F /* Web3+Personal.swift in Sources */,
12891378
E228BE7821A4492B0085268C /* Web3Legacy+BrowserFunctions.swift in Sources */,
12901379
81909D1821862D5A007D2AE5 /* Web3+Eventloop.swift in Sources */,
1380+
E2F8082721CA9F3100B6BF15 /* Web3+ERC1644.swift in Sources */,
12911381
81A1824B20D7DF1B0016741F /* Promise+Web3+Personal+UnlockAccount.swift in Sources */,
12921382
81A1823A20D79AD40016741F /* Promise+Web3+Eth+SendRawTransaction.swift in Sources */,
12931383
E228BE0021A4492A0085268C /* TransactionSignerLegacy.swift in Sources */,
@@ -1305,6 +1395,7 @@
13051395
81FB21FE207BB297007F9A83 /* EIP67Code.swift in Sources */,
13061396
81A1821A20D5A6F70016741F /* Promise+HttpProvider.swift in Sources */,
13071397
E228BECD21A4C89F0085268C /* Web3Legacy+Contract.swift in Sources */,
1398+
E2F8083621CB142000B6BF15 /* Web3+ERC1376.swift in Sources */,
13081399
E279C9F821C47CD00081695F /* Web3+ERC820.swift in Sources */,
13091400
81A1823720D6E2BB0016741F /* Promise+Web3+Eth+GetBlockByHash.swift in Sources */,
13101401
81909D51218DAEC0007D2AE5 /* Promise+Web3+Personal+CreateAccount.swift in Sources */,
@@ -1313,6 +1404,7 @@
13131404
E279C9EF21C46A140081695F /* Web3+ERC165.swift in Sources */,
13141405
81C5DA282072E18200424CD6 /* NativeTypesEncoding+Extensions.swift in Sources */,
13151406
8123E1C7200CBAC200B6D3AB /* Dictionary+Extension.swift in Sources */,
1407+
E2F8083321CB0EF300B6BF15 /* Web3+ERC1155.swift in Sources */,
13161408
E228BE7421A4492B0085268C /* Promise+Web3Legacy+Eth+Call.swift in Sources */,
13171409
985BFD4E216E2E0A00B28C14 /* Promise+Web3+TxPool.swift in Sources */,
13181410
985BFD4A216CE8B100B28C14 /* Web3+TxPool.swift in Sources */,
@@ -1324,6 +1416,7 @@
13241416
81ED4EA82190D922003E932E /* NonceMiddleware.swift in Sources */,
13251417
81A1822520D678590016741F /* Promise+Web3+Eth+GetGasPrice.swift in Sources */,
13261418
8113DE7C1FD8514400CD8DF1 /* NSRegularExpressionExtension.swift in Sources */,
1419+
E2F8082A21CAA07000B6BF15 /* Web3+ERC1643.swift in Sources */,
13271420
81C5DA2E2074EBF500424CD6 /* EthereumContract.swift in Sources */,
13281421
810B0F9E1FEC5B9C00CF0DA2 /* Web3+Eth.swift in Sources */,
13291422
81531AA01FE7C07A002192CC /* EthereumKeystoreV3.swift in Sources */,
@@ -1336,15 +1429,18 @@
13361429
81DDECCF1FDF004E0063684A /* Web3.swift in Sources */,
13371430
81A1823420D6E1FD0016741F /* Promise+Web3+Eth+GetBlockByNumber.swift in Sources */,
13381431
81A1822820D678BF0016741F /* Promise+Web3+Eth+GetAccounts.swift in Sources */,
1432+
E2F8081F21CA90BA00B6BF15 /* Web3+ERC1410.swift in Sources */,
13391433
E228BE3621A4492A0085268C /* Web3Legacy+TransactionIntermediate.swift in Sources */,
13401434
81A7B2512143C3A8004CD2C7 /* NameHash.swift in Sources */,
1435+
E2F8083021CB096D00B6BF15 /* Web3+ERC721x.swift in Sources */,
13411436
81C5DA312074EC1E00424CD6 /* ContractProtocol.swift in Sources */,
13421437
E228BED121A4C89F0085268C /* Web3Legacy+Instance.swift in Sources */,
13431438
815630002007B48800A0EC2F /* BIP32KeystoreJSONStructure.swift in Sources */,
13441439
8123E1CB200CBB2200B6D3AB /* Array+Extension.swift in Sources */,
13451440
E228BECF21A4C89F0085268C /* Web3Legacy+Eth.swift in Sources */,
13461441
E228BE6221A4492B0085268C /* Promise+Web3Legacy+Eth+EstimateGas.swift in Sources */,
13471442
E228BE0221A4492A0085268C /* EthereumTransactionLegacy.swift in Sources */,
1443+
E2F8082D21CB009A00B6BF15 /* Web3+ERC1633.swift in Sources */,
13481444
813FFF8D1FD82EEB006379A2 /* String+Extension.swift in Sources */,
13491445
E228BE4421A4492A0085268C /* ENSLegacy.swift in Sources */,
13501446
81A1823120D68A110016741F /* Promise+Batching.swift in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
//
2+
// Web3+ERC1155.swift
3+
// web3swift-iOS
4+
//
5+
// Created by Anton Grigorev on 20/12/2018.
6+
// Copyright © 2018 The Matter Inc. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import BigInt
11+
import PromiseKit
12+
import EthereumAddress
13+
14+
//Multi Token Standard
15+
protocol IERC1155: IERC165 {
16+
17+
func safeTransferFrom(from: EthereumAddress, to: EthereumAddress, originalOwner: EthereumAddress, id: BigUInt, value: BigUInt, data: [UInt8]) throws -> WriteTransaction
18+
19+
func safeBatchTransferFrom(from: EthereumAddress, to: EthereumAddress, originalOwner: EthereumAddress, ids: [BigUInt], values: [BigUInt], data: [UInt8]) throws -> WriteTransaction
20+
21+
func balanceOf(account: EthereumAddress, id: BigUInt) throws -> BigUInt
22+
23+
func setApprovalForAll(from: EthereumAddress, operator user: EthereumAddress, approved: Bool, scope: Data) throws -> WriteTransaction
24+
25+
func isApprovedForAll(owner: EthereumAddress, operator user: EthereumAddress, scope: Data) throws -> Bool
26+
}
27+
28+
protocol IERC1155Metadata {
29+
func uri(id: BigUInt) throws -> String
30+
func name(id: BigUInt) throws -> String
31+
}
32+
33+
public class ERC1155: IERC1155 {
34+
35+
@available(*, deprecated, renamed: "transactionOptions")
36+
public var options: Web3Options = .init()
37+
38+
private var _tokenId: BigUInt? = nil
39+
private var _hasReadProperties: Bool = false
40+
41+
public var transactionOptions: TransactionOptions
42+
public var web3: web3
43+
public var provider: Web3Provider
44+
public var address: EthereumAddress
45+
public var abi: String
46+
47+
lazy var contract: web3.web3contract = {
48+
let contract = self.web3.contract(self.abi, at: self.address, abiVersion: 2)
49+
precondition(contract != nil)
50+
return contract!
51+
}()
52+
53+
public init(web3: web3, provider: Web3Provider, address: EthereumAddress, abi: String = Web3.Utils.erc1155ABI) {
54+
self.web3 = web3
55+
self.provider = provider
56+
self.address = address
57+
var mergedOptions = web3.transactionOptions
58+
mergedOptions.to = address
59+
self.abi = abi
60+
self.transactionOptions = mergedOptions
61+
}
62+
63+
public var tokenId: BigUInt {
64+
self.readProperties()
65+
if self._tokenId != nil {
66+
return self._tokenId!
67+
}
68+
return 0
69+
}
70+
71+
public func readProperties() {
72+
if self._hasReadProperties {
73+
return
74+
}
75+
let contract = self.contract
76+
guard contract.contract.address != nil else {return}
77+
var transactionOptions = TransactionOptions.defaultOptions
78+
transactionOptions.callOnBlock = .latest
79+
80+
guard let tokenIdPromise = contract.read("id", parameters: [] as [AnyObject], extraData: Data(), transactionOptions: transactionOptions)?.callPromise() else {return}
81+
82+
let allPromises = [tokenIdPromise]
83+
let queue = self.web3.requestDispatcher.queue
84+
when(resolved: allPromises).map(on: queue) { (resolvedPromises) -> Void in
85+
guard case .fulfilled(let tokenIdResult) = resolvedPromises[0] else {return}
86+
guard let tokenId = tokenIdResult["0"] as? BigUInt else {return}
87+
self._tokenId = tokenId
88+
89+
self._hasReadProperties = true
90+
}.wait()
91+
}
92+
93+
func safeTransferFrom(from: EthereumAddress, to: EthereumAddress, originalOwner: EthereumAddress, id: BigUInt, value: BigUInt, data: [UInt8]) throws -> WriteTransaction {
94+
let contract = self.contract
95+
var basicOptions = TransactionOptions()
96+
basicOptions.from = from
97+
basicOptions.to = self.address
98+
99+
let tx = contract.write("safeTransferFrom", parameters: [originalOwner, to, id, value, data] as [AnyObject], transactionOptions: basicOptions)!
100+
return tx
101+
}
102+
103+
func safeBatchTransferFrom(from: EthereumAddress, to: EthereumAddress, originalOwner: EthereumAddress, ids: [BigUInt], values: [BigUInt], data: [UInt8]) throws -> WriteTransaction {
104+
let contract = self.contract
105+
var basicOptions = TransactionOptions()
106+
basicOptions.from = from
107+
basicOptions.to = self.address
108+
109+
let tx = contract.write("safeBatchTransferFrom", parameters: [originalOwner, to, ids, values, data] as [AnyObject], transactionOptions: basicOptions)!
110+
return tx
111+
}
112+
113+
func balanceOf(account: EthereumAddress, id: BigUInt) throws -> BigUInt {
114+
let contract = self.contract
115+
var transactionOptions = TransactionOptions()
116+
transactionOptions.callOnBlock = .latest
117+
let result = try contract.read("balanceOf", parameters: [account, id] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
118+
guard let res = result["0"] as? BigUInt else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
119+
return res
120+
}
121+
122+
func setApprovalForAll(from: EthereumAddress, operator user: EthereumAddress, approved: Bool, scope: Data) throws -> WriteTransaction {
123+
let contract = self.contract
124+
var basicOptions = TransactionOptions()
125+
basicOptions.from = from
126+
basicOptions.to = self.address
127+
128+
let tx = contract.write("setApprovalForAll", parameters: [user, approved, scope] as [AnyObject], transactionOptions: basicOptions)!
129+
return tx
130+
}
131+
132+
func isApprovedForAll(owner: EthereumAddress, operator user: EthereumAddress, scope: Data) throws -> Bool {
133+
let contract = self.contract
134+
var basicOptions = TransactionOptions()
135+
basicOptions.callOnBlock = .latest
136+
let result = try contract.read("isApprovedForAll", parameters: [owner, user, scope] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
137+
guard let res = result["0"] as? Bool else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
138+
return res
139+
}
140+
141+
func supportsInterface(interfaceID: [UInt8]) throws -> Bool {
142+
let contract = self.contract
143+
var transactionOptions = TransactionOptions()
144+
transactionOptions.callOnBlock = .latest
145+
transactionOptions.gasLimit = .manual(30000)
146+
let result = try contract.read("supportsInterface", parameters: [interfaceID] as [AnyObject], extraData: Data(), transactionOptions: self.transactionOptions)!.call(transactionOptions: transactionOptions)
147+
guard let res = result["0"] as? Bool else {throw Web3Error.processingError(desc: "Failed to get result of expected type from the Ethereum node")}
148+
return res
149+
}
150+
}

0 commit comments

Comments
 (0)