diff --git a/.swift-version b/.swift-version index 5186d07..7d5c902 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.0 +4.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index a95ce35..8ae353c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,60 +5,6 @@ Change Log --- -## [1.0.0-beta13](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta13) +## [1.0.0.beta.1](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0.beta.1) -1. Call all completion handlers on the main thread - -## [1.0.0-beta12](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta12) - -1. Generate secure, 12 word, random passphrases - -## [1.0.0-beta11](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta11) - -1. Refactor random node selection for Linux - -## [1.0.0-beta10](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta10) - -1. Support Linux random - -## [1.0.0-beta9](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta9) - -1. Sign transactions with a key pair - -## [1.0.0-beta8](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta8) - -1. Public public/private key string methods - -## [1.0.0-beta7](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta7) - -1. Setup Package.swift library - -## [1.0.0-beta6](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta6) - -1. Signatures API -2. Register second secret via local transaction signing - -## [1.0.0-beta5](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta5) - -1. Blocks API - -## [1.0.0-beta4](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta4) - -1. Delegates API -2. Peers API - -## [1.0.0-beta3](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta3) - -1. Locally sign and broadcast transactions - -## [1.0.0-beta2](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta2) - -1. Crypto module to extract public/private keys from a secret -2. Securely gain access to a Lisk account via a secret passphrase -3. Full support for Swift Package Manager - -## [1.0.0-beta1](https://github.com/AndrewBarba/lisk-swift-sdk/releases/tag/1.0.0-beta1) - -1. Initial release. -2. Includes `APIClient` to make requests to Lisk nodes -3. `Loader` module to check node status +1. Initial version with full support for Lisk 1.0.0 API diff --git a/Lisk.podspec b/Lisk.podspec index 72d2fc1..e97e2df 100644 --- a/Lisk.podspec +++ b/Lisk.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Lisk' - s.version = '1.0.0-beta13' + s.version = '1.0.0' s.summary = 'Swift 4 library for Lisk - the cryptocurrency and blockchain application platform' s.homepage = 'https://github.com/AndrewBarba/lisk-swift' s.documentation_url = 'https://andrewbarba.github.io/lisk-swift/' @@ -19,5 +19,5 @@ Pod::Spec.new do |s| s.source_files = 'Sources/**/*.{h,swift}' s.public_header_files = 'Sources/**/*.h' - s.dependency 'Ed25519', '~> 0.2.0' + s.dependency 'Ed25519', '~> 1.1.0' end diff --git a/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap b/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap index 80d2e04..9a6d0ab 100644 --- a/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap +++ b/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap @@ -1,4 +1,4 @@ module CEd25519 { - umbrella "/Users/andrewbarba/Code/Lisk/lisk-swift/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include" + umbrella "/Users/andrewbarba/Code/Lisk/lisk-swift/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include" export * } diff --git a/Lisk.xcodeproj/project.pbxproj b/Lisk.xcodeproj/project.pbxproj index 6615fc8..1438c65 100644 --- a/Lisk.xcodeproj/project.pbxproj +++ b/Lisk.xcodeproj/project.pbxproj @@ -9,11 +9,11 @@ /* Begin PBXAggregateTarget section */ "Lisk::LiskPackageTests::ProductTarget" /* LiskPackageTests */ = { isa = PBXAggregateTarget; - buildConfigurationList = OBJ_175 /* Build configuration list for PBXAggregateTarget "LiskPackageTests" */; + buildConfigurationList = OBJ_228 /* Build configuration list for PBXAggregateTarget "LiskPackageTests" */; buildPhases = ( ); dependencies = ( - OBJ_178 /* PBXTargetDependency */, + OBJ_231 /* PBXTargetDependency */, ); name = LiskPackageTests; productName = LiskPackageTests; @@ -21,152 +21,137 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 3809038C2013AC1B00E80537 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3809038A2013AB9D00E80537 /* Random.swift */; }; - 381C95D92003E44E0002FBC4 /* DelegateResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95D82003E44E0002FBC4 /* DelegateResponse.swift */; }; - 381C95DB2003E6060002FBC4 /* DelegateCountResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95DA2003E6060002FBC4 /* DelegateCountResponse.swift */; }; - 381C95DD2003E6D50002FBC4 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95DC2003E6D50002FBC4 /* APIService.swift */; }; - 381C95DF2003EAA40002FBC4 /* VoterModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95DE2003EAA40002FBC4 /* VoterModel.swift */; }; - 381C95E12003EADC0002FBC4 /* DelegateVotersResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95E02003EADC0002FBC4 /* DelegateVotersResponse.swift */; }; - 381C95E42003EC460002FBC4 /* DelegatesCountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95E32003EC460002FBC4 /* DelegatesCountTests.swift */; }; - 381C95E62003ECE70002FBC4 /* DelegatesGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95E52003ECE70002FBC4 /* DelegatesGetTests.swift */; }; - 381C95E82003EDB70002FBC4 /* DelegatesVotesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95E72003EDB70002FBC4 /* DelegatesVotesTests.swift */; }; - 381C95EA2003EE440002FBC4 /* DelegatesListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95E92003EE440002FBC4 /* DelegatesListTests.swift */; }; - 381C95ED2003F4580002FBC4 /* Peers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95EC2003F4580002FBC4 /* Peers.swift */; }; - 381C95F02003F4A10002FBC4 /* PeerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95EF2003F4A10002FBC4 /* PeerModel.swift */; }; - 381C95F32003F5CF0002FBC4 /* PeerResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95F22003F5CF0002FBC4 /* PeerResponse.swift */; }; - 381C95F52003F6090002FBC4 /* PeerVersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95F42003F6090002FBC4 /* PeerVersionResponse.swift */; }; - 381C95F82003FA860002FBC4 /* PeersVersionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95F72003FA860002FBC4 /* PeersVersionTests.swift */; }; - 381C95FA2003FACE0002FBC4 /* PeersGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95F92003FACE0002FBC4 /* PeersGetTests.swift */; }; - 381C95FE2003FC710002FBC4 /* PeersListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381C95FB2003FC0D0002FBC4 /* PeersListTests.swift */; }; - 385C827C201AF2B000012D71 /* MnemonicPassphrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385C827B201AF2B000012D71 /* MnemonicPassphrase.swift */; }; - 385C8280201AF52000012D71 /* MnemonicPassphraseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385C827F201AF52000012D71 /* MnemonicPassphraseTests.swift */; }; - 3874AB9B1FFC82490008C527 /* Transactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3874AB9A1FFC82490008C527 /* Transactions.swift */; }; - 3874AB9E1FFC82C50008C527 /* TransactionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3874AB9D1FFC82C50008C527 /* TransactionResponse.swift */; }; - 3874ABA11FFC831B0008C527 /* TransactionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3874ABA01FFC831B0008C527 /* TransactionModel.swift */; }; - 3874ABA41FFC8E6C0008C527 /* TransactionsGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3874ABA31FFC8E6C0008C527 /* TransactionsGetTests.swift */; }; - 3874ABA61FFC8EEE0008C527 /* TransactionsListTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3874ABA51FFC8EEE0008C527 /* TransactionsListTest.swift */; }; - 3883A8C120029A9700460A9B /* BytePacker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883A8BF20029A4000460A9B /* BytePacker.swift */; }; - 3883A8C320029BE500460A9B /* LocalTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883A8C220029BE500460A9B /* LocalTransaction.swift */; }; - 3883A8C62002D8AC00460A9B /* TransactionsSigningTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883A8BD2002929800460A9B /* TransactionsSigningTest.swift */; }; - 3883A8C82002DC4E00460A9B /* TransactionsTransferTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883A8C72002DC4E00460A9B /* TransactionsTransferTests.swift */; }; - 3883A8CA2003BED900460A9B /* TransactionBroadcastResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3883A8C92003BED900460A9B /* TransactionBroadcastResponse.swift */; }; - 38B8E222200672780067BA8E /* SignatureFeeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B8E220200672730067BA8E /* SignatureFeeResponse.swift */; }; - 38B8E2232006728A0067BA8E /* Signatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B8E21D2006723B0067BA8E /* Signatures.swift */; }; - 38C55B962006850400C0CCA4 /* SignaturesFeeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C55B952006850400C0CCA4 /* SignaturesFeeTests.swift */; }; - 38C55B982006854000C0CCA4 /* SignaturesRegisterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C55B972006854000C0CCA4 /* SignaturesRegisterTests.swift */; }; - 38C66D7B20051FB8007B2FA1 /* Blocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D7A20051FB8007B2FA1 /* Blocks.swift */; }; - 38C66D7F20051FF8007B2FA1 /* BlockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D7E20051FF8007B2FA1 /* BlockModel.swift */; }; - 38C66D8120052032007B2FA1 /* APIModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D8020052032007B2FA1 /* APIModel.swift */; }; - 38C66D83200523F2007B2FA1 /* BlockResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D82200523F2007B2FA1 /* BlockResponse.swift */; }; - 38C66D8D20052777007B2FA1 /* BlockFeeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D8C20052777007B2FA1 /* BlockFeeResponse.swift */; }; - 38C66D8F20052794007B2FA1 /* BlockFeesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D8E20052794007B2FA1 /* BlockFeesResponse.swift */; }; - 38C66D91200527C7007B2FA1 /* FeesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D90200527C7007B2FA1 /* FeesModel.swift */; }; - 38C66D932005281D007B2FA1 /* BlockRewardResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D922005281D007B2FA1 /* BlockRewardResponse.swift */; }; - 38C66D952005283E007B2FA1 /* BlockSupplyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D942005283E007B2FA1 /* BlockSupplyResponse.swift */; }; - 38C66D9720052865007B2FA1 /* BlockHeightResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D9620052865007B2FA1 /* BlockHeightResponse.swift */; }; - 38C66D99200528B2007B2FA1 /* BlockStatusResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D98200528B2007B2FA1 /* BlockStatusResponse.swift */; }; - 38C66D9B200528FC007B2FA1 /* BlockNethashResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D9A200528FC007B2FA1 /* BlockNethashResponse.swift */; }; - 38C66D9D20052927007B2FA1 /* BlockMilestoneResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D9C20052927007B2FA1 /* BlockMilestoneResponse.swift */; }; - 38C66DA020053D35007B2FA1 /* BlocksMiscTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66D9F20053D35007B2FA1 /* BlocksMiscTests.swift */; }; - 38C66DA220053DEE007B2FA1 /* BlocksGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66DA120053DEE007B2FA1 /* BlocksGetTests.swift */; }; - 38C66DA420053F55007B2FA1 /* BlocksListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C66DA320053F55007B2FA1 /* BlocksListTests.swift */; }; - OBJ_101 /* AccountsOpenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* AccountsOpenTests.swift */; }; - OBJ_102 /* AccountsPublicKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* AccountsPublicKeyTests.swift */; }; - OBJ_103 /* LoaderStatusPingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* LoaderStatusPingTests.swift */; }; - OBJ_104 /* LoaderStatusSyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* LoaderStatusSyncTests.swift */; }; - OBJ_105 /* LoaderStatusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_50 /* LoaderStatusTests.swift */; }; - OBJ_106 /* LiskTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_51 /* LiskTestCase.swift */; }; - OBJ_108 /* Lisk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Lisk::Lisk::Product" /* Lisk.framework */; }; - OBJ_109 /* Ed25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::Ed25519::Product" /* Ed25519.framework */; }; - OBJ_110 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; - OBJ_121 /* Accounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Accounts.swift */; }; - OBJ_122 /* AccountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* AccountModel.swift */; }; - OBJ_123 /* AccountResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* AccountResponse.swift */; }; - OBJ_124 /* AccountBalanceResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* AccountBalanceResponse.swift */; }; - OBJ_126 /* AccountPublicKeyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* AccountPublicKeyResponse.swift */; }; - OBJ_127 /* Delegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* Delegates.swift */; }; - OBJ_128 /* DelegateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* DelegateModel.swift */; }; - OBJ_129 /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* Loader.swift */; }; - OBJ_130 /* LoaderStatusPingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_25 /* LoaderStatusPingResponse.swift */; }; - OBJ_131 /* LoaderStatusResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* LoaderStatusResponse.swift */; }; - OBJ_132 /* LoaderStatusSyncResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* LoaderStatusSyncResponse.swift */; }; - OBJ_133 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* Constants.swift */; }; - OBJ_134 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* APIClient.swift */; }; - OBJ_135 /* APINethash.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* APINethash.swift */; }; - OBJ_136 /* APINode.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* APINode.swift */; }; - OBJ_137 /* APIOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* APIOptions.swift */; }; - OBJ_138 /* APIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* APIResponse.swift */; }; - OBJ_139 /* APIResponseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* APIResponseError.swift */; }; - OBJ_140 /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* Crypto.swift */; }; - OBJ_141 /* SHA256.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* SHA256.swift */; }; - OBJ_143 /* Ed25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::Ed25519::Product" /* Ed25519.framework */; }; - OBJ_144 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; - OBJ_151 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_70 /* Error.swift */; }; - OBJ_152 /* KeyPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_71 /* KeyPair.swift */; }; - OBJ_153 /* PrivateKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_72 /* PrivateKey.swift */; }; - OBJ_154 /* PublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_73 /* PublicKey.swift */; }; - OBJ_155 /* Seed.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_74 /* Seed.swift */; }; - OBJ_157 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; - OBJ_163 /* add_scalar.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_56 /* add_scalar.c */; }; - OBJ_164 /* fe.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_57 /* fe.c */; }; - OBJ_165 /* ge.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_58 /* ge.c */; }; - OBJ_166 /* key_exchange.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_59 /* key_exchange.c */; }; - OBJ_167 /* keypair.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_60 /* keypair.c */; }; - OBJ_168 /* sc.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_61 /* sc.c */; }; - OBJ_169 /* seed.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_62 /* seed.c */; }; - OBJ_170 /* sha512.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_63 /* sha512.c */; }; - OBJ_171 /* sign.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_64 /* sign.c */; }; - OBJ_172 /* verify.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_65 /* verify.c */; }; - OBJ_86 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; - OBJ_92 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_75 /* Package.swift */; }; - OBJ_98 /* AccountsAccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* AccountsAccountTests.swift */; }; - OBJ_99 /* AccountsBalanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* AccountsBalanceTests.swift */; }; + 3896F03420AB3B9900069A45 /* WebToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3896F03320AB3B9900069A45 /* WebToken.swift */; }; + 3896F03620AB421300069A45 /* WebTokenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3896F03520AB421300069A45 /* WebTokenTests.swift */; }; + OBJ_138 /* add_scalar.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_108 /* add_scalar.c */; }; + OBJ_139 /* fe.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_109 /* fe.c */; }; + OBJ_140 /* ge.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_110 /* ge.c */; }; + OBJ_141 /* key_exchange.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_111 /* key_exchange.c */; }; + OBJ_142 /* keypair.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_112 /* keypair.c */; }; + OBJ_143 /* sc.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_113 /* sc.c */; }; + OBJ_144 /* seed.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_114 /* seed.c */; }; + OBJ_145 /* sha512.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_115 /* sha512.c */; }; + OBJ_146 /* sign.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_116 /* sign.c */; }; + OBJ_147 /* verify.c in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_117 /* verify.c */; }; + OBJ_154 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_122 /* Error.swift */; }; + OBJ_155 /* KeyPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_123 /* KeyPair.swift */; }; + OBJ_156 /* PrivateKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_124 /* PrivateKey.swift */; }; + OBJ_157 /* PublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_125 /* PublicKey.swift */; }; + OBJ_158 /* Seed.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_126 /* Seed.swift */; }; + OBJ_160 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; + OBJ_167 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_127 /* Package.swift */; }; + OBJ_173 /* Accounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Accounts.swift */; }; + OBJ_174 /* AccountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* AccountModel.swift */; }; + OBJ_175 /* AccountsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* AccountsResponse.swift */; }; + OBJ_176 /* Blocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* Blocks.swift */; }; + OBJ_177 /* BlockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* BlockModel.swift */; }; + OBJ_178 /* BlocksResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* BlocksResponse.swift */; }; + OBJ_179 /* Dapps.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* Dapps.swift */; }; + OBJ_180 /* DappModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_24 /* DappModel.swift */; }; + OBJ_181 /* DappsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* DappsResponse.swift */; }; + OBJ_182 /* Delegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* Delegates.swift */; }; + OBJ_183 /* DelegateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* DelegateModel.swift */; }; + OBJ_184 /* DelegatesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* DelegatesResponse.swift */; }; + OBJ_185 /* NodeConstantsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* NodeConstantsModel.swift */; }; + OBJ_186 /* NodeStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* NodeStatusModel.swift */; }; + OBJ_187 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* Node.swift */; }; + OBJ_188 /* NodeConstantsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* NodeConstantsResponse.swift */; }; + OBJ_189 /* NodeStatusResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* NodeStatusResponse.swift */; }; + OBJ_190 /* PeerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* PeerModel.swift */; }; + OBJ_191 /* Peers.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* Peers.swift */; }; + OBJ_192 /* PeersResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* PeersResponse.swift */; }; + OBJ_193 /* SignatureModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* SignatureModel.swift */; }; + OBJ_194 /* SignatureBroadcastResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_51 /* SignatureBroadcastResponse.swift */; }; + OBJ_195 /* Signatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_52 /* Signatures.swift */; }; + OBJ_196 /* LocalTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_54 /* LocalTransaction.swift */; }; + OBJ_197 /* TransactionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_56 /* TransactionModel.swift */; }; + OBJ_198 /* TransactionBroadcastResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_58 /* TransactionBroadcastResponse.swift */; }; + OBJ_199 /* TransactionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_59 /* TransactionsResponse.swift */; }; + OBJ_200 /* Transactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_60 /* Transactions.swift */; }; + OBJ_201 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_61 /* Constants.swift */; }; + OBJ_202 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_63 /* APIClient.swift */; }; + OBJ_203 /* APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_64 /* APIError.swift */; }; + OBJ_204 /* APIModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_65 /* APIModel.swift */; }; + OBJ_205 /* APINethash.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_66 /* APINethash.swift */; }; + OBJ_206 /* APINode.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_67 /* APINode.swift */; }; + OBJ_207 /* APIOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_68 /* APIOptions.swift */; }; + OBJ_208 /* APIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_69 /* APIRequest.swift */; }; + OBJ_209 /* APIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_70 /* APIResponse.swift */; }; + OBJ_210 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_71 /* APIService.swift */; }; + OBJ_211 /* BytePacker.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_73 /* BytePacker.swift */; }; + OBJ_212 /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_74 /* Crypto.swift */; }; + OBJ_213 /* MnemonicPassphrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_75 /* MnemonicPassphrase.swift */; }; + OBJ_214 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_76 /* Random.swift */; }; + OBJ_215 /* SHA256.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_77 /* SHA256.swift */; }; + OBJ_217 /* Ed25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::Ed25519::Product" /* Ed25519.framework */; }; + OBJ_218 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; + OBJ_226 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; + OBJ_237 /* AccountsAccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_81 /* AccountsAccountTests.swift */; }; + OBJ_238 /* AccountsOpenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_82 /* AccountsOpenTests.swift */; }; + OBJ_239 /* AccountsPublicKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_83 /* AccountsPublicKeyTests.swift */; }; + OBJ_240 /* BlocksGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_85 /* BlocksGetTests.swift */; }; + OBJ_241 /* BlocksListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_86 /* BlocksListTests.swift */; }; + OBJ_242 /* DelegatesGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_88 /* DelegatesGetTests.swift */; }; + OBJ_243 /* DelegatesListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_89 /* DelegatesListTests.swift */; }; + OBJ_244 /* PeersGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_91 /* PeersGetTests.swift */; }; + OBJ_245 /* PeersListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_92 /* PeersListTests.swift */; }; + OBJ_246 /* SignaturesRegisterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_94 /* SignaturesRegisterTests.swift */; }; + OBJ_247 /* TransactionsGetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_96 /* TransactionsGetTests.swift */; }; + OBJ_248 /* TransactionsListTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_97 /* TransactionsListTest.swift */; }; + OBJ_249 /* TransactionsSigningTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_98 /* TransactionsSigningTest.swift */; }; + OBJ_250 /* TransactionsTransferTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_99 /* TransactionsTransferTests.swift */; }; + OBJ_251 /* MnemonicPassphraseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_101 /* MnemonicPassphraseTests.swift */; }; + OBJ_252 /* SignMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_102 /* SignMessageTests.swift */; }; + OBJ_253 /* LiskTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_103 /* LiskTestCase.swift */; }; + OBJ_255 /* Lisk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Lisk::Lisk::Product" /* Lisk.framework */; }; + OBJ_256 /* Ed25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::Ed25519::Product" /* Ed25519.framework */; }; + OBJ_257 /* CEd25519.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Ed25519::CEd25519::Product" /* CEd25519.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 38434E581FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F02C20AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; - remoteGlobalIDString = "Ed25519::Ed25519"; - remoteInfo = Ed25519; + remoteGlobalIDString = "Ed25519::CEd25519"; + remoteInfo = CEd25519; }; - 38434E591FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F02D20AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; - remoteGlobalIDString = "Ed25519::CEd25519"; - remoteInfo = CEd25519; + remoteGlobalIDString = "Ed25519::Ed25519"; + remoteInfo = Ed25519; }; - 38434E5A1FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F02E20AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; remoteGlobalIDString = "Ed25519::CEd25519"; remoteInfo = CEd25519; }; - 38434E5B1FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F02F20AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; remoteGlobalIDString = "Lisk::Lisk"; remoteInfo = Lisk; }; - 38434E5C1FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F03020AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; remoteGlobalIDString = "Ed25519::Ed25519"; remoteInfo = Ed25519; }; - 38434E5D1FFADA1400AA3540 /* PBXContainerItemProxy */ = { + 3896F03120AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; remoteGlobalIDString = "Ed25519::CEd25519"; remoteInfo = CEd25519; }; - 38434E5E1FFADA1500AA3540 /* PBXContainerItemProxy */ = { + 3896F03220AB2BF800069A45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; @@ -176,583 +161,580 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 3809038A2013AB9D00E80537 /* Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; - 381C95D82003E44E0002FBC4 /* DelegateResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateResponse.swift; sourceTree = ""; }; - 381C95DA2003E6060002FBC4 /* DelegateCountResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateCountResponse.swift; sourceTree = ""; }; - 381C95DC2003E6D50002FBC4 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; - 381C95DE2003EAA40002FBC4 /* VoterModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoterModel.swift; sourceTree = ""; }; - 381C95E02003EADC0002FBC4 /* DelegateVotersResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateVotersResponse.swift; sourceTree = ""; }; - 381C95E32003EC460002FBC4 /* DelegatesCountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesCountTests.swift; sourceTree = ""; }; - 381C95E52003ECE70002FBC4 /* DelegatesGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesGetTests.swift; sourceTree = ""; }; - 381C95E72003EDB70002FBC4 /* DelegatesVotesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesVotesTests.swift; sourceTree = ""; }; - 381C95E92003EE440002FBC4 /* DelegatesListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesListTests.swift; sourceTree = ""; }; - 381C95EC2003F4580002FBC4 /* Peers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Peers.swift; sourceTree = ""; }; - 381C95EF2003F4A10002FBC4 /* PeerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerModel.swift; sourceTree = ""; }; - 381C95F22003F5CF0002FBC4 /* PeerResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerResponse.swift; sourceTree = ""; }; - 381C95F42003F6090002FBC4 /* PeerVersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerVersionResponse.swift; sourceTree = ""; }; - 381C95F72003FA860002FBC4 /* PeersVersionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersVersionTests.swift; sourceTree = ""; }; - 381C95F92003FACE0002FBC4 /* PeersGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersGetTests.swift; sourceTree = ""; }; - 381C95FB2003FC0D0002FBC4 /* PeersListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersListTests.swift; sourceTree = ""; }; - 385C827B201AF2B000012D71 /* MnemonicPassphrase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicPassphrase.swift; sourceTree = ""; }; - 385C827F201AF52000012D71 /* MnemonicPassphraseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicPassphraseTests.swift; sourceTree = ""; }; - 3874AB9A1FFC82490008C527 /* Transactions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Transactions.swift; sourceTree = ""; }; - 3874AB9D1FFC82C50008C527 /* TransactionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionResponse.swift; sourceTree = ""; }; - 3874ABA01FFC831B0008C527 /* TransactionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionModel.swift; sourceTree = ""; }; - 3874ABA31FFC8E6C0008C527 /* TransactionsGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsGetTests.swift; sourceTree = ""; }; - 3874ABA51FFC8EEE0008C527 /* TransactionsListTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsListTest.swift; sourceTree = ""; }; - 3883A8BD2002929800460A9B /* TransactionsSigningTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsSigningTest.swift; sourceTree = ""; }; - 3883A8BF20029A4000460A9B /* BytePacker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BytePacker.swift; sourceTree = ""; }; - 3883A8C220029BE500460A9B /* LocalTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalTransaction.swift; sourceTree = ""; }; - 3883A8C72002DC4E00460A9B /* TransactionsTransferTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsTransferTests.swift; sourceTree = ""; }; - 3883A8C92003BED900460A9B /* TransactionBroadcastResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionBroadcastResponse.swift; sourceTree = ""; }; - 38B8E21D2006723B0067BA8E /* Signatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Signatures.swift; sourceTree = ""; }; - 38B8E220200672730067BA8E /* SignatureFeeResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignatureFeeResponse.swift; sourceTree = ""; }; - 38C55B952006850400C0CCA4 /* SignaturesFeeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignaturesFeeTests.swift; sourceTree = ""; }; - 38C55B972006854000C0CCA4 /* SignaturesRegisterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignaturesRegisterTests.swift; sourceTree = ""; }; - 38C66D7A20051FB8007B2FA1 /* Blocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Blocks.swift; sourceTree = ""; }; - 38C66D7E20051FF8007B2FA1 /* BlockModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockModel.swift; sourceTree = ""; }; - 38C66D8020052032007B2FA1 /* APIModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIModel.swift; sourceTree = ""; }; - 38C66D82200523F2007B2FA1 /* BlockResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockResponse.swift; sourceTree = ""; }; - 38C66D8C20052777007B2FA1 /* BlockFeeResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockFeeResponse.swift; sourceTree = ""; }; - 38C66D8E20052794007B2FA1 /* BlockFeesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockFeesResponse.swift; sourceTree = ""; }; - 38C66D90200527C7007B2FA1 /* FeesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeesModel.swift; sourceTree = ""; }; - 38C66D922005281D007B2FA1 /* BlockRewardResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockRewardResponse.swift; sourceTree = ""; }; - 38C66D942005283E007B2FA1 /* BlockSupplyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockSupplyResponse.swift; sourceTree = ""; }; - 38C66D9620052865007B2FA1 /* BlockHeightResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockHeightResponse.swift; sourceTree = ""; }; - 38C66D98200528B2007B2FA1 /* BlockStatusResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockStatusResponse.swift; sourceTree = ""; }; - 38C66D9A200528FC007B2FA1 /* BlockNethashResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockNethashResponse.swift; sourceTree = ""; }; - 38C66D9C20052927007B2FA1 /* BlockMilestoneResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockMilestoneResponse.swift; sourceTree = ""; }; - 38C66D9F20053D35007B2FA1 /* BlocksMiscTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksMiscTests.swift; sourceTree = ""; }; - 38C66DA120053DEE007B2FA1 /* BlocksGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksGetTests.swift; sourceTree = ""; }; - 38C66DA320053F55007B2FA1 /* BlocksListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksListTests.swift; sourceTree = ""; }; - "Ed25519::CEd25519::Product" /* CEd25519.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CEd25519.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - "Ed25519::Ed25519::Product" /* Ed25519.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Ed25519.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - "Lisk::Lisk::Product" /* Lisk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Lisk.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3896F03320AB3B9900069A45 /* WebToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebToken.swift; sourceTree = ""; }; + 3896F03520AB421300069A45 /* WebTokenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebTokenTests.swift; sourceTree = ""; }; + "Ed25519::CEd25519::Product" /* CEd25519.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CEd25519.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + "Ed25519::Ed25519::Product" /* Ed25519.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Ed25519.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + "Lisk::Lisk::Product" /* Lisk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Lisk.framework; sourceTree = BUILT_PRODUCTS_DIR; }; "Lisk::LiskTests::Product" /* LiskTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = LiskTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; OBJ_10 /* Accounts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Accounts.swift; sourceTree = ""; }; + OBJ_101 /* MnemonicPassphraseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicPassphraseTests.swift; sourceTree = ""; }; + OBJ_102 /* SignMessageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignMessageTests.swift; sourceTree = ""; }; + OBJ_103 /* LiskTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiskTestCase.swift; sourceTree = ""; }; + OBJ_104 /* docs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = docs; sourceTree = SOURCE_ROOT; }; + OBJ_108 /* add_scalar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = add_scalar.c; sourceTree = ""; }; + OBJ_109 /* fe.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = fe.c; sourceTree = ""; }; + OBJ_110 /* ge.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ge.c; sourceTree = ""; }; + OBJ_111 /* key_exchange.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = key_exchange.c; sourceTree = ""; }; + OBJ_112 /* keypair.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = keypair.c; sourceTree = ""; }; + OBJ_113 /* sc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sc.c; sourceTree = ""; }; + OBJ_114 /* seed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = seed.c; sourceTree = ""; }; + OBJ_115 /* sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha512.c; sourceTree = ""; }; + OBJ_116 /* sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sign.c; sourceTree = ""; }; + OBJ_117 /* verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = verify.c; sourceTree = ""; }; + OBJ_119 /* ed25519.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ed25519.h; sourceTree = ""; }; OBJ_12 /* AccountModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountModel.swift; sourceTree = ""; }; - OBJ_14 /* AccountResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountResponse.swift; sourceTree = ""; }; - OBJ_15 /* AccountBalanceResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountBalanceResponse.swift; sourceTree = ""; }; - OBJ_17 /* AccountPublicKeyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountPublicKeyResponse.swift; sourceTree = ""; }; - OBJ_19 /* Delegates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Delegates.swift; sourceTree = ""; }; - OBJ_21 /* DelegateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateModel.swift; sourceTree = ""; }; - OBJ_23 /* Loader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loader.swift; sourceTree = ""; }; - OBJ_25 /* LoaderStatusPingResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusPingResponse.swift; sourceTree = ""; }; - OBJ_26 /* LoaderStatusResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusResponse.swift; sourceTree = ""; }; - OBJ_27 /* LoaderStatusSyncResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusSyncResponse.swift; sourceTree = ""; }; - OBJ_28 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - OBJ_30 /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; - OBJ_31 /* APINethash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APINethash.swift; sourceTree = ""; }; - OBJ_32 /* APINode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APINode.swift; sourceTree = ""; }; - OBJ_33 /* APIOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIOptions.swift; sourceTree = ""; }; - OBJ_34 /* APIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIResponse.swift; sourceTree = ""; }; - OBJ_35 /* APIResponseError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIResponseError.swift; sourceTree = ""; }; - OBJ_37 /* Crypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = ""; }; - OBJ_38 /* SHA256.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SHA256.swift; sourceTree = ""; }; - OBJ_42 /* AccountsAccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsAccountTests.swift; sourceTree = ""; }; - OBJ_43 /* AccountsBalanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsBalanceTests.swift; sourceTree = ""; }; - OBJ_45 /* AccountsOpenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsOpenTests.swift; sourceTree = ""; }; - OBJ_46 /* AccountsPublicKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsPublicKeyTests.swift; sourceTree = ""; }; - OBJ_48 /* LoaderStatusPingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusPingTests.swift; sourceTree = ""; }; - OBJ_49 /* LoaderStatusSyncTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusSyncTests.swift; sourceTree = ""; }; - OBJ_50 /* LoaderStatusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoaderStatusTests.swift; sourceTree = ""; }; - OBJ_51 /* LiskTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiskTestCase.swift; sourceTree = ""; }; - OBJ_56 /* add_scalar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = add_scalar.c; sourceTree = ""; }; - OBJ_57 /* fe.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = fe.c; sourceTree = ""; }; - OBJ_58 /* ge.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ge.c; sourceTree = ""; }; - OBJ_59 /* key_exchange.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = key_exchange.c; sourceTree = ""; }; + OBJ_120 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = "/Users/andrewbarba/Code/Lisk/lisk-swift/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; sourceTree = ""; }; + OBJ_122 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; + OBJ_123 /* KeyPair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPair.swift; sourceTree = ""; }; + OBJ_124 /* PrivateKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKey.swift; sourceTree = ""; }; + OBJ_125 /* PublicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublicKey.swift; sourceTree = ""; }; + OBJ_126 /* Seed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seed.swift; sourceTree = ""; }; + OBJ_127 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; name = Package.swift; path = "/Users/andrewbarba/Code/Lisk/lisk-swift/.build/checkouts/ed25519.git--1962158432852652388/Package.swift"; sourceTree = ""; }; + OBJ_14 /* AccountsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsResponse.swift; sourceTree = ""; }; + OBJ_16 /* Blocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Blocks.swift; sourceTree = ""; }; + OBJ_18 /* BlockModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockModel.swift; sourceTree = ""; }; + OBJ_20 /* BlocksResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksResponse.swift; sourceTree = ""; }; + OBJ_22 /* Dapps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dapps.swift; sourceTree = ""; }; + OBJ_24 /* DappModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DappModel.swift; sourceTree = ""; }; + OBJ_26 /* DappsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DappsResponse.swift; sourceTree = ""; }; + OBJ_28 /* Delegates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Delegates.swift; sourceTree = ""; }; + OBJ_30 /* DelegateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateModel.swift; sourceTree = ""; }; + OBJ_32 /* DelegatesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesResponse.swift; sourceTree = ""; }; + OBJ_35 /* NodeConstantsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeConstantsModel.swift; sourceTree = ""; }; + OBJ_36 /* NodeStatusModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeStatusModel.swift; sourceTree = ""; }; + OBJ_37 /* Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; + OBJ_39 /* NodeConstantsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeConstantsResponse.swift; sourceTree = ""; }; + OBJ_40 /* NodeStatusResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeStatusResponse.swift; sourceTree = ""; }; + OBJ_43 /* PeerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerModel.swift; sourceTree = ""; }; + OBJ_44 /* Peers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Peers.swift; sourceTree = ""; }; + OBJ_46 /* PeersResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersResponse.swift; sourceTree = ""; }; + OBJ_49 /* SignatureModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignatureModel.swift; sourceTree = ""; }; + OBJ_51 /* SignatureBroadcastResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignatureBroadcastResponse.swift; sourceTree = ""; }; + OBJ_52 /* Signatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Signatures.swift; sourceTree = ""; }; + OBJ_54 /* LocalTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalTransaction.swift; sourceTree = ""; }; + OBJ_56 /* TransactionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionModel.swift; sourceTree = ""; }; + OBJ_58 /* TransactionBroadcastResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionBroadcastResponse.swift; sourceTree = ""; }; + OBJ_59 /* TransactionsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsResponse.swift; sourceTree = ""; }; OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; - OBJ_60 /* keypair.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = keypair.c; sourceTree = ""; }; - OBJ_61 /* sc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sc.c; sourceTree = ""; }; - OBJ_62 /* seed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = seed.c; sourceTree = ""; }; - OBJ_63 /* sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha512.c; sourceTree = ""; }; - OBJ_64 /* sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sign.c; sourceTree = ""; }; - OBJ_65 /* verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = verify.c; sourceTree = ""; }; - OBJ_67 /* ed25519.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ed25519.h; sourceTree = ""; }; - OBJ_68 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = "/Users/andrewbarba/Code/Lisk/lisk-swift/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; sourceTree = ""; }; - OBJ_70 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; - OBJ_71 /* KeyPair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPair.swift; sourceTree = ""; }; - OBJ_72 /* PrivateKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKey.swift; sourceTree = ""; }; - OBJ_73 /* PublicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublicKey.swift; sourceTree = ""; }; - OBJ_74 /* Seed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seed.swift; sourceTree = ""; }; - OBJ_75 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; name = Package.swift; path = "/Users/andrewbarba/Code/Lisk/lisk-swift/.build/checkouts/ed25519.git-6274347002403739230/Package.swift"; sourceTree = ""; }; + OBJ_60 /* Transactions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Transactions.swift; sourceTree = ""; }; + OBJ_61 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + OBJ_63 /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; + OBJ_64 /* APIError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIError.swift; sourceTree = ""; }; + OBJ_65 /* APIModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIModel.swift; sourceTree = ""; }; + OBJ_66 /* APINethash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APINethash.swift; sourceTree = ""; }; + OBJ_67 /* APINode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APINode.swift; sourceTree = ""; }; + OBJ_68 /* APIOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIOptions.swift; sourceTree = ""; }; + OBJ_69 /* APIRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequest.swift; sourceTree = ""; }; + OBJ_70 /* APIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIResponse.swift; sourceTree = ""; }; + OBJ_71 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; + OBJ_73 /* BytePacker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BytePacker.swift; sourceTree = ""; }; + OBJ_74 /* Crypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = ""; }; + OBJ_75 /* MnemonicPassphrase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicPassphrase.swift; sourceTree = ""; }; + OBJ_76 /* Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; + OBJ_77 /* SHA256.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SHA256.swift; sourceTree = ""; }; + OBJ_81 /* AccountsAccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsAccountTests.swift; sourceTree = ""; }; + OBJ_82 /* AccountsOpenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsOpenTests.swift; sourceTree = ""; }; + OBJ_83 /* AccountsPublicKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsPublicKeyTests.swift; sourceTree = ""; }; + OBJ_85 /* BlocksGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksGetTests.swift; sourceTree = ""; }; + OBJ_86 /* BlocksListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksListTests.swift; sourceTree = ""; }; + OBJ_88 /* DelegatesGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesGetTests.swift; sourceTree = ""; }; + OBJ_89 /* DelegatesListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegatesListTests.swift; sourceTree = ""; }; + OBJ_91 /* PeersGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersGetTests.swift; sourceTree = ""; }; + OBJ_92 /* PeersListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeersListTests.swift; sourceTree = ""; }; + OBJ_94 /* SignaturesRegisterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignaturesRegisterTests.swift; sourceTree = ""; }; + OBJ_96 /* TransactionsGetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsGetTests.swift; sourceTree = ""; }; + OBJ_97 /* TransactionsListTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsListTest.swift; sourceTree = ""; }; + OBJ_98 /* TransactionsSigningTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsSigningTest.swift; sourceTree = ""; }; + OBJ_99 /* TransactionsTransferTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsTransferTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - OBJ_107 /* Frameworks */ = { + OBJ_148 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( - OBJ_108 /* Lisk.framework in Frameworks */, - OBJ_109 /* Ed25519.framework in Frameworks */, - OBJ_110 /* CEd25519.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_142 /* Frameworks */ = { + OBJ_159 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( - OBJ_143 /* Ed25519.framework in Frameworks */, - OBJ_144 /* CEd25519.framework in Frameworks */, + OBJ_160 /* CEd25519.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_156 /* Frameworks */ = { + OBJ_216 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( - OBJ_157 /* CEd25519.framework in Frameworks */, + OBJ_217 /* Ed25519.framework in Frameworks */, + OBJ_218 /* CEd25519.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_173 /* Frameworks */ = { + OBJ_254 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( + OBJ_255 /* Lisk.framework in Frameworks */, + OBJ_256 /* Ed25519.framework in Frameworks */, + OBJ_257 /* CEd25519.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 381C95D72003E4360002FBC4 /* Responses */ = { + OBJ_100 /* Crypto */ = { isa = PBXGroup; children = ( - 381C95DA2003E6060002FBC4 /* DelegateCountResponse.swift */, - 381C95D82003E44E0002FBC4 /* DelegateResponse.swift */, - 381C95E02003EADC0002FBC4 /* DelegateVotersResponse.swift */, + OBJ_101 /* MnemonicPassphraseTests.swift */, + OBJ_102 /* SignMessageTests.swift */, + 3896F03520AB421300069A45 /* WebTokenTests.swift */, ); - path = Responses; + path = Crypto; sourceTree = ""; }; - 381C95E22003EC300002FBC4 /* Delegates */ = { + OBJ_105 /* Dependencies */ = { isa = PBXGroup; children = ( - 381C95E32003EC460002FBC4 /* DelegatesCountTests.swift */, - 381C95E52003ECE70002FBC4 /* DelegatesGetTests.swift */, - 381C95E92003EE440002FBC4 /* DelegatesListTests.swift */, - 381C95E72003EDB70002FBC4 /* DelegatesVotesTests.swift */, + OBJ_106 /* Ed25519 1.1.0 */, ); - path = Delegates; + name = Dependencies; sourceTree = ""; }; - 381C95EB2003F4430002FBC4 /* Peers */ = { + OBJ_106 /* Ed25519 1.1.0 */ = { isa = PBXGroup; children = ( - 381C95EE2003F4940002FBC4 /* Models */, - 381C95F12003F5C10002FBC4 /* Responses */, - 381C95EC2003F4580002FBC4 /* Peers.swift */, + OBJ_107 /* CEd25519 */, + OBJ_121 /* Ed25519 */, + OBJ_127 /* Package.swift */, ); - path = Peers; - sourceTree = ""; + name = "Ed25519 1.1.0"; + sourceTree = SOURCE_ROOT; }; - 381C95EE2003F4940002FBC4 /* Models */ = { + OBJ_107 /* CEd25519 */ = { isa = PBXGroup; children = ( - 381C95EF2003F4A10002FBC4 /* PeerModel.swift */, + OBJ_108 /* add_scalar.c */, + OBJ_109 /* fe.c */, + OBJ_110 /* ge.c */, + OBJ_111 /* key_exchange.c */, + OBJ_112 /* keypair.c */, + OBJ_113 /* sc.c */, + OBJ_114 /* seed.c */, + OBJ_115 /* sha512.c */, + OBJ_116 /* sign.c */, + OBJ_117 /* verify.c */, + OBJ_118 /* include */, ); - path = Models; - sourceTree = ""; + name = CEd25519; + path = ".build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519"; + sourceTree = SOURCE_ROOT; }; - 381C95F12003F5C10002FBC4 /* Responses */ = { + OBJ_11 /* Models */ = { isa = PBXGroup; children = ( - 381C95F22003F5CF0002FBC4 /* PeerResponse.swift */, - 381C95F42003F6090002FBC4 /* PeerVersionResponse.swift */, + OBJ_12 /* AccountModel.swift */, ); - path = Responses; + path = Models; sourceTree = ""; }; - 381C95F62003FA700002FBC4 /* Peers */ = { + OBJ_118 /* include */ = { isa = PBXGroup; children = ( - 381C95F92003FACE0002FBC4 /* PeersGetTests.swift */, - 381C95FB2003FC0D0002FBC4 /* PeersListTests.swift */, - 381C95F72003FA860002FBC4 /* PeersVersionTests.swift */, + OBJ_119 /* ed25519.h */, + OBJ_120 /* module.modulemap */, ); - path = Peers; + path = include; sourceTree = ""; }; - 385C827E201AF4FD00012D71 /* Crypto */ = { + OBJ_121 /* Ed25519 */ = { isa = PBXGroup; children = ( - 385C827F201AF52000012D71 /* MnemonicPassphraseTests.swift */, + OBJ_122 /* Error.swift */, + OBJ_123 /* KeyPair.swift */, + OBJ_124 /* PrivateKey.swift */, + OBJ_125 /* PublicKey.swift */, + OBJ_126 /* Seed.swift */, ); - path = Crypto; - sourceTree = ""; + name = Ed25519; + path = ".build/checkouts/ed25519.git--1962158432852652388/Sources/Ed25519"; + sourceTree = SOURCE_ROOT; }; - 3874AB991FFC82260008C527 /* Transactions */ = { + OBJ_128 /* Products */ = { isa = PBXGroup; children = ( - 38C55B9120067F7A00C0CCA4 /* Asset */, - 3874AB9F1FFC830E0008C527 /* Models */, - 3874AB9C1FFC82B20008C527 /* Responses */, - 3874AB9A1FFC82490008C527 /* Transactions.swift */, - 3883A8C220029BE500460A9B /* LocalTransaction.swift */, + "Ed25519::Ed25519::Product" /* Ed25519.framework */, + "Ed25519::CEd25519::Product" /* CEd25519.framework */, + "Lisk::Lisk::Product" /* Lisk.framework */, + "Lisk::LiskTests::Product" /* LiskTests.xctest */, ); - path = Transactions; - sourceTree = ""; + name = Products; + sourceTree = BUILT_PRODUCTS_DIR; }; - 3874AB9C1FFC82B20008C527 /* Responses */ = { + OBJ_13 /* Responses */ = { isa = PBXGroup; children = ( - 3874AB9D1FFC82C50008C527 /* TransactionResponse.swift */, - 3883A8C92003BED900460A9B /* TransactionBroadcastResponse.swift */, + OBJ_14 /* AccountsResponse.swift */, ); path = Responses; sourceTree = ""; }; - 3874AB9F1FFC830E0008C527 /* Models */ = { + OBJ_15 /* Blocks */ = { isa = PBXGroup; children = ( - 3874ABA01FFC831B0008C527 /* TransactionModel.swift */, + OBJ_16 /* Blocks.swift */, + OBJ_17 /* Models */, + OBJ_19 /* Responses */, ); - path = Models; + path = Blocks; sourceTree = ""; }; - 3874ABA21FFC8E550008C527 /* Transactions */ = { + OBJ_17 /* Models */ = { isa = PBXGroup; children = ( - 3874ABA31FFC8E6C0008C527 /* TransactionsGetTests.swift */, - 3874ABA51FFC8EEE0008C527 /* TransactionsListTest.swift */, - 3883A8BD2002929800460A9B /* TransactionsSigningTest.swift */, - 3883A8C72002DC4E00460A9B /* TransactionsTransferTests.swift */, + OBJ_18 /* BlockModel.swift */, ); - path = Transactions; + path = Models; sourceTree = ""; }; - 38B8E21C2006722C0067BA8E /* Signatures */ = { + OBJ_19 /* Responses */ = { isa = PBXGroup; children = ( - 38B8E21F2006725C0067BA8E /* Responses */, - 38B8E21D2006723B0067BA8E /* Signatures.swift */, + OBJ_20 /* BlocksResponse.swift */, ); - path = Signatures; + path = Responses; sourceTree = ""; }; - 38B8E21F2006725C0067BA8E /* Responses */ = { + OBJ_21 /* Dapps */ = { isa = PBXGroup; children = ( - 38B8E220200672730067BA8E /* SignatureFeeResponse.swift */, + OBJ_22 /* Dapps.swift */, + OBJ_23 /* Models */, + OBJ_25 /* Responses */, ); - path = Responses; + path = Dapps; sourceTree = ""; }; - 38C55B9120067F7A00C0CCA4 /* Asset */ = { + OBJ_23 /* Models */ = { isa = PBXGroup; children = ( + OBJ_24 /* DappModel.swift */, ); - path = Asset; + path = Models; sourceTree = ""; }; - 38C55B94200684EE00C0CCA4 /* Signatures */ = { + OBJ_25 /* Responses */ = { isa = PBXGroup; children = ( - 38C55B952006850400C0CCA4 /* SignaturesFeeTests.swift */, - 38C55B972006854000C0CCA4 /* SignaturesRegisterTests.swift */, + OBJ_26 /* DappsResponse.swift */, ); - path = Signatures; + path = Responses; sourceTree = ""; }; - 38C66D7920051FA7007B2FA1 /* Blocks */ = { + OBJ_27 /* Delegates */ = { isa = PBXGroup; children = ( - 38C66D7C20051FE1007B2FA1 /* Models */, - 38C66D7D20051FE6007B2FA1 /* Responses */, - 38C66D7A20051FB8007B2FA1 /* Blocks.swift */, + OBJ_28 /* Delegates.swift */, + OBJ_29 /* Models */, + OBJ_31 /* Responses */, ); - path = Blocks; + path = Delegates; sourceTree = ""; }; - 38C66D7C20051FE1007B2FA1 /* Models */ = { + OBJ_29 /* Models */ = { isa = PBXGroup; children = ( - 38C66D7E20051FF8007B2FA1 /* BlockModel.swift */, - 38C66D90200527C7007B2FA1 /* FeesModel.swift */, + OBJ_30 /* DelegateModel.swift */, ); path = Models; sourceTree = ""; }; - 38C66D7D20051FE6007B2FA1 /* Responses */ = { + OBJ_31 /* Responses */ = { isa = PBXGroup; children = ( - 38C66D82200523F2007B2FA1 /* BlockResponse.swift */, - 38C66D98200528B2007B2FA1 /* BlockStatusResponse.swift */, - 38C66D8C20052777007B2FA1 /* BlockFeeResponse.swift */, - 38C66D8E20052794007B2FA1 /* BlockFeesResponse.swift */, - 38C66D9620052865007B2FA1 /* BlockHeightResponse.swift */, - 38C66D9C20052927007B2FA1 /* BlockMilestoneResponse.swift */, - 38C66D9A200528FC007B2FA1 /* BlockNethashResponse.swift */, - 38C66D922005281D007B2FA1 /* BlockRewardResponse.swift */, - 38C66D942005283E007B2FA1 /* BlockSupplyResponse.swift */, + OBJ_32 /* DelegatesResponse.swift */, ); path = Responses; sourceTree = ""; }; - 38C66D9E20053D25007B2FA1 /* Blocks */ = { + OBJ_33 /* Node */ = { isa = PBXGroup; children = ( - 38C66DA120053DEE007B2FA1 /* BlocksGetTests.swift */, - 38C66DA320053F55007B2FA1 /* BlocksListTests.swift */, - 38C66D9F20053D35007B2FA1 /* BlocksMiscTests.swift */, + OBJ_34 /* Models */, + OBJ_37 /* Node.swift */, + OBJ_38 /* Responses */, ); - path = Blocks; + path = Node; sourceTree = ""; }; - OBJ_11 /* Models */ = { + OBJ_34 /* Models */ = { isa = PBXGroup; children = ( - OBJ_12 /* AccountModel.swift */, + OBJ_35 /* NodeConstantsModel.swift */, + OBJ_36 /* NodeStatusModel.swift */, ); path = Models; sourceTree = ""; }; - OBJ_13 /* Responses */ = { + OBJ_38 /* Responses */ = { isa = PBXGroup; children = ( - OBJ_14 /* AccountResponse.swift */, - OBJ_15 /* AccountBalanceResponse.swift */, - OBJ_17 /* AccountPublicKeyResponse.swift */, + OBJ_39 /* NodeConstantsResponse.swift */, + OBJ_40 /* NodeStatusResponse.swift */, ); path = Responses; sourceTree = ""; }; - OBJ_18 /* Delegates */ = { + OBJ_41 /* Peers */ = { isa = PBXGroup; children = ( - OBJ_20 /* Models */, - 381C95D72003E4360002FBC4 /* Responses */, - OBJ_19 /* Delegates.swift */, + OBJ_42 /* Models */, + OBJ_44 /* Peers.swift */, + OBJ_45 /* Responses */, ); - path = Delegates; + path = Peers; sourceTree = ""; }; - OBJ_20 /* Models */ = { + OBJ_42 /* Models */ = { isa = PBXGroup; children = ( - OBJ_21 /* DelegateModel.swift */, - 381C95DE2003EAA40002FBC4 /* VoterModel.swift */, + OBJ_43 /* PeerModel.swift */, ); path = Models; sourceTree = ""; }; - OBJ_22 /* Loader */ = { + OBJ_45 /* Responses */ = { isa = PBXGroup; children = ( - OBJ_24 /* Responses */, - OBJ_23 /* Loader.swift */, + OBJ_46 /* PeersResponse.swift */, ); - path = Loader; + path = Responses; sourceTree = ""; }; - OBJ_24 /* Responses */ = { + OBJ_47 /* Signatures */ = { isa = PBXGroup; children = ( - OBJ_25 /* LoaderStatusPingResponse.swift */, - OBJ_26 /* LoaderStatusResponse.swift */, - OBJ_27 /* LoaderStatusSyncResponse.swift */, + OBJ_48 /* Models */, + OBJ_50 /* Responses */, + OBJ_52 /* Signatures.swift */, ); - path = Responses; + path = Signatures; sourceTree = ""; }; - OBJ_29 /* Core */ = { + OBJ_48 /* Models */ = { isa = PBXGroup; children = ( - OBJ_30 /* APIClient.swift */, - 38C66D8020052032007B2FA1 /* APIModel.swift */, - OBJ_31 /* APINethash.swift */, - OBJ_32 /* APINode.swift */, - OBJ_33 /* APIOptions.swift */, - OBJ_34 /* APIResponse.swift */, - OBJ_35 /* APIResponseError.swift */, - 381C95DC2003E6D50002FBC4 /* APIService.swift */, + OBJ_49 /* SignatureModel.swift */, ); - path = Core; + path = Models; sourceTree = ""; }; - OBJ_36 /* Crypto */ = { + OBJ_5 /* */ = { isa = PBXGroup; children = ( - 3883A8BF20029A4000460A9B /* BytePacker.swift */, - OBJ_37 /* Crypto.swift */, - 385C827B201AF2B000012D71 /* MnemonicPassphrase.swift */, - 3809038A2013AB9D00E80537 /* Random.swift */, - OBJ_38 /* SHA256.swift */, + OBJ_6 /* Package.swift */, + OBJ_7 /* Sources */, + OBJ_78 /* Tests */, + OBJ_104 /* docs */, + OBJ_105 /* Dependencies */, + OBJ_128 /* Products */, ); - path = Crypto; + name = ""; sourceTree = ""; }; - OBJ_39 /* Tests */ = { + OBJ_50 /* Responses */ = { isa = PBXGroup; children = ( - OBJ_40 /* API */, - 385C827E201AF4FD00012D71 /* Crypto */, - OBJ_51 /* LiskTestCase.swift */, + OBJ_51 /* SignatureBroadcastResponse.swift */, ); - path = Tests; - sourceTree = SOURCE_ROOT; + path = Responses; + sourceTree = ""; }; - OBJ_40 /* API */ = { + OBJ_53 /* Transactions */ = { isa = PBXGroup; children = ( - OBJ_41 /* Accounts */, - 38C66D9E20053D25007B2FA1 /* Blocks */, - 381C95E22003EC300002FBC4 /* Delegates */, - OBJ_47 /* Loader */, - 381C95F62003FA700002FBC4 /* Peers */, - 38C55B94200684EE00C0CCA4 /* Signatures */, - 3874ABA21FFC8E550008C527 /* Transactions */, + OBJ_54 /* LocalTransaction.swift */, + OBJ_55 /* Models */, + OBJ_57 /* Responses */, + OBJ_60 /* Transactions.swift */, ); - path = API; + path = Transactions; sourceTree = ""; }; - OBJ_41 /* Accounts */ = { + OBJ_55 /* Models */ = { isa = PBXGroup; children = ( - OBJ_42 /* AccountsAccountTests.swift */, - OBJ_43 /* AccountsBalanceTests.swift */, - OBJ_45 /* AccountsOpenTests.swift */, - OBJ_46 /* AccountsPublicKeyTests.swift */, + OBJ_56 /* TransactionModel.swift */, ); - path = Accounts; + path = Models; sourceTree = ""; }; - OBJ_47 /* Loader */ = { + OBJ_57 /* Responses */ = { isa = PBXGroup; children = ( - OBJ_48 /* LoaderStatusPingTests.swift */, - OBJ_49 /* LoaderStatusSyncTests.swift */, - OBJ_50 /* LoaderStatusTests.swift */, + OBJ_58 /* TransactionBroadcastResponse.swift */, + OBJ_59 /* TransactionsResponse.swift */, ); - path = Loader; + path = Responses; sourceTree = ""; }; - OBJ_5 = { + OBJ_62 /* Core */ = { isa = PBXGroup; children = ( - OBJ_6 /* Package.swift */, - OBJ_7 /* Sources */, - OBJ_39 /* Tests */, - OBJ_53 /* Dependencies */, - OBJ_76 /* Products */, + OBJ_63 /* APIClient.swift */, + OBJ_64 /* APIError.swift */, + OBJ_65 /* APIModel.swift */, + OBJ_66 /* APINethash.swift */, + OBJ_67 /* APINode.swift */, + OBJ_68 /* APIOptions.swift */, + OBJ_69 /* APIRequest.swift */, + OBJ_70 /* APIResponse.swift */, + OBJ_71 /* APIService.swift */, ); + path = Core; sourceTree = ""; }; - OBJ_53 /* Dependencies */ = { + OBJ_7 /* Sources */ = { isa = PBXGroup; children = ( - OBJ_54 /* Ed25519 0.2.0 */, + OBJ_8 /* API */, + OBJ_61 /* Constants.swift */, + OBJ_62 /* Core */, + OBJ_72 /* Crypto */, ); - name = Dependencies; - sourceTree = ""; + path = Sources; + sourceTree = SOURCE_ROOT; }; - OBJ_54 /* Ed25519 0.2.0 */ = { + OBJ_72 /* Crypto */ = { isa = PBXGroup; children = ( - OBJ_55 /* CEd25519 */, - OBJ_69 /* Ed25519 */, - OBJ_75 /* Package.swift */, + OBJ_73 /* BytePacker.swift */, + OBJ_74 /* Crypto.swift */, + OBJ_75 /* MnemonicPassphrase.swift */, + OBJ_76 /* Random.swift */, + OBJ_77 /* SHA256.swift */, + 3896F03320AB3B9900069A45 /* WebToken.swift */, ); - name = "Ed25519 0.2.0"; - sourceTree = SOURCE_ROOT; + path = Crypto; + sourceTree = ""; }; - OBJ_55 /* CEd25519 */ = { + OBJ_78 /* Tests */ = { isa = PBXGroup; children = ( - OBJ_56 /* add_scalar.c */, - OBJ_57 /* fe.c */, - OBJ_58 /* ge.c */, - OBJ_59 /* key_exchange.c */, - OBJ_60 /* keypair.c */, - OBJ_61 /* sc.c */, - OBJ_62 /* seed.c */, - OBJ_63 /* sha512.c */, - OBJ_64 /* sign.c */, - OBJ_65 /* verify.c */, - OBJ_66 /* include */, + OBJ_79 /* API */, + OBJ_100 /* Crypto */, + OBJ_103 /* LiskTestCase.swift */, ); - name = CEd25519; - path = ".build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519"; + path = Tests; sourceTree = SOURCE_ROOT; }; - OBJ_66 /* include */ = { + OBJ_79 /* API */ = { isa = PBXGroup; children = ( - OBJ_67 /* ed25519.h */, - OBJ_68 /* module.modulemap */, + OBJ_80 /* Accounts */, + OBJ_84 /* Blocks */, + OBJ_87 /* Delegates */, + OBJ_90 /* Peers */, + OBJ_93 /* Signatures */, + OBJ_95 /* Transactions */, ); - path = include; + path = API; sourceTree = ""; }; - OBJ_69 /* Ed25519 */ = { + OBJ_8 /* API */ = { isa = PBXGroup; children = ( - OBJ_70 /* Error.swift */, - OBJ_71 /* KeyPair.swift */, - OBJ_72 /* PrivateKey.swift */, - OBJ_73 /* PublicKey.swift */, - OBJ_74 /* Seed.swift */, + OBJ_9 /* Accounts */, + OBJ_15 /* Blocks */, + OBJ_21 /* Dapps */, + OBJ_27 /* Delegates */, + OBJ_33 /* Node */, + OBJ_41 /* Peers */, + OBJ_47 /* Signatures */, + OBJ_53 /* Transactions */, ); - name = Ed25519; - path = ".build/checkouts/ed25519.git-6274347002403739230/Sources/Ed25519"; - sourceTree = SOURCE_ROOT; + path = API; + sourceTree = ""; }; - OBJ_7 /* Sources */ = { + OBJ_80 /* Accounts */ = { isa = PBXGroup; children = ( - OBJ_28 /* Constants.swift */, - OBJ_8 /* API */, - OBJ_29 /* Core */, - OBJ_36 /* Crypto */, + OBJ_81 /* AccountsAccountTests.swift */, + OBJ_82 /* AccountsOpenTests.swift */, + OBJ_83 /* AccountsPublicKeyTests.swift */, ); - path = Sources; - sourceTree = SOURCE_ROOT; + path = Accounts; + sourceTree = ""; }; - OBJ_76 /* Products */ = { + OBJ_84 /* Blocks */ = { isa = PBXGroup; children = ( - "Lisk::LiskTests::Product" /* LiskTests.xctest */, - "Lisk::Lisk::Product" /* Lisk.framework */, - "Ed25519::Ed25519::Product" /* Ed25519.framework */, - "Ed25519::CEd25519::Product" /* CEd25519.framework */, + OBJ_85 /* BlocksGetTests.swift */, + OBJ_86 /* BlocksListTests.swift */, ); - name = Products; - sourceTree = BUILT_PRODUCTS_DIR; + path = Blocks; + sourceTree = ""; }; - OBJ_8 /* API */ = { + OBJ_87 /* Delegates */ = { isa = PBXGroup; children = ( - OBJ_9 /* Accounts */, - 38C66D7920051FA7007B2FA1 /* Blocks */, - OBJ_18 /* Delegates */, - OBJ_22 /* Loader */, - 381C95EB2003F4430002FBC4 /* Peers */, - 38B8E21C2006722C0067BA8E /* Signatures */, - 3874AB991FFC82260008C527 /* Transactions */, + OBJ_88 /* DelegatesGetTests.swift */, + OBJ_89 /* DelegatesListTests.swift */, ); - path = API; + path = Delegates; sourceTree = ""; }; OBJ_9 /* Accounts */ = { isa = PBXGroup; children = ( + OBJ_10 /* Accounts.swift */, OBJ_11 /* Models */, OBJ_13 /* Responses */, - OBJ_10 /* Accounts.swift */, ); path = Accounts; sourceTree = ""; }; + OBJ_90 /* Peers */ = { + isa = PBXGroup; + children = ( + OBJ_91 /* PeersGetTests.swift */, + OBJ_92 /* PeersListTests.swift */, + ); + path = Peers; + sourceTree = ""; + }; + OBJ_93 /* Signatures */ = { + isa = PBXGroup; + children = ( + OBJ_94 /* SignaturesRegisterTests.swift */, + ); + path = Signatures; + sourceTree = ""; + }; + OBJ_95 /* Transactions */ = { + isa = PBXGroup; + children = ( + OBJ_96 /* TransactionsGetTests.swift */, + OBJ_97 /* TransactionsListTest.swift */, + OBJ_98 /* TransactionsSigningTest.swift */, + OBJ_99 /* TransactionsTransferTests.swift */, + ); + path = Transactions; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ "Ed25519::CEd25519" /* CEd25519 */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_159 /* Build configuration list for PBXNativeTarget "CEd25519" */; + buildConfigurationList = OBJ_134 /* Build configuration list for PBXNativeTarget "CEd25519" */; buildPhases = ( - OBJ_162 /* Sources */, - OBJ_173 /* Frameworks */, + OBJ_137 /* Sources */, + OBJ_148 /* Frameworks */, ); buildRules = ( ); @@ -765,15 +747,15 @@ }; "Ed25519::Ed25519" /* Ed25519 */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_147 /* Build configuration list for PBXNativeTarget "Ed25519" */; + buildConfigurationList = OBJ_150 /* Build configuration list for PBXNativeTarget "Ed25519" */; buildPhases = ( - OBJ_150 /* Sources */, - OBJ_156 /* Frameworks */, + OBJ_153 /* Sources */, + OBJ_159 /* Frameworks */, ); buildRules = ( ); dependencies = ( - OBJ_158 /* PBXTargetDependency */, + OBJ_161 /* PBXTargetDependency */, ); name = Ed25519; productName = Ed25519; @@ -782,9 +764,9 @@ }; "Ed25519::SwiftPMPackageDescription" /* Ed25519PackageDescription */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_88 /* Build configuration list for PBXNativeTarget "Ed25519PackageDescription" */; + buildConfigurationList = OBJ_163 /* Build configuration list for PBXNativeTarget "Ed25519PackageDescription" */; buildPhases = ( - OBJ_91 /* Sources */, + OBJ_166 /* Sources */, ); buildRules = ( ); @@ -796,16 +778,16 @@ }; "Lisk::Lisk" /* Lisk */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_117 /* Build configuration list for PBXNativeTarget "Lisk" */; + buildConfigurationList = OBJ_169 /* Build configuration list for PBXNativeTarget "Lisk" */; buildPhases = ( - OBJ_120 /* Sources */, - OBJ_142 /* Frameworks */, + OBJ_172 /* Sources */, + OBJ_216 /* Frameworks */, ); buildRules = ( ); dependencies = ( - OBJ_145 /* PBXTargetDependency */, - OBJ_146 /* PBXTargetDependency */, + OBJ_219 /* PBXTargetDependency */, + OBJ_220 /* PBXTargetDependency */, ); name = Lisk; productName = Lisk; @@ -814,17 +796,17 @@ }; "Lisk::LiskTests" /* LiskTests */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_94 /* Build configuration list for PBXNativeTarget "LiskTests" */; + buildConfigurationList = OBJ_233 /* Build configuration list for PBXNativeTarget "LiskTests" */; buildPhases = ( - OBJ_97 /* Sources */, - OBJ_107 /* Frameworks */, + OBJ_236 /* Sources */, + OBJ_254 /* Frameworks */, ); buildRules = ( ); dependencies = ( - OBJ_111 /* PBXTargetDependency */, - OBJ_113 /* PBXTargetDependency */, - OBJ_115 /* PBXTargetDependency */, + OBJ_258 /* PBXTargetDependency */, + OBJ_259 /* PBXTargetDependency */, + OBJ_260 /* PBXTargetDependency */, ); name = LiskTests; productName = LiskTests; @@ -833,9 +815,9 @@ }; "Lisk::SwiftPMPackageDescription" /* LiskPackageDescription */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_82 /* Build configuration list for PBXNativeTarget "LiskPackageDescription" */; + buildConfigurationList = OBJ_222 /* Build configuration list for PBXNativeTarget "LiskPackageDescription" */; buildPhases = ( - OBJ_85 /* Sources */, + OBJ_225 /* Sources */, ); buildRules = ( ); @@ -860,203 +842,189 @@ knownRegions = ( en, ); - mainGroup = OBJ_5; - productRefGroup = OBJ_76 /* Products */; + mainGroup = OBJ_5 /* */; + productRefGroup = OBJ_128 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - "Lisk::SwiftPMPackageDescription" /* LiskPackageDescription */, + "Ed25519::CEd25519" /* CEd25519 */, + "Ed25519::Ed25519" /* Ed25519 */, "Ed25519::SwiftPMPackageDescription" /* Ed25519PackageDescription */, - "Lisk::LiskTests" /* LiskTests */, "Lisk::Lisk" /* Lisk */, - "Ed25519::Ed25519" /* Ed25519 */, - "Ed25519::CEd25519" /* CEd25519 */, + "Lisk::SwiftPMPackageDescription" /* LiskPackageDescription */, "Lisk::LiskPackageTests::ProductTarget" /* LiskPackageTests */, + "Lisk::LiskTests" /* LiskTests */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - OBJ_120 /* Sources */ = { + OBJ_137 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - 3874ABA11FFC831B0008C527 /* TransactionModel.swift in Sources */, - 38C66D7F20051FF8007B2FA1 /* BlockModel.swift in Sources */, - OBJ_121 /* Accounts.swift in Sources */, - 38C66D8F20052794007B2FA1 /* BlockFeesResponse.swift in Sources */, - 38C66D7B20051FB8007B2FA1 /* Blocks.swift in Sources */, - 381C95ED2003F4580002FBC4 /* Peers.swift in Sources */, - OBJ_122 /* AccountModel.swift in Sources */, - OBJ_123 /* AccountResponse.swift in Sources */, - OBJ_124 /* AccountBalanceResponse.swift in Sources */, - OBJ_126 /* AccountPublicKeyResponse.swift in Sources */, - OBJ_127 /* Delegates.swift in Sources */, - 38C66D952005283E007B2FA1 /* BlockSupplyResponse.swift in Sources */, - OBJ_128 /* DelegateModel.swift in Sources */, - 38C66D932005281D007B2FA1 /* BlockRewardResponse.swift in Sources */, - OBJ_129 /* Loader.swift in Sources */, - 385C827C201AF2B000012D71 /* MnemonicPassphrase.swift in Sources */, - 381C95F02003F4A10002FBC4 /* PeerModel.swift in Sources */, - 3883A8C120029A9700460A9B /* BytePacker.swift in Sources */, - 38C66D99200528B2007B2FA1 /* BlockStatusResponse.swift in Sources */, - 38C66D91200527C7007B2FA1 /* FeesModel.swift in Sources */, - OBJ_130 /* LoaderStatusPingResponse.swift in Sources */, - 3809038C2013AC1B00E80537 /* Random.swift in Sources */, - 381C95DB2003E6060002FBC4 /* DelegateCountResponse.swift in Sources */, - OBJ_131 /* LoaderStatusResponse.swift in Sources */, - OBJ_132 /* LoaderStatusSyncResponse.swift in Sources */, - 381C95F52003F6090002FBC4 /* PeerVersionResponse.swift in Sources */, - 381C95F32003F5CF0002FBC4 /* PeerResponse.swift in Sources */, - 38C66D9720052865007B2FA1 /* BlockHeightResponse.swift in Sources */, - OBJ_133 /* Constants.swift in Sources */, - 381C95DD2003E6D50002FBC4 /* APIService.swift in Sources */, - 38C66D8D20052777007B2FA1 /* BlockFeeResponse.swift in Sources */, - OBJ_134 /* APIClient.swift in Sources */, - OBJ_135 /* APINethash.swift in Sources */, - 3883A8CA2003BED900460A9B /* TransactionBroadcastResponse.swift in Sources */, - OBJ_136 /* APINode.swift in Sources */, - 38B8E222200672780067BA8E /* SignatureFeeResponse.swift in Sources */, - 381C95DF2003EAA40002FBC4 /* VoterModel.swift in Sources */, - 38C66D8120052032007B2FA1 /* APIModel.swift in Sources */, - 38C66D9D20052927007B2FA1 /* BlockMilestoneResponse.swift in Sources */, - 3874AB9B1FFC82490008C527 /* Transactions.swift in Sources */, - 3883A8C320029BE500460A9B /* LocalTransaction.swift in Sources */, - 381C95E12003EADC0002FBC4 /* DelegateVotersResponse.swift in Sources */, - 38B8E2232006728A0067BA8E /* Signatures.swift in Sources */, - OBJ_137 /* APIOptions.swift in Sources */, - 381C95D92003E44E0002FBC4 /* DelegateResponse.swift in Sources */, - OBJ_138 /* APIResponse.swift in Sources */, - 38C66D9B200528FC007B2FA1 /* BlockNethashResponse.swift in Sources */, - OBJ_139 /* APIResponseError.swift in Sources */, - 38C66D83200523F2007B2FA1 /* BlockResponse.swift in Sources */, - OBJ_140 /* Crypto.swift in Sources */, - OBJ_141 /* SHA256.swift in Sources */, - 3874AB9E1FFC82C50008C527 /* TransactionResponse.swift in Sources */, + OBJ_138 /* add_scalar.c in Sources */, + OBJ_139 /* fe.c in Sources */, + OBJ_140 /* ge.c in Sources */, + OBJ_141 /* key_exchange.c in Sources */, + OBJ_142 /* keypair.c in Sources */, + OBJ_143 /* sc.c in Sources */, + OBJ_144 /* seed.c in Sources */, + OBJ_145 /* sha512.c in Sources */, + OBJ_146 /* sign.c in Sources */, + OBJ_147 /* verify.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_150 /* Sources */ = { + OBJ_153 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_151 /* Error.swift in Sources */, - OBJ_152 /* KeyPair.swift in Sources */, - OBJ_153 /* PrivateKey.swift in Sources */, - OBJ_154 /* PublicKey.swift in Sources */, - OBJ_155 /* Seed.swift in Sources */, + OBJ_154 /* Error.swift in Sources */, + OBJ_155 /* KeyPair.swift in Sources */, + OBJ_156 /* PrivateKey.swift in Sources */, + OBJ_157 /* PublicKey.swift in Sources */, + OBJ_158 /* Seed.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_162 /* Sources */ = { + OBJ_166 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_163 /* add_scalar.c in Sources */, - OBJ_164 /* fe.c in Sources */, - OBJ_165 /* ge.c in Sources */, - OBJ_166 /* key_exchange.c in Sources */, - OBJ_167 /* keypair.c in Sources */, - OBJ_168 /* sc.c in Sources */, - OBJ_169 /* seed.c in Sources */, - OBJ_170 /* sha512.c in Sources */, - OBJ_171 /* sign.c in Sources */, - OBJ_172 /* verify.c in Sources */, + OBJ_167 /* Package.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_85 /* Sources */ = { + OBJ_172 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_86 /* Package.swift in Sources */, + OBJ_173 /* Accounts.swift in Sources */, + OBJ_174 /* AccountModel.swift in Sources */, + OBJ_175 /* AccountsResponse.swift in Sources */, + OBJ_176 /* Blocks.swift in Sources */, + OBJ_177 /* BlockModel.swift in Sources */, + OBJ_178 /* BlocksResponse.swift in Sources */, + OBJ_179 /* Dapps.swift in Sources */, + OBJ_180 /* DappModel.swift in Sources */, + OBJ_181 /* DappsResponse.swift in Sources */, + OBJ_182 /* Delegates.swift in Sources */, + OBJ_183 /* DelegateModel.swift in Sources */, + OBJ_184 /* DelegatesResponse.swift in Sources */, + OBJ_185 /* NodeConstantsModel.swift in Sources */, + OBJ_186 /* NodeStatusModel.swift in Sources */, + OBJ_187 /* Node.swift in Sources */, + OBJ_188 /* NodeConstantsResponse.swift in Sources */, + OBJ_189 /* NodeStatusResponse.swift in Sources */, + OBJ_190 /* PeerModel.swift in Sources */, + OBJ_191 /* Peers.swift in Sources */, + OBJ_192 /* PeersResponse.swift in Sources */, + OBJ_193 /* SignatureModel.swift in Sources */, + OBJ_194 /* SignatureBroadcastResponse.swift in Sources */, + OBJ_195 /* Signatures.swift in Sources */, + OBJ_196 /* LocalTransaction.swift in Sources */, + OBJ_197 /* TransactionModel.swift in Sources */, + OBJ_198 /* TransactionBroadcastResponse.swift in Sources */, + OBJ_199 /* TransactionsResponse.swift in Sources */, + OBJ_200 /* Transactions.swift in Sources */, + OBJ_201 /* Constants.swift in Sources */, + OBJ_202 /* APIClient.swift in Sources */, + OBJ_203 /* APIError.swift in Sources */, + OBJ_204 /* APIModel.swift in Sources */, + 3896F03420AB3B9900069A45 /* WebToken.swift in Sources */, + OBJ_205 /* APINethash.swift in Sources */, + OBJ_206 /* APINode.swift in Sources */, + OBJ_207 /* APIOptions.swift in Sources */, + OBJ_208 /* APIRequest.swift in Sources */, + OBJ_209 /* APIResponse.swift in Sources */, + OBJ_210 /* APIService.swift in Sources */, + OBJ_211 /* BytePacker.swift in Sources */, + OBJ_212 /* Crypto.swift in Sources */, + OBJ_213 /* MnemonicPassphrase.swift in Sources */, + OBJ_214 /* Random.swift in Sources */, + OBJ_215 /* SHA256.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_91 /* Sources */ = { + OBJ_225 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_92 /* Package.swift in Sources */, + OBJ_226 /* Package.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_97 /* Sources */ = { + OBJ_236 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_98 /* AccountsAccountTests.swift in Sources */, - OBJ_99 /* AccountsBalanceTests.swift in Sources */, - 3874ABA41FFC8E6C0008C527 /* TransactionsGetTests.swift in Sources */, - 38C66DA420053F55007B2FA1 /* BlocksListTests.swift in Sources */, - 385C8280201AF52000012D71 /* MnemonicPassphraseTests.swift in Sources */, - 381C95FA2003FACE0002FBC4 /* PeersGetTests.swift in Sources */, - 381C95FE2003FC710002FBC4 /* PeersListTests.swift in Sources */, - 3883A8C62002D8AC00460A9B /* TransactionsSigningTest.swift in Sources */, - 381C95EA2003EE440002FBC4 /* DelegatesListTests.swift in Sources */, - OBJ_101 /* AccountsOpenTests.swift in Sources */, - 381C95E82003EDB70002FBC4 /* DelegatesVotesTests.swift in Sources */, - OBJ_102 /* AccountsPublicKeyTests.swift in Sources */, - 3883A8C82002DC4E00460A9B /* TransactionsTransferTests.swift in Sources */, - OBJ_103 /* LoaderStatusPingTests.swift in Sources */, - OBJ_104 /* LoaderStatusSyncTests.swift in Sources */, - 38C66DA220053DEE007B2FA1 /* BlocksGetTests.swift in Sources */, - 38C55B962006850400C0CCA4 /* SignaturesFeeTests.swift in Sources */, - 381C95E42003EC460002FBC4 /* DelegatesCountTests.swift in Sources */, - OBJ_105 /* LoaderStatusTests.swift in Sources */, - 3874ABA61FFC8EEE0008C527 /* TransactionsListTest.swift in Sources */, - OBJ_106 /* LiskTestCase.swift in Sources */, - 38C66DA020053D35007B2FA1 /* BlocksMiscTests.swift in Sources */, - 38C55B982006854000C0CCA4 /* SignaturesRegisterTests.swift in Sources */, - 381C95F82003FA860002FBC4 /* PeersVersionTests.swift in Sources */, - 381C95E62003ECE70002FBC4 /* DelegatesGetTests.swift in Sources */, + OBJ_237 /* AccountsAccountTests.swift in Sources */, + OBJ_238 /* AccountsOpenTests.swift in Sources */, + 3896F03620AB421300069A45 /* WebTokenTests.swift in Sources */, + OBJ_239 /* AccountsPublicKeyTests.swift in Sources */, + OBJ_240 /* BlocksGetTests.swift in Sources */, + OBJ_241 /* BlocksListTests.swift in Sources */, + OBJ_242 /* DelegatesGetTests.swift in Sources */, + OBJ_243 /* DelegatesListTests.swift in Sources */, + OBJ_244 /* PeersGetTests.swift in Sources */, + OBJ_245 /* PeersListTests.swift in Sources */, + OBJ_246 /* SignaturesRegisterTests.swift in Sources */, + OBJ_247 /* TransactionsGetTests.swift in Sources */, + OBJ_248 /* TransactionsListTest.swift in Sources */, + OBJ_249 /* TransactionsSigningTest.swift in Sources */, + OBJ_250 /* TransactionsTransferTests.swift in Sources */, + OBJ_251 /* MnemonicPassphraseTests.swift in Sources */, + OBJ_252 /* SignMessageTests.swift in Sources */, + OBJ_253 /* LiskTestCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - OBJ_111 /* PBXTargetDependency */ = { + OBJ_161 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "Lisk::Lisk" /* Lisk */; - targetProxy = 38434E5B1FFADA1400AA3540 /* PBXContainerItemProxy */; + target = "Ed25519::CEd25519" /* CEd25519 */; + targetProxy = 3896F02C20AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_113 /* PBXTargetDependency */ = { + OBJ_219 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = "Ed25519::Ed25519" /* Ed25519 */; - targetProxy = 38434E5C1FFADA1400AA3540 /* PBXContainerItemProxy */; + targetProxy = 3896F02D20AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_115 /* PBXTargetDependency */ = { + OBJ_220 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = "Ed25519::CEd25519" /* CEd25519 */; - targetProxy = 38434E5D1FFADA1400AA3540 /* PBXContainerItemProxy */; + targetProxy = 3896F02E20AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_145 /* PBXTargetDependency */ = { + OBJ_231 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "Ed25519::Ed25519" /* Ed25519 */; - targetProxy = 38434E581FFADA1400AA3540 /* PBXContainerItemProxy */; + target = "Lisk::LiskTests" /* LiskTests */; + targetProxy = 3896F03220AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_146 /* PBXTargetDependency */ = { + OBJ_258 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "Ed25519::CEd25519" /* CEd25519 */; - targetProxy = 38434E5A1FFADA1400AA3540 /* PBXContainerItemProxy */; + target = "Lisk::Lisk" /* Lisk */; + targetProxy = 3896F02F20AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_158 /* PBXTargetDependency */ = { + OBJ_259 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "Ed25519::CEd25519" /* CEd25519 */; - targetProxy = 38434E591FFADA1400AA3540 /* PBXContainerItemProxy */; + target = "Ed25519::Ed25519" /* Ed25519 */; + targetProxy = 3896F03020AB2BF800069A45 /* PBXContainerItemProxy */; }; - OBJ_178 /* PBXTargetDependency */ = { + OBJ_260 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = "Lisk::LiskTests" /* LiskTests */; - targetProxy = 38434E5E1FFADA1500AA3540 /* PBXContainerItemProxy */; + target = "Ed25519::CEd25519" /* CEd25519 */; + targetProxy = 3896F03120AB2BF800069A45 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - OBJ_118 /* Debug */ = { + OBJ_135 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEFINES_MODULE = NO; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1064,25 +1032,25 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", - "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", ); - INFOPLIST_FILE = Lisk.xcodeproj/Lisk_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + INFOPLIST_FILE = Lisk.xcodeproj/CEd25519_Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = Lisk; + OTHER_SWIFT_FLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = CEd25519; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; - TARGET_NAME = Lisk; + TARGET_NAME = CEd25519; }; name = Debug; }; - OBJ_119 /* Release */ = { + OBJ_136 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEFINES_MODULE = NO; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1090,23 +1058,22 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", - "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", ); - INFOPLIST_FILE = Lisk.xcodeproj/Lisk_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + INFOPLIST_FILE = Lisk.xcodeproj/CEd25519_Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = Lisk; + OTHER_SWIFT_FLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = CEd25519; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; - TARGET_NAME = Lisk; + TARGET_NAME = CEd25519; }; name = Release; }; - OBJ_148 /* Debug */ = { + OBJ_151 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; @@ -1116,23 +1083,24 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); INFOPLIST_FILE = Lisk.xcodeproj/Ed25519_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = Ed25519; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGET_NAME = Ed25519; }; name = Debug; }; - OBJ_149 /* Release */ = { + OBJ_152 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; @@ -1142,26 +1110,44 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); INFOPLIST_FILE = Lisk.xcodeproj/Ed25519_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = Ed25519; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGET_NAME = Ed25519; }; name = Release; }; - OBJ_160 /* Debug */ = { + OBJ_164 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD = /usr/bin/true; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + OBJ_165 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD = /usr/bin/true; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + OBJ_170 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - DEFINES_MODULE = NO; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1169,24 +1155,26 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", + "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); - INFOPLIST_FILE = Lisk.xcodeproj/CEd25519_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + INFOPLIST_FILE = Lisk.xcodeproj/Lisk_Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = CEd25519; + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = Lisk; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - TARGET_NAME = CEd25519; + SWIFT_VERSION = 4.0; + TARGET_NAME = Lisk; }; name = Debug; }; - OBJ_161 /* Release */ = { + OBJ_171 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - DEFINES_MODULE = NO; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1194,111 +1182,54 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", + "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); - INFOPLIST_FILE = Lisk.xcodeproj/CEd25519_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + INFOPLIST_FILE = Lisk.xcodeproj/Lisk_Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = CEd25519; + OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = Lisk; PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - TARGET_NAME = CEd25519; - }; - name = Release; - }; - OBJ_176 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - OBJ_177 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - OBJ_3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - ONLY_ACTIVE_ARCH = YES; - OTHER_SWIFT_FLAGS = "-DXcode"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - USE_HEADERMAP = NO; - }; - name = Debug; - }; - OBJ_4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_OPTIMIZATION_LEVEL = s; - MACOSX_DEPLOYMENT_TARGET = 10.10; - OTHER_SWIFT_FLAGS = "-DXcode"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - USE_HEADERMAP = NO; + SWIFT_VERSION = 4.0; + TARGET_NAME = Lisk; }; name = Release; }; - OBJ_83 /* Debug */ = { + OBJ_223 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; SWIFT_VERSION = 4.0; }; name = Debug; }; - OBJ_84 /* Release */ = { + OBJ_224 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 4 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; SWIFT_VERSION = 4.0; }; name = Release; }; - OBJ_89 /* Debug */ = { + OBJ_229 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 3 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/3 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; - SWIFT_VERSION = 3.0; }; name = Debug; }; - OBJ_90 /* Release */ = { + OBJ_230 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 3 -I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/3 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; - SWIFT_VERSION = 3.0; }; name = Release; }; - OBJ_95 /* Debug */ = { + OBJ_234 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; @@ -1308,11 +1239,12 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); INFOPLIST_FILE = Lisk.xcodeproj/LiskTests_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; SWIFT_VERSION = 4.0; @@ -1320,7 +1252,7 @@ }; name = Debug; }; - OBJ_96 /* Release */ = { + OBJ_235 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; @@ -1330,11 +1262,12 @@ ); HEADER_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/.build/checkouts/ed25519.git-6274347002403739230/Sources/CEd25519/include", + "$(SRCROOT)/.build/checkouts/ed25519.git--1962158432852652388/Sources/CEd25519/include", "$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519", ); INFOPLIST_FILE = Lisk.xcodeproj/LiskTests_Info.plist; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; + OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/Lisk.xcodeproj/GeneratedModuleMap/CEd25519/module.modulemap"; SWIFT_VERSION = 4.0; @@ -1342,44 +1275,86 @@ }; name = Release; }; + OBJ_3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + USE_HEADERMAP = NO; + }; + name = Debug; + }; + OBJ_4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_OPTIMIZATION_LEVEL = s; + MACOSX_DEPLOYMENT_TARGET = 10.10; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + USE_HEADERMAP = NO; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - OBJ_117 /* Build configuration list for PBXNativeTarget "Lisk" */ = { + OBJ_134 /* Build configuration list for PBXNativeTarget "CEd25519" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_118 /* Debug */, - OBJ_119 /* Release */, + OBJ_135 /* Debug */, + OBJ_136 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_147 /* Build configuration list for PBXNativeTarget "Ed25519" */ = { + OBJ_150 /* Build configuration list for PBXNativeTarget "Ed25519" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_148 /* Debug */, - OBJ_149 /* Release */, + OBJ_151 /* Debug */, + OBJ_152 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_159 /* Build configuration list for PBXNativeTarget "CEd25519" */ = { + OBJ_163 /* Build configuration list for PBXNativeTarget "Ed25519PackageDescription" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_160 /* Debug */, - OBJ_161 /* Release */, + OBJ_164 /* Debug */, + OBJ_165 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_175 /* Build configuration list for PBXAggregateTarget "LiskPackageTests" */ = { + OBJ_169 /* Build configuration list for PBXNativeTarget "Lisk" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_176 /* Debug */, - OBJ_177 /* Release */, + OBJ_170 /* Debug */, + OBJ_171 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; OBJ_2 /* Build configuration list for PBXProject "Lisk" */ = { isa = XCConfigurationList; @@ -1388,34 +1363,34 @@ OBJ_4 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_82 /* Build configuration list for PBXNativeTarget "LiskPackageDescription" */ = { + OBJ_222 /* Build configuration list for PBXNativeTarget "LiskPackageDescription" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_83 /* Debug */, - OBJ_84 /* Release */, + OBJ_223 /* Debug */, + OBJ_224 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_88 /* Build configuration list for PBXNativeTarget "Ed25519PackageDescription" */ = { + OBJ_228 /* Build configuration list for PBXAggregateTarget "LiskPackageTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_89 /* Debug */, - OBJ_90 /* Release */, + OBJ_229 /* Debug */, + OBJ_230 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; - OBJ_94 /* Build configuration list for PBXNativeTarget "LiskTests" */ = { + OBJ_233 /* Build configuration list for PBXNativeTarget "LiskTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_95 /* Debug */, - OBJ_96 /* Release */, + OBJ_234 /* Debug */, + OBJ_235 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Lisk.xcodeproj/xcshareddata/xcschemes/Lisk-Package.xcscheme b/Lisk.xcodeproj/xcshareddata/xcschemes/Lisk-Package.xcscheme index 51a845b..43ca825 100644 --- a/Lisk.xcodeproj/xcshareddata/xcschemes/Lisk-Package.xcscheme +++ b/Lisk.xcodeproj/xcshareddata/xcschemes/Lisk-Package.xcscheme @@ -14,9 +14,9 @@ buildForAnalyzing = "YES"> @@ -28,9 +28,9 @@ buildForAnalyzing = "YES"> @@ -42,9 +42,9 @@ buildForAnalyzing = "YES"> @@ -54,9 +54,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" - shouldUseLaunchSchemeArgsEnv = "YES" - codeCoverageEnabled = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -76,7 +74,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -86,9 +83,9 @@ diff --git a/Lisk.xcodeproj/xcuserdata/andrewbarba.xcuserdatad/xcschemes/xcschememanagement.plist b/Lisk.xcodeproj/xcuserdata/andrewbarba.xcuserdatad/xcschemes/xcschememanagement.plist index 22a4cfd..d128bd1 100644 --- a/Lisk.xcodeproj/xcuserdata/andrewbarba.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Lisk.xcodeproj/xcuserdata/andrewbarba.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ Ed25519PackageDescription.xcscheme orderHint - 2 + 1 Lisk-Package.xcscheme_^#shared#^_ @@ -17,7 +17,7 @@ LiskPackageDescription.xcscheme orderHint - 1 + 2 LiskPackageTests.xcscheme diff --git a/Package.resolved b/Package.resolved index 8eea317..b29a3a2 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,31 +1,13 @@ { "object": { "pins": [ - { - "package": "Bluebird", - "repositoryURL": "https://github.com/AndrewBarba/Bluebird.swift.git", - "state": { - "branch": null, - "revision": "932ddc12b9f331e52c3dcf08b6ad9c95c986897f", - "version": "2.0.1" - } - }, - { - "package": "CryptoSwift", - "repositoryURL": "https://github.com/krzyzanowskim/CryptoSwift.git", - "state": { - "branch": null, - "revision": "d0084e4a6fe9490b3baab3d3c2aad58d3a852daf", - "version": "0.8.0" - } - }, { "package": "Ed25519", - "repositoryURL": "https://github.com/vzsg/ed25519.git", + "repositoryURL": "https://github.com/AndrewBarba/ed25519.git", "state": { "branch": null, - "revision": "0d2cfe8ce5e55cb3df77a846def37071b0b6ff91", - "version": "0.2.0" + "revision": "77bf751b603c573d50e45e2adb2e06776af219ae", + "version": "1.1.0" } } ] diff --git a/Package.swift b/Package.swift index 7ffc33c..30da38d 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.0 +// swift-tools-version:4.1 import PackageDescription @@ -8,7 +8,7 @@ let package = Package( .library(name: "Lisk", targets: ["Lisk"]), ], dependencies: [ - .package(url: "https://github.com/vzsg/ed25519.git", from: "0.2.0") + .package(url: "https://github.com/AndrewBarba/ed25519.git", from: "1.1.0") ], targets: [ .target( diff --git a/README.md b/README.md index 0068ef1..cc1d13c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Lisk Swift is heavily inspired by [Lisk JS](https://github.com/LiskHQ/lisk-js) - [x] Local Signing for maximum security - [x] Targets Lisk 1.0.0 API - [x] Directly based on lisk-js -- [x] Swift 4.0 +- [x] Swift 4.1 - [x] Unit Tests (87% coverage) - [x] Documentation @@ -23,8 +23,9 @@ Lisk Swift is heavily inspired by [Lisk JS](https://github.com/LiskHQ/lisk-js) - [Accounts](https://andrewbarba.github.io/lisk-swift/Structs/Accounts.html) - [Blocks](https://andrewbarba.github.io/lisk-swift/Structs/Blocks.html) +- [Dapps](https://andrewbarba.github.io/lisk-swift/Structs/Dapps.html) - [Delegates](https://andrewbarba.github.io/lisk-swift/Structs/Delegates.html) -- [Loader](https://andrewbarba.github.io/lisk-swift/Structs/Loader.html) +- [Node](https://andrewbarba.github.io/lisk-swift/Structs/Node.html) - [Peers](https://andrewbarba.github.io/lisk-swift/Structs/Peers.html) - [Signatures](https://andrewbarba.github.io/lisk-swift/Structs/Signatures.html) - [Transactions](https://andrewbarba.github.io/lisk-swift/Structs/Transactions.html) @@ -108,30 +109,30 @@ let transactions = Transactions() ### Swift Package Manager ```swift -// swift-tools-version:4.0 +// swift-tools-version:4.1 import PackageDescription let package = Package( name: "My Lisk App", dependencies: [ - .package(url: "https://github.com/AndrewBarba/lisk-swift.git", from: "1.0.0-beta") + .package(url: "https://github.com/AndrewBarba/lisk-swift.git", from: "1.0.0.beta") ] ) ``` ### CocoaPods -> CocoaPods 1.1.0+ is required to build lisk-swift +> CocoaPods 1.5.0+ is required to build lisk-swift ```ruby -pod 'Lisk', '~> 1.0.0-beta' +pod 'Lisk', '~> 1.0.0.beta' ``` ### Carthage ```ogdl -github "AndrewBarba/lisk-swift" ~> 1.0.0-beta +github "AndrewBarba/lisk-swift" ~> 1.0.0.beta ``` ## Thank You diff --git a/Sources/API/Accounts/Accounts.swift b/Sources/API/Accounts/Accounts.swift index a95baf3..cbcc1de 100644 --- a/Sources/API/Accounts/Accounts.swift +++ b/Sources/API/Accounts/Accounts.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -20,51 +19,21 @@ public struct Accounts: APIService { } } -// MARK: - Get +// MARK: - List extension Accounts { - /// Retrieve the account info for an address - /// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-information-from-address - public func account(address: String, completionHandler: @escaping (Response) -> Void) { - let options = ["address": address] - client.get(path: "accounts", options: options, completionHandler: completionHandler) - } - - /// Retrieve the public key of a Lisk address - /// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-public-key - public func publicKey(address: String, completionHandler: @escaping (Response) -> Void) { - let options = ["address": address] - client.get(path: "accounts/getPublicKey", options: options, completionHandler: completionHandler) - } -} - -// MARK: - Open - -extension Accounts { + /// Retrieve accounts + public func accounts(address: String? = nil, publicKey: String? = nil, secondPublicKey: String? = nil, username: String? = nil, limit: Int? = nil, offset: Int? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { + var options: RequestOptions = [:] + if let value = address { options["address"] = value } + if let value = publicKey { options["publicKey"] = value } + if let value = secondPublicKey { options["secondPublicKey"] = value } + if let value = username { options["username"] = value } + if let value = limit { options["limit"] = value } + if let value = offset { options["offset"] = value } + if let value = sort?.value { options["sort"] = value } - /// Opens a new/existing Lisk account via secret passphrase - /// https://docs.lisk.io/v1.4/docs/lisk-api-080-accounts#section-get-account-information - public func open(secret: String, completionHandler: @escaping (Response) -> Void) { - do { - let (publicKey, _) = try Crypto.keys(fromSecret: secret) - let address = Crypto.address(fromPublicKey: publicKey) - self.account(address: address, completionHandler: completionHandler) - } catch { - let response = APIResponseError(message: "Invalid secret key") - completionHandler(.error(response: response)) - } - } -} - -// MARK: - Balance - -extension Accounts { - - /// Retrieve the balance of a Lisk address - /// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-balance - public func balance(address: String, completionHandler: @escaping (Response) -> Void) { - let options = ["address": address] - client.get(path: "accounts/getBalance", options: options, completionHandler: completionHandler) + client.get(path: "accounts", options: options, completionHandler: completionHandler) } } diff --git a/Sources/API/Accounts/Models/AccountModel.swift b/Sources/API/Accounts/Models/AccountModel.swift index 47e2174..2c3f996 100644 --- a/Sources/API/Accounts/Models/AccountModel.swift +++ b/Sources/API/Accounts/Models/AccountModel.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -14,14 +13,24 @@ extension Accounts { public let address: String - public let balance: String + public let publicKey: String - public let unconfirmedBalance: String + public let balance: String? - public let publicKey: String + public let unconfirmedBalance: String? + + public let secondPublicKey: String? + + public let delegate: Delegates.DelegateModel? + + // MARK: - Hashable - public let unconfirmedSignature: UInt8 + public static func == (lhs: AccountModel, rhs: AccountModel) -> Bool { + return lhs.address == rhs.address + } - public let secondSignature: UInt8 + public var hashValue: Int { + return address.hashValue + } } } diff --git a/Sources/API/Accounts/Responses/AccountBalanceResponse.swift b/Sources/API/Accounts/Responses/AccountBalanceResponse.swift deleted file mode 100644 index 3347c9a..0000000 --- a/Sources/API/Accounts/Responses/AccountBalanceResponse.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// AccountBalanceResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-balance -extension Accounts { - - public struct BalanceResponse: APIResponse { - - public let success: Bool - - public let balance: String - - public let unconfirmedBalance: String - } -} diff --git a/Sources/API/Accounts/Responses/AccountPublicKeyResponse.swift b/Sources/API/Accounts/Responses/AccountPublicKeyResponse.swift deleted file mode 100644 index f810a0b..0000000 --- a/Sources/API/Accounts/Responses/AccountPublicKeyResponse.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// AccountPublicKeyResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-public-key -extension Accounts { - - public struct PublicKeyResponse: APIResponse { - - public let success: Bool - - public let publicKey: String - } -} diff --git a/Sources/API/Accounts/Responses/AccountResponse.swift b/Sources/API/Accounts/Responses/AccountResponse.swift deleted file mode 100644 index 0286cb5..0000000 --- a/Sources/API/Accounts/Responses/AccountResponse.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// AccountResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-accounts#section-get-account-balance -extension Accounts { - - public struct AccountResponse: APIResponse { - - public let success: Bool - - public let account: AccountModel - } -} diff --git a/Sources/API/Accounts/Responses/AccountsResponse.swift b/Sources/API/Accounts/Responses/AccountsResponse.swift new file mode 100644 index 0000000..f9d2896 --- /dev/null +++ b/Sources/API/Accounts/Responses/AccountsResponse.swift @@ -0,0 +1,16 @@ +// +// AccountsResponse.swift +// Lisk +// +// Created by Andrew Barba on 12/31/17. +// + +import Foundation + +extension Accounts { + + public struct AccountsResponse: APIResponse { + + public let data: [AccountModel] + } +} diff --git a/Sources/API/Blocks/Blocks.swift b/Sources/API/Blocks/Blocks.swift index f618590..e245d1f 100644 --- a/Sources/API/Blocks/Blocks.swift +++ b/Sources/API/Blocks/Blocks.swift @@ -7,7 +7,6 @@ import Foundation -/// Blocks - https://docs.lisk.io/docs/lisk-api-080-blocks public struct Blocks: APIService { /// Client used to send requests @@ -19,89 +18,20 @@ public struct Blocks: APIService { } } -// MARK: - Get - -extension Blocks { - - /// Get a block by id - public func block(id: String, completionHandler: @escaping (Response) -> Void) { - let options = ["id": id] - client.get(path: "blocks/get", options: options, completionHandler: completionHandler) - } -} - // MARK: - List extension Blocks { /// List blocks - /// - /// - Parameters: - /// - generatorPublicKey: who generated the block - /// - height: height of block - /// - previousBlock: previous block - /// - totalAmount: total amount in block - /// - totalFee: total fee of block - /// - limit: limit number of returned transactions - /// - offset: used for paging, offset by certain number of transactions - /// - orderBy: sort results by a column and direction - /// - join: defaults to 'or', specify 'and' for an AND join of passed in parameters - public func blocks(generatorPublicKey: String? = nil, height: Int? = nil, previousBlock: String? = nil, totalAmount: Int? = nil, totalFee: Int? = nil, limit: UInt? = nil, offset: UInt? = nil, orderBy: OrderBy? = nil, join: PropertyJoin = .or, completionHandler: @escaping (Response) -> Void) { + public func blocks(id: String? = nil, height: Int? = nil, generatorPublicKey: String? = nil, limit: Int? = nil, offset: Int? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { var options: RequestOptions = [:] - if let value = generatorPublicKey { options["\(join.rawValue)generatorPublicKey"] = value } - if let value = height { options["\(join.rawValue)height"] = value } - if let value = previousBlock { options["\(join.rawValue)previousBlock"] = value } - if let value = totalAmount { options["\(join.rawValue)totalAmount"] = value } - if let value = totalFee { options["\(join.rawValue)totalFee"] = value } + if let value = id { options["blockId"] = value } + if let value = height { options["height"] = value } + if let value = generatorPublicKey { options["generatorPublicKey"] = value } if let value = limit { options["limit"] = value } if let value = offset { options["offset"] = value } - if let value = orderBy { options["orderBy"] = "\(value.column):\(value.direction.rawValue)" } + if let value = sort?.value { options["sort"] = value } client.get(path: "blocks", options: options, completionHandler: completionHandler) } } - -// MARK: - Misc - -extension Blocks { - - /// Get current status - public func status(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getStatus", completionHandler: completionHandler) - } - - /// Get current fee - public func fee(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getFee", completionHandler: completionHandler) - } - - /// Get current fees - public func fees(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getFees", completionHandler: completionHandler) - } - - /// Get current reward - public func reward(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getReward", completionHandler: completionHandler) - } - - /// Get current supply - public func supply(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getSupply", completionHandler: completionHandler) - } - - /// Get current height - public func height(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getHeight", completionHandler: completionHandler) - } - - /// Get current nethash - public func nethash(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getNethash", completionHandler: completionHandler) - } - - /// Get current milestone - public func milestone(completionHandler: @escaping (Response) -> Void) { - client.get(path: "blocks/getMilestone", completionHandler: completionHandler) - } -} diff --git a/Sources/API/Blocks/Models/BlockModel.swift b/Sources/API/Blocks/Models/BlockModel.swift index 2d4a281..f55c9d1 100644 --- a/Sources/API/Blocks/Models/BlockModel.swift +++ b/Sources/API/Blocks/Models/BlockModel.swift @@ -13,32 +13,44 @@ extension Blocks { public let id: String - public let version: Int + public let version: Int? + + public let height: Int public let timestamp: Int - public let height: Int + public let generatorAddress: String? - public let previousBlock: String + public let generatorPublicKey: String - public let numberOfTransactions: Int + public let payloadLength: Int? - public let totalAmount: Int + public let payloadHash: String? - public let totalFee: Int + public let blockSignature: String? - public let reward: Int + public let confirmations: Int? - public let payloadHash: String + public let previousBlockId: String? - public let generatorPublicKey: String + public let numberOfTransactions: Int - public let generatorId: String + public let totalAmount: String - public let blockSignature: String + public let totalFee: String - public let confirmations: Int + public let reward: String public let totalForged: String + + // MARK: - Hashable + + public static func == (lhs: BlockModel, rhs: BlockModel) -> Bool { + return lhs.id == rhs.id + } + + public var hashValue: Int { + return id.hashValue + } } } diff --git a/Sources/API/Blocks/Models/FeesModel.swift b/Sources/API/Blocks/Models/FeesModel.swift deleted file mode 100644 index 24da24c..0000000 --- a/Sources/API/Blocks/Models/FeesModel.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FeesModel.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct FeesModel: APIModel { - - public let send: Int - - public let vote: Int - - public let secondsignature: Int - - public let delegate: Int - - public let multisignature: Int - - public let dapp: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockFeeResponse.swift b/Sources/API/Blocks/Responses/BlockFeeResponse.swift deleted file mode 100644 index 2f77c6f..0000000 --- a/Sources/API/Blocks/Responses/BlockFeeResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockFeeResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct FeeResponse: APIResponse { - - public let success: Bool - - public let fee: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockFeesResponse.swift b/Sources/API/Blocks/Responses/BlockFeesResponse.swift deleted file mode 100644 index 2c12c55..0000000 --- a/Sources/API/Blocks/Responses/BlockFeesResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockFeesResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct FeesResponse: APIResponse { - - public let success: Bool - - public let fees: FeesModel - } -} diff --git a/Sources/API/Blocks/Responses/BlockHeightResponse.swift b/Sources/API/Blocks/Responses/BlockHeightResponse.swift deleted file mode 100644 index 9b93000..0000000 --- a/Sources/API/Blocks/Responses/BlockHeightResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockHeightResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct HeightResponse: APIResponse { - - public let success: Bool - - public let height: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockMilestoneResponse.swift b/Sources/API/Blocks/Responses/BlockMilestoneResponse.swift deleted file mode 100644 index 32f401d..0000000 --- a/Sources/API/Blocks/Responses/BlockMilestoneResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockMilestoneResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct MilestoneResponse: APIResponse { - - public let success: Bool - - public let milestone: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockNethashResponse.swift b/Sources/API/Blocks/Responses/BlockNethashResponse.swift deleted file mode 100644 index 82286eb..0000000 --- a/Sources/API/Blocks/Responses/BlockNethashResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockNethashResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct NethashResponse: APIResponse { - - public let success: Bool - - public let nethash: String - } -} diff --git a/Sources/API/Blocks/Responses/BlockResponse.swift b/Sources/API/Blocks/Responses/BlockResponse.swift deleted file mode 100644 index 468acab..0000000 --- a/Sources/API/Blocks/Responses/BlockResponse.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// BlockResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct BlockResponse: APIResponse { - - public let success: Bool - - public let block: BlockModel - } - - public struct BlocksResponse: APIResponse { - - public let success: Bool - - public let blocks: [BlockModel] - } -} diff --git a/Sources/API/Blocks/Responses/BlockRewardResponse.swift b/Sources/API/Blocks/Responses/BlockRewardResponse.swift deleted file mode 100644 index 2f155c7..0000000 --- a/Sources/API/Blocks/Responses/BlockRewardResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockRewardResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct RewardResponse: APIResponse { - - public let success: Bool - - public let reward: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockStatusResponse.swift b/Sources/API/Blocks/Responses/BlockStatusResponse.swift deleted file mode 100644 index 1c3213b..0000000 --- a/Sources/API/Blocks/Responses/BlockStatusResponse.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// BlockStatusResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct StatusResponse: APIResponse { - - public let success: Bool - - public let height: Int - - public let fee: Int - - public let milestone: Int - - public let reward: Int - - public let supply: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlockSupplyResponse.swift b/Sources/API/Blocks/Responses/BlockSupplyResponse.swift deleted file mode 100644 index 4eafbba..0000000 --- a/Sources/API/Blocks/Responses/BlockSupplyResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BlockSupplyResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/9/18. -// - -import Foundation - -extension Blocks { - - public struct SupplyResponse: APIResponse { - - public let success: Bool - - public let supply: Int - } -} diff --git a/Sources/API/Blocks/Responses/BlocksResponse.swift b/Sources/API/Blocks/Responses/BlocksResponse.swift new file mode 100644 index 0000000..df4bcda --- /dev/null +++ b/Sources/API/Blocks/Responses/BlocksResponse.swift @@ -0,0 +1,16 @@ +// +// BlocksResponse.swift +// Lisk +// +// Created by Andrew Barba on 1/9/18. +// + +import Foundation + +extension Blocks { + + public struct BlocksResponse: APIResponse { + + public let data: [BlockModel] + } +} diff --git a/Sources/API/Dapps/Dapps.swift b/Sources/API/Dapps/Dapps.swift new file mode 100644 index 0000000..2717e7b --- /dev/null +++ b/Sources/API/Dapps/Dapps.swift @@ -0,0 +1,36 @@ +// +// Dapps.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +public struct Dapps: APIService { + + /// Client used to send requests + public let client: APIClient + + /// Init + public init(client: APIClient = .shared) { + self.client = client + } +} + +// MARK: - List + +extension Dapps { + + /// List Dapps + public func blocks(transactionId: String? = nil, name: Int? = nil, limit: Int? = nil, offset: Int? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { + var options: RequestOptions = [:] + if let value = transactionId { options["transactionId"] = value } + if let value = name { options["name"] = value } + if let value = limit { options["limit"] = value } + if let value = offset { options["offset"] = value } + if let value = sort?.value { options["sort"] = value } + + client.get(path: "dapps", options: options, completionHandler: completionHandler) + } +} diff --git a/Sources/API/Dapps/Models/DappModel.swift b/Sources/API/Dapps/Models/DappModel.swift new file mode 100644 index 0000000..7544c38 --- /dev/null +++ b/Sources/API/Dapps/Models/DappModel.swift @@ -0,0 +1,40 @@ +// +// DappModel.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Dapps { + + public struct DappModel: APIModel { + + public let transactionId: String + + public let icon: String? + + public let category: Int? + + public let type: Int + + public let link: String? + + public let tags: String? + + public let description: String? + + public let name: String + + // MARK: - Hashable + + public static func == (lhs: DappModel, rhs: DappModel) -> Bool { + return lhs.name == rhs.name + } + + public var hashValue: Int { + return name.hashValue + } + } +} diff --git a/Sources/API/Dapps/Responses/DappsResponse.swift b/Sources/API/Dapps/Responses/DappsResponse.swift new file mode 100644 index 0000000..156320b --- /dev/null +++ b/Sources/API/Dapps/Responses/DappsResponse.swift @@ -0,0 +1,16 @@ +// +// DappsResponse.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Dapps { + + public struct DappsResponse: APIResponse { + + public let data: [DappModel] + } +} diff --git a/Sources/API/Delegates/Delegates.swift b/Sources/API/Delegates/Delegates.swift index 6082a1b..51bd96e 100644 --- a/Sources/API/Delegates/Delegates.swift +++ b/Sources/API/Delegates/Delegates.swift @@ -3,12 +3,10 @@ // Lisk // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation -/// Delegates - https://docs.lisk.io/docs/lisk-api-080-delegates public struct Delegates: APIService { /// Client used to send requests @@ -20,83 +18,22 @@ public struct Delegates: APIService { } } -// MARK: - Get - -extension Delegates { - - /// Get a delegate by username - public func delegate(username: String, completionHandler: @escaping (Response) -> Void) { - let options = ["username": username] - client.get(path: "delegates/get", options: options, completionHandler: completionHandler) - } - - /// Get a delegate by public key - public func delegate(publicKey: String, completionHandler: @escaping (Response) -> Void) { - let options = ["publicKey": publicKey] - client.get(path: "delegates/get", options: options, completionHandler: completionHandler) - } -} - // MARK: - List extension Delegates { /// List delegate objects - /// - /// - Parameters: - /// - limit: limit number of returned transactions - /// - offset: used for paging, offset by certain number of transactions - /// - orderBy: sort results by a column and direction - public func delegates(limit: UInt? = nil, offset: UInt? = nil, orderBy: OrderBy? = nil, completionHandler: @escaping (Response) -> Void) { + public func delegates(address: String? = nil, publicKey: String? = nil, secondPublicKey: String? = nil, username: String? = nil, search: String? = nil, limit: UInt? = nil, offset: UInt? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { var options: RequestOptions = [:] + if let value = address { options["address"] = value } + if let value = publicKey { options["publicKey"] = value } + if let value = secondPublicKey { options["secondPublicKey"] = value } + if let value = username { options["username"] = value } + if let value = search { options["search"] = value } if let value = limit { options["limit"] = value } if let value = offset { options["offset"] = value } - if let value = orderBy { options["orderBy"] = "\(value.column):\(value.direction.rawValue)" } + if let value = sort?.value { options["sort"] = value } client.get(path: "delegates", options: options, completionHandler: completionHandler) } - - /// Search for a delegate - /// - /// - Parameters: - /// - query: Query string to search for - /// - orderBy: sort results by a column and direction - public func search(query: String, orderBy: OrderBy? = nil, completionHandler: @escaping (Response) -> Void) { - var options: RequestOptions = ["q": query] - if let value = orderBy { options["orderBy"] = "\(value.column):\(value.direction.rawValue)" } - - client.get(path: "delegates/search", options: options, completionHandler: completionHandler) - } -} - -// MARK: - Votes - -extension Delegates { - - /// List which delegates and account is currently voting for - public func votes(address: String, completionHandler: @escaping (Response) -> Void) { - let options = ["address": address] - client.get(path: "accounts/delegates", options: options, completionHandler: completionHandler) - } -} - -// MARK: - Voters - -extension Delegates { - - /// List accounts who voted for the given delegate (public key) - public func voters(publicKey: String, completionHandler: @escaping (Response) -> Void) { - let options = ["publicKey": publicKey] - client.get(path: "delegates/voters", options: options, completionHandler: completionHandler) - } -} - -// MARK: - Count - -extension Delegates { - - /// Returns number of active delegates - public func count(completionHandler: @escaping (Response) -> Void) { - client.get(path: "delegates/count", completionHandler: completionHandler) - } } diff --git a/Sources/API/Delegates/Models/DelegateModel.swift b/Sources/API/Delegates/Models/DelegateModel.swift index 44830f1..5562bed 100644 --- a/Sources/API/Delegates/Models/DelegateModel.swift +++ b/Sources/API/Delegates/Models/DelegateModel.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -14,20 +13,30 @@ extension Delegates { public let username: String - public let address: String + public let vote: String - public let publicKey: String + public let rewards: String? - public let vote: String + public let producedblocks: Int? + + public let missedblocks: Int? + + public let rate: Int? + + public let approval: Double? - public let producedblocks: UInt64 + public let productivity: Double? - public let missedblocks: UInt64 + public let rank: Int? - public let rank: UInt64 + // MARK: - Hashable - public let approval: Double + public static func == (lhs: DelegateModel, rhs: DelegateModel) -> Bool { + return lhs.username == rhs.username + } - public let productivity: Double + public var hashValue: Int { + return username.hashValue + } } } diff --git a/Sources/API/Delegates/Models/VoterModel.swift b/Sources/API/Delegates/Models/VoterModel.swift deleted file mode 100644 index 3486edd..0000000 --- a/Sources/API/Delegates/Models/VoterModel.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// VoterModel.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -extension Delegates { - - public struct VoterModel: APIModel { - - public let username: String? - - public let address: String - - public let publicKey: String - - public let balance: String - } -} diff --git a/Sources/API/Delegates/Responses/DelegateCountResponse.swift b/Sources/API/Delegates/Responses/DelegateCountResponse.swift deleted file mode 100644 index 597b68c..0000000 --- a/Sources/API/Delegates/Responses/DelegateCountResponse.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// DelegateCountResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-delegates#section-get-delegates-count -extension Delegates { - - public struct CountResponse: APIResponse { - - public let success: Bool - - public let count: UInt64 - } -} diff --git a/Sources/API/Delegates/Responses/DelegateResponse.swift b/Sources/API/Delegates/Responses/DelegateResponse.swift deleted file mode 100644 index b9b6a01..0000000 --- a/Sources/API/Delegates/Responses/DelegateResponse.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// DelegateResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-transactions#section-get-delegate -extension Delegates { - - public struct DelegateResponse: APIResponse { - - public let success: Bool - - public let delegate: DelegateModel - } - - public struct DelegatesResponse: APIResponse { - - public let success: Bool - - public let delegates: [DelegateModel] - } -} diff --git a/Sources/API/Delegates/Responses/DelegateVotersResponse.swift b/Sources/API/Delegates/Responses/DelegateVotersResponse.swift deleted file mode 100644 index 1090579..0000000 --- a/Sources/API/Delegates/Responses/DelegateVotersResponse.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// DelegateVotersResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-delegates#section-get-voters -extension Delegates { - - public struct VotersResponse: APIResponse { - - public let success: Bool - - public let accounts: [VoterModel] - } -} diff --git a/Sources/API/Delegates/Responses/DelegatesResponse.swift b/Sources/API/Delegates/Responses/DelegatesResponse.swift new file mode 100644 index 0000000..72bf1e2 --- /dev/null +++ b/Sources/API/Delegates/Responses/DelegatesResponse.swift @@ -0,0 +1,16 @@ +// +// DelegateResponse.swift +// Lisk +// +// Created by Andrew Barba on 1/8/18. +// + +import Foundation + +extension Delegates { + + public struct DelegatesResponse: APIResponse { + + public let data: [DelegateModel] + } +} diff --git a/Sources/API/Loader/Loader.swift b/Sources/API/Loader/Loader.swift deleted file mode 100644 index 2d5dafe..0000000 --- a/Sources/API/Loader/Loader.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// Loader.swift -// Lisk -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// Loader - https://docs.lisk.io/docs/lisk-api-080-loader -public struct Loader: APIService { - - /// Client used to send requests - public let client: APIClient - - /// Init - public init(client: APIClient = .shared) { - self.client = client - } -} - -// MARK: - Status - -extension Loader { - - /// Retrieve the status of a Lisk Node - /// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-loading-status - public func status(completionHandler: @escaping (Response) -> Void) { - client.get(path: "loader/status", completionHandler: completionHandler) - } -} - -// MARK: - Sync - -extension Loader { - - /// Retrieve the sync status of a Lisk Node - /// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-synchronization-status - public func syncStatus(completionHandler: @escaping (Response) -> Void) { - client.get(path: "loader/status/sync", completionHandler: completionHandler) - } -} - -// MARK: - Ping - -extension Loader { - - /// Retrieve the ping status of a Lisk Node - /// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-block-receipt-status - public func pingStatus(completionHandler: @escaping (Response) -> Void) { - client.get(path: "loader/status/ping", completionHandler: completionHandler) - } -} diff --git a/Sources/API/Loader/Responses/LoaderStatusPingResponse.swift b/Sources/API/Loader/Responses/LoaderStatusPingResponse.swift deleted file mode 100644 index 581ed2e..0000000 --- a/Sources/API/Loader/Responses/LoaderStatusPingResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// LoaderStatusPingResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-block-receipt-status -extension Loader { - - public struct StatusPingResponse: APIResponse { - - public let success: Bool - } -} diff --git a/Sources/API/Loader/Responses/LoaderStatusResponse.swift b/Sources/API/Loader/Responses/LoaderStatusResponse.swift deleted file mode 100644 index 2465b72..0000000 --- a/Sources/API/Loader/Responses/LoaderStatusResponse.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// LoaderStatusResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-loading-status -extension Loader { - - public struct StatusResponse: APIResponse { - - public let success: Bool - - public let loaded: Bool - - public let now: UInt64 - - public let blocksCount: UInt64 - } -} diff --git a/Sources/API/Loader/Responses/LoaderStatusSyncResponse.swift b/Sources/API/Loader/Responses/LoaderStatusSyncResponse.swift deleted file mode 100644 index f4b02f6..0000000 --- a/Sources/API/Loader/Responses/LoaderStatusSyncResponse.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// LoaderStatusSyncResponse.swift -// Lisk -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-loader#section-get-synchronization-status -extension Loader { - - public struct StatusSyncResponse: APIResponse { - - public let success: Bool - - public let syncing: Bool - - public let blocks: UInt64 - - public let height: UInt64 - - public let broadhash: String - - public let consensus: UInt64 - } -} diff --git a/Sources/API/Node/Models/NodeConstantsModel.swift b/Sources/API/Node/Models/NodeConstantsModel.swift new file mode 100644 index 0000000..e5ea260 --- /dev/null +++ b/Sources/API/Node/Models/NodeConstantsModel.swift @@ -0,0 +1,55 @@ +// +// NodeConstantsModel.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Node { + + public struct NodeConstantsModel: APIModel { + + public let epoch: String + + public let milestone: String + + public let build: String + + public let commit: String + + public let version: String + + public let nethash: String + + public let supply: String + + public let reward: String + + public let nonce: String + + public let fees: NodeConstantsFeesModel + } + + public struct NodeConstantsFeesModel: APIModel { + + public let send: String + + public let vote: String + + public let secondSignature: String + + public let delegate: String + + public let multisignature: String + + public let dappRegistration: String + + public let dappWithdrawal: String + + public let dappDeposit: String + + public let data: String + } +} diff --git a/Sources/API/Node/Models/NodeStatusModel.swift b/Sources/API/Node/Models/NodeStatusModel.swift new file mode 100644 index 0000000..519817a --- /dev/null +++ b/Sources/API/Node/Models/NodeStatusModel.swift @@ -0,0 +1,41 @@ +// +// NodeStatusModel.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Node { + + public struct NodeStatusModel: APIModel { + + public let broadhash: String + + public let consensus: Int + + public let height: Int + + public let loaded: Bool + + public let networkHeight: Int + + public let syncing: Bool + + public let transactions: NodeStatusTransactionsModel + } + + public struct NodeStatusTransactionsModel: APIModel { + + public let unconfirmed: Int + + public let unsigned: Int + + public let unprocessed: Int + + public let confirmed: Int + + public let total: Int + } +} diff --git a/Sources/API/Node/Node.swift b/Sources/API/Node/Node.swift new file mode 100644 index 0000000..69a28a6 --- /dev/null +++ b/Sources/API/Node/Node.swift @@ -0,0 +1,39 @@ +// +// Node.swift +// Lisk +// +// Created by Andrew Barba on 12/27/17. +// + +import Foundation + +public struct Node: APIService { + + /// Client used to send requests + public let client: APIClient + + /// Init + public init(client: APIClient = .shared) { + self.client = client + } +} + +// MARK: - Constants + +extension Node { + + /// Retrieve the constants of a Lisk Node + public func constants(completionHandler: @escaping (Response) -> Void) { + client.get(path: "node/constants", completionHandler: completionHandler) + } +} + +// MARK: - Status + +extension Node { + + /// Retrieve the status of a Lisk Node + public func status(completionHandler: @escaping (Response) -> Void) { + client.get(path: "node/status", completionHandler: completionHandler) + } +} diff --git a/Sources/API/Node/Responses/NodeConstantsResponse.swift b/Sources/API/Node/Responses/NodeConstantsResponse.swift new file mode 100644 index 0000000..f852204 --- /dev/null +++ b/Sources/API/Node/Responses/NodeConstantsResponse.swift @@ -0,0 +1,17 @@ +// +// NodeConstantsResponse.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Node { + + public struct NodeConstantsResponse: APIResponse { + + public let data: NodeStatusModel + } +} + diff --git a/Sources/API/Node/Responses/NodeStatusResponse.swift b/Sources/API/Node/Responses/NodeStatusResponse.swift new file mode 100644 index 0000000..4fc5151 --- /dev/null +++ b/Sources/API/Node/Responses/NodeStatusResponse.swift @@ -0,0 +1,16 @@ +// +// NodeStatusResponse.swift +// Lisk +// +// Created by Andrew Barba on 12/27/17. +// + +import Foundation + +extension Node { + + public struct NodeStatusResponse: APIResponse { + + public let data: NodeStatusModel + } +} diff --git a/Sources/API/Peers/Models/PeerModel.swift b/Sources/API/Peers/Models/PeerModel.swift index df0296f..93e1942 100644 --- a/Sources/API/Peers/Models/PeerModel.swift +++ b/Sources/API/Peers/Models/PeerModel.swift @@ -19,20 +19,30 @@ extension Peers { public let ip: String - public let port: UInt64 + public let httpPort: Int? + + public let wsPort: Int? + + public let os: String? + + public let version: String? public let state: State - public let os: String + public let height: Int? - public let version: String + public let broadhash: String? - public let broadhash: String + public let nonce: String? - public let height: UInt64 + // MARK: - Hashable - public let updated: Double + public static func == (lhs: PeerModel, rhs: PeerModel) -> Bool { + return lhs.ip == rhs.ip + } - public let nonce: String + public var hashValue: Int { + return ip.hashValue + } } } diff --git a/Sources/API/Peers/Peers.swift b/Sources/API/Peers/Peers.swift index aae55fb..88c4cb6 100644 --- a/Sources/API/Peers/Peers.swift +++ b/Sources/API/Peers/Peers.swift @@ -7,7 +7,6 @@ import Foundation -/// Peers - https://docs.lisk.io/docs/lisk-api-080-peers public struct Peers: APIService { /// Client used to send requests @@ -19,50 +18,22 @@ public struct Peers: APIService { } } -// MARK: - Get - -extension Peers { - - /// Get a peer by ip and port - public func peer(ip: String, port: Int, completionHandler: @escaping (Response) -> Void) { - let options: RequestOptions = ["ip": ip, "port": port] - client.get(path: "peers/get", options: options, completionHandler: completionHandler) - } -} - // MARK: - List extension Peers { /// List peers - /// - /// - Parameters: - /// - state: state of peer - /// - version: version of peer - /// - os: os of peer - /// - limit: limit number of returned transactions - /// - offset: used for paging, offset by certain number of transactions - /// - orderBy: sort results by a column and direction - /// - join: defaults to 'or', specify 'and' for an AND join of passed in parameters - public func peers(state: PeerModel.State? = nil, version: String? = nil, os: String? = nil, limit: UInt? = nil, offset: UInt? = nil, orderBy: OrderBy? = nil, join: PropertyJoin = .or, completionHandler: @escaping (Response) -> Void) { + public func peers(ip: String? = nil, state: PeerModel.State? = nil, version: String? = nil, os: String? = nil, height: Int? = nil, limit: UInt? = nil, offset: UInt? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { var options: RequestOptions = [:] - if let value = state { options["\(join.rawValue)state"] = value.rawValue } - if let value = version { options["\(join.rawValue)version"] = value } - if let value = os { options["\(join.rawValue)os"] = value } + if let value = ip { options["ip"] = value } + if let value = state?.rawValue { options["state"] = value } + if let value = version { options["version"] = value } + if let value = os { options["os"] = value } + if let value = height { options["height"] = value } if let value = limit { options["limit"] = value } if let value = offset { options["offset"] = value } - if let value = orderBy { options["orderBy"] = "\(value.column):\(value.direction.rawValue)" } + if let value = sort?.value { options["sort"] = value } client.get(path: "peers", options: options, completionHandler: completionHandler) } } - -// MARK: - Version - -extension Peers { - - /// Returns current nodes version and build - public func version(completionHandler: @escaping (Response) -> Void) { - client.get(path: "peers/version", completionHandler: completionHandler) - } -} diff --git a/Sources/API/Peers/Responses/PeerResponse.swift b/Sources/API/Peers/Responses/PeerResponse.swift deleted file mode 100644 index 6e70ee6..0000000 --- a/Sources/API/Peers/Responses/PeerResponse.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// PeerResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-peers#section-get-peer -extension Peers { - - public struct PeerResponse: APIResponse { - - public let success: Bool - - public let peer: PeerModel - } - - public struct PeersResponse: APIResponse { - - public let success: Bool - - public let peers: [PeerModel] - } -} diff --git a/Sources/API/Peers/Responses/PeerVersionResponse.swift b/Sources/API/Peers/Responses/PeerVersionResponse.swift deleted file mode 100644 index 331ebdb..0000000 --- a/Sources/API/Peers/Responses/PeerVersionResponse.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// PeerVersionResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/8/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-peers#section-get-peer-version-build-time -extension Peers { - - public struct VersionResponse: APIResponse { - - public let success: Bool - - public let version: String - - public let build: String - } -} - diff --git a/Sources/API/Peers/Responses/PeersResponse.swift b/Sources/API/Peers/Responses/PeersResponse.swift new file mode 100644 index 0000000..ec7d07f --- /dev/null +++ b/Sources/API/Peers/Responses/PeersResponse.swift @@ -0,0 +1,16 @@ +// +// PeerResponse.swift +// Lisk +// +// Created by Andrew Barba on 1/8/18. +// + +import Foundation + +extension Peers { + + public struct PeersResponse: APIResponse { + + public let data: [PeerModel] + } +} diff --git a/Sources/API/Signatures/Models/SignatureModel.swift b/Sources/API/Signatures/Models/SignatureModel.swift new file mode 100644 index 0000000..ede7fb6 --- /dev/null +++ b/Sources/API/Signatures/Models/SignatureModel.swift @@ -0,0 +1,20 @@ +// +// SignatureModel.swift +// Lisk +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +extension Signatures { + + public struct SignatureModel: APIModel { + + public let transactionId: String + + public let publicKey: String + + public let signature: String + } +} diff --git a/Sources/API/Signatures/Responses/SignatureBroadcastResponse.swift b/Sources/API/Signatures/Responses/SignatureBroadcastResponse.swift new file mode 100644 index 0000000..c62f894 --- /dev/null +++ b/Sources/API/Signatures/Responses/SignatureBroadcastResponse.swift @@ -0,0 +1,16 @@ +// +// SignatureBroadcastResponse.swift +// Lisk +// +// Created by Andrew Barba on 1/10/18. +// + +import Foundation + +extension Signatures { + + public struct SignatureBroadcastResponse: APIResponse { + + public let data: APIMessageModel + } +} diff --git a/Sources/API/Signatures/Responses/SignatureFeeResponse.swift b/Sources/API/Signatures/Responses/SignatureFeeResponse.swift deleted file mode 100644 index 9b13bf8..0000000 --- a/Sources/API/Signatures/Responses/SignatureFeeResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// SignatureFeeResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/10/18. -// - -import Foundation - -extension Signatures { - - public struct FeeResponse: APIResponse { - - public let success: Bool - - public let fee: Int - } -} diff --git a/Sources/API/Signatures/Signatures.swift b/Sources/API/Signatures/Signatures.swift index 6c9a1e7..4ea4c39 100644 --- a/Sources/API/Signatures/Signatures.swift +++ b/Sources/API/Signatures/Signatures.swift @@ -7,7 +7,6 @@ import Foundation -/// Signatures - https://docs.lisk.io/docs/lisk-api-080-signatures public struct Signatures: APIService { /// Client used to send requests @@ -19,31 +18,20 @@ public struct Signatures: APIService { } } -// MARK: - Register +// MARK: - Submit extension Signatures { - public func register(secondSecret: String, secret: String, completionHandler: @escaping (Response) -> Void) { - do { - let (publicKey, _) = try Crypto.keys(fromSecret: secondSecret) - let asset = ["signature": ["publicKey": publicKey]] - let transaction = LocalTransaction(.registerSecondPassphrase, amount: 0, asset: asset) - let signedTransaction = try transaction.signed(secret: secret, secondSecret: nil) - print(signedTransaction) - Transactions().broadcast(signedTransaction: signedTransaction, completionHandler: completionHandler) - } catch { - let response = APIResponseError(message: error.localizedDescription) - completionHandler(.error(response: response)) - } - } -} - -// MARK: - Fee - -extension Signatures { - - /// Get fee for registering second passphrase - public func fee(completionHandler: @escaping (Response) -> Void) { - client.get(path: "signatures/fee", completionHandler: completionHandler) + /// Submits a sognature to the network + public func submit(signature: SignatureModel, completionHandler: @escaping (Response) -> Void) { + let options: RequestOptions = [ + "signature": [ + "transactionId": signature.transactionId, + "publicKey": signature.publicKey, + "signature": signature.signature + ] + ] + + client.post(path: "signatures", options: options, completionHandler: completionHandler) } } diff --git a/Sources/API/Transactions/LocalTransaction.swift b/Sources/API/Transactions/LocalTransaction.swift index fbd9d15..5c0bac0 100644 --- a/Sources/API/Transactions/LocalTransaction.swift +++ b/Sources/API/Transactions/LocalTransaction.swift @@ -89,23 +89,11 @@ public struct LocalTransaction { } /// Returns a new signed transaction based on this transaction - public func signed(keyPair: KeyPair, secondKeyPair: KeyPair? = nil) throws -> LocalTransaction { - var transaction = LocalTransaction(transaction: self) - transaction.senderPublicKey = keyPair.publicKeyString - transaction.signature = LocalTransaction.generateSignature(bytes: transaction.bytes, keyPair: keyPair) - if let secondKeyPair = secondKeyPair, transaction.type != .registerSecondPassphrase { - transaction.signSignature = LocalTransaction.generateSignature(bytes: transaction.bytes, keyPair: secondKeyPair) - } - transaction.id = LocalTransaction.generateId(bytes: transaction.bytes) - return transaction - } - - /// Returns a new signed transaction based on this transaction - public func signed(secret: String, secondSecret: String? = nil) throws -> LocalTransaction { - let keyPair = try Crypto.keyPair(fromSecret: secret) + public func signed(passphrase: String, secondPassphrase: String? = nil) throws -> LocalTransaction { + let keyPair = try Crypto.keyPair(fromPassphrase: passphrase) let secondKeyPair: KeyPair? - if let secondSecret = secondSecret { - secondKeyPair = try Crypto.keyPair(fromSecret: secondSecret) + if let secondPassphrase = secondPassphrase { + secondKeyPair = try Crypto.keyPair(fromPassphrase: secondPassphrase) } else { secondKeyPair = nil } @@ -113,17 +101,29 @@ public struct LocalTransaction { } /// Signs the current transaction - public mutating func sign(keyPair: KeyPair, secondKeyPair: KeyPair? = nil) throws { - let transaction = try signed(keyPair: keyPair, secondKeyPair: secondKeyPair) + public mutating func sign(passphrase: String, secondPassphrase: String? = nil) throws { + let transaction = try signed(passphrase: passphrase, secondPassphrase: secondPassphrase) self.id = transaction.id self.senderPublicKey = transaction.senderPublicKey self.signature = transaction.signature self.signSignature = transaction.signSignature } + /// Returns a new signed transaction based on this transaction + private func signed(keyPair: KeyPair, secondKeyPair: KeyPair? = nil) throws -> LocalTransaction { + var transaction = LocalTransaction(transaction: self) + transaction.senderPublicKey = keyPair.publicKeyString + transaction.signature = LocalTransaction.generateSignature(bytes: transaction.bytes, keyPair: keyPair) + if let secondKeyPair = secondKeyPair, transaction.type != .registerSecondPassphrase { + transaction.signSignature = LocalTransaction.generateSignature(bytes: transaction.bytes, keyPair: secondKeyPair) + } + transaction.id = LocalTransaction.generateId(bytes: transaction.bytes) + return transaction + } + /// Signs the current transaction - public mutating func sign(secret: String, secondSecret: String? = nil) throws { - let transaction = try signed(secret: secret, secondSecret: secondSecret) + private mutating func sign(keyPair: KeyPair, secondKeyPair: KeyPair? = nil) throws { + let transaction = try signed(keyPair: keyPair, secondKeyPair: secondKeyPair) self.id = transaction.id self.senderPublicKey = transaction.senderPublicKey self.signature = transaction.signature diff --git a/Sources/API/Transactions/Models/TransactionModel.swift b/Sources/API/Transactions/Models/TransactionModel.swift index d0d32d1..ee05004 100644 --- a/Sources/API/Transactions/Models/TransactionModel.swift +++ b/Sources/API/Transactions/Models/TransactionModel.swift @@ -36,5 +36,15 @@ extension Transactions { public let signature: String public let confirmations: UInt64 + + // MARK: - Hashable + + public static func == (lhs: TransactionModel, rhs: TransactionModel) -> Bool { + return lhs.id == rhs.id + } + + public var hashValue: Int { + return id.hashValue + } } } diff --git a/Sources/API/Transactions/Responses/TransactionBroadcastResponse.swift b/Sources/API/Transactions/Responses/TransactionBroadcastResponse.swift index c9fab41..d2ca28e 100644 --- a/Sources/API/Transactions/Responses/TransactionBroadcastResponse.swift +++ b/Sources/API/Transactions/Responses/TransactionBroadcastResponse.swift @@ -9,10 +9,8 @@ import Foundation extension Transactions { - public struct BroadcastResponse: APIResponse { + public struct TransactionBroadcastResponse: APIResponse { - public let success: Bool - - public let transactionId: String + public let data: APIMessageModel } } diff --git a/Sources/API/Transactions/Responses/TransactionResponse.swift b/Sources/API/Transactions/Responses/TransactionResponse.swift deleted file mode 100644 index b9125ee..0000000 --- a/Sources/API/Transactions/Responses/TransactionResponse.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// TransactionResponse.swift -// Lisk -// -// Created by Andrew Barba on 1/2/18. -// - -import Foundation - -/// https://docs.lisk.io/docs/lisk-api-080-transactions#section-get-transaction -extension Transactions { - - public struct TransactionResponse: APIResponse { - - public let success: Bool - - public let transaction: TransactionModel - } - - public struct TransactionsResponse: APIResponse { - - public let success: Bool - - public let transactions: [TransactionModel] - } -} diff --git a/Sources/API/Transactions/Responses/TransactionsResponse.swift b/Sources/API/Transactions/Responses/TransactionsResponse.swift new file mode 100644 index 0000000..d122618 --- /dev/null +++ b/Sources/API/Transactions/Responses/TransactionsResponse.swift @@ -0,0 +1,16 @@ +// +// TransactionResponse.swift +// Lisk +// +// Created by Andrew Barba on 1/2/18. +// + +import Foundation + +extension Transactions { + + public struct TransactionsResponse: APIResponse { + + public let data: [TransactionModel] + } +} diff --git a/Sources/API/Transactions/Transactions.swift b/Sources/API/Transactions/Transactions.swift index d533614..42343a8 100644 --- a/Sources/API/Transactions/Transactions.swift +++ b/Sources/API/Transactions/Transactions.swift @@ -31,19 +31,22 @@ public struct Transactions: APIService { } } -// MARK: - Broadcast +// MARK: - Submit extension Transactions { - /// Broadcasts a locally signed transaction to the network - public func broadcast(signedTransaction: LocalTransaction, completionHandler: @escaping (Response) -> Void) { + /// Submit a signed transaction to the network + public func submit(signedTransaction: LocalTransaction, completionHandler: @escaping (Response) -> Void) { guard signedTransaction.isSigned else { - let response = APIResponseError(message: "Invalid Transaction - Transaction has not been signed") + let response = APIError(message: "Invalid Transaction - Transaction has not been signed") return completionHandler(.error(response: response)) } - let options = ["transaction": signedTransaction.requestOptions] - let path = client.baseURL.absoluteString.replacingOccurrences(of: "/api", with: "/peer") - client.post(path: "\(path)/transactions", options: options, completionHandler: completionHandler) + + let options: RequestOptions = [ + "transaction": signedTransaction.requestOptions + ] + + client.post(path: "transactions", options: options, completionHandler: completionHandler) } } @@ -52,38 +55,34 @@ extension Transactions { extension Transactions { /// Transfer LSK to a Lisk address using Local Signing - public func transfer(lsk: Double, to recipient: String, secret: String, secondSecret: String? = nil, completionHandler: @escaping (Response) -> Void) { + public func transfer(lsk: Double, to recipient: String, passphrase: String, secondPassphrase: String? = nil, completionHandler: @escaping (Response) -> Void) { do { let transaction = LocalTransaction(.transfer, lsk: lsk, recipientId: recipient) - let signedTransaction = try transaction.signed(secret: secret, secondSecret: secondSecret) - broadcast(signedTransaction: signedTransaction, completionHandler: completionHandler) + let signedTransaction = try transaction.signed(passphrase: passphrase, secondPassphrase: secondPassphrase) + submit(signedTransaction: signedTransaction, completionHandler: completionHandler) } catch { - let response = APIResponseError(message: error.localizedDescription) + let response = APIError(message: error.localizedDescription) completionHandler(.error(response: response)) } } } -// MARK: - Get +// MARK: - Register Second Passphrase extension Transactions { - /// Get a transaction by id - public func transaction(id: String, completionHandler: @escaping (Response) -> Void) { - let options = ["id": id] - client.get(path: "transactions/get", options: options, completionHandler: completionHandler) - } - - /// Get an unconfirmed transaction by id - public func unconfirmedTransaction(id: String, completionHandler: @escaping (Response) -> Void) { - let options = ["id": id] - client.get(path: "transactions/unconfirmed/get", options: options, completionHandler: completionHandler) - } - - /// Get a queued transaction by id - public func queuedTransaction(id: String, completionHandler: @escaping (Response) -> Void) { - let options = ["id": id] - client.get(path: "transactions/queued/get", options: options, completionHandler: completionHandler) + /// Register a second passphrase + public func registerSecondPassphrase(_ secondPassphrase: String, passphrase: String, completionHandler: @escaping (Response) -> Void) { + do { + let (publicKey, _) = try Crypto.keys(fromPassphrase: secondPassphrase) + let asset = ["signature": ["publicKey": publicKey]] + let transaction = LocalTransaction(.registerSecondPassphrase, amount: 0, asset: asset) + let signedTransaction = try transaction.signed(passphrase: passphrase, secondPassphrase: nil) + submit(signedTransaction: signedTransaction, completionHandler: completionHandler) + } catch { + let response = APIError(message: error.localizedDescription) + completionHandler(.error(response: response)) + } } } @@ -92,34 +91,16 @@ extension Transactions { extension Transactions { /// List transaction objects - /// - /// - Parameters: - /// - block: transactions for this block - /// - sender: transactions from this sender - /// - recipient: transactions to this recipient - /// - limit: limit number of returned transactions - /// - offset: used for paging, offset by certain number of transactions - /// - orderBy: sort results by a column and direction - /// - join: defaults to 'or', specify 'and' for an AND join of passed in parameters - public func transactions(block: String? = nil, sender: String? = nil, recipient: String? = nil, limit: UInt? = nil, offset: UInt? = nil, orderBy: OrderBy? = nil, join: PropertyJoin = .or, completionHandler: @escaping (Response) -> Void) { + public func transactions(id: String? = nil, block: String? = nil, sender: String? = nil, recipient: String? = nil, limit: UInt? = nil, offset: UInt? = nil, sort: APIRequest.Sort? = nil, completionHandler: @escaping (Response) -> Void) { var options: RequestOptions = [:] - if let value = block { options["\(join.rawValue)blockId"] = value } - if let value = sender { options["\(join.rawValue)senderId"] = value } - if let value = recipient { options["\(join.rawValue)recipientId"] = value } + if let value = id { options["id"] = value } + if let value = block { options["blockId"] = value } + if let value = sender { options["senderId"] = value } + if let value = recipient { options["recipientId"] = value } if let value = limit { options["limit"] = value } if let value = offset { options["offset"] = value } - if let value = orderBy { options["orderBy"] = "\(value.column):\(value.direction.rawValue)" } + if let value = sort?.value { options["sort"] = value } client.get(path: "transactions", options: options, completionHandler: completionHandler) } - - /// List unconfirmed transactions - public func unconfirmedTransactions(completionHandler: @escaping (Response) -> Void) { - client.get(path: "transactions/unconfirmed", completionHandler: completionHandler) - } - - /// List queued transactions - public func queuedTransactions(completionHandler: @escaping (Response) -> Void) { - client.get(path: "transactions/queued", completionHandler: completionHandler) - } } diff --git a/Sources/Constants.swift b/Sources/Constants.swift index 0ccf1c0..4b0c4a5 100644 --- a/Sources/Constants.swift +++ b/Sources/Constants.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/26/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -12,7 +11,7 @@ import Foundation /// https://github.com/LiskHQ/lisk-js/blob/1.0.0/src/constants.js public struct Constants { - public static let version = "0.9.11" + public static let version = "1.0.0" public static let fixedPoint: Double = pow(10, 8) @@ -34,9 +33,9 @@ public struct Constants { public static let epoch: Date = Date(timeIntervalSince1970: epochSeconds) } - public struct Port { - public static let live: String = "8000" - public static let test: String = "7000" - public static let ssl: String = "443" + public struct Nethash { + public static let main = "ed14889723f24ecc54871d058d98ce91ff2f973192075c0155ba2b7b70ad2511" + public static let test = "da3ed6a45429278bac2666961289ca17ad86595d33b31037615d4b8e8f158bba" + public static let beta = "ef3844327d1fd0fc5785291806150c937797bdb34a748c9cd932b7e859e9ca0c" } } diff --git a/Sources/Core/APIClient.swift b/Sources/Core/APIClient.swift index b0ce8ad..2d95222 100644 --- a/Sources/Core/APIClient.swift +++ b/Sources/Core/APIClient.swift @@ -3,16 +3,14 @@ // Lisk // // Created by Andrew Barba on 12/26/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation - /// Represents an HTTP response -public enum Response { - case success(response: T) - case error(response: APIResponseError) +public enum Response { + case success(response: R) + case error(response: APIError) } /// Type to represent request body/url options @@ -38,40 +36,25 @@ public struct APIClient { public static let mainnet = APIClient() /// Client that connects to Testnet - public static let testnet = APIClient(options: .init(testnet: true)) - - // MARK: - Init + public static let testnet = APIClient(options: .testnet) - public init(options: APIOptions = .init()) { - let port: String = { - if options.ssl { return Constants.Port.ssl } - return options.testnet ? Constants.Port.test : Constants.Port.live - }() + /// Client that connects to Betanet + public static let betanet = APIClient(options: .betanet) - let hostname: String = { - if let node = options.node { return node.hostname } - let nodes = options.testnet ? APINode.testnet : APINode.mainnet - let node = options.randomNode ? APINode.random(from: nodes) : nodes[0] - return node.hostname - }() - - let nethash = options.testnet ? APINethash.testnet(port: port, nethash: options.nethash) : APINethash.mainnet(port: port, nethash: options.nethash) - - let scheme = options.ssl ? "https" : "http" + // MARK: - Init - let urlPath = "\(scheme)://\(hostname):\(port)/api" + public init(options: APIOptions = .mainnet) { // swiftlint:disable:next force_unwrapping - self.baseURL = URL(string: urlPath)! + self.baseURL = URL(string: "\(options.node.origin)/api")! self.headers = [ - "Content-Type": nethash.contentType, - "os": nethash.clientOS, - "version": nethash.version, - "minVersion": nethash.minVersion, - "port": nethash.port, - "nethash": nethash.nethash, - "broadhash": nethash.broadhash + "Accept": options.nethash.contentType, + "Content-Type": options.nethash.contentType, + "User-Agent": options.nethash.userAgent, + "nethash": options.nethash.nethash, + "version": options.nethash.version, + "minVersion": options.nethash.minVersion, ] } @@ -79,31 +62,31 @@ public struct APIClient { /// Perform GET request @discardableResult - public func get(path: String, options: RequestOptions? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { + public func get(path: String, options: Any? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { return request(.get, path: path, options: options, completionHandler: completionHandler) } /// Perform POST request @discardableResult - public func post(path: String, options: RequestOptions? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { + public func post(path: String, options: Any? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { return request(.post, path: path, options: options, completionHandler: completionHandler) } /// Perform PUT request @discardableResult - public func put(path: String, options: RequestOptions? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { + public func put(path: String, options: Any? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { return request(.put, path: path, options: options, completionHandler: completionHandler) } /// Perform POST request @discardableResult - public func delete(path: String, options: RequestOptions? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { + public func delete(path: String, options: Any? = nil, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { return request(.delete, path: path, options: options, completionHandler: completionHandler) } /// Perform request @discardableResult - public func request(_ httpMethod: HTTPMethod, path: String, options: RequestOptions?, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { + public func request(_ httpMethod: HTTPMethod, path: String, options: Any?, completionHandler: @escaping (Response) -> Void) -> (URLRequest, URLSessionDataTask) { let request = urlRequest(httpMethod, path: path, options: options) let task = dataTask(request, completionHandler: completionHandler) return (request, task) @@ -131,7 +114,7 @@ public struct APIClient { } /// Builds a URL request based on a given HTTP method and options - private func urlRequest(_ httpMethod: HTTPMethod, path: String, options: RequestOptions? = nil) -> URLRequest { + private func urlRequest(_ httpMethod: HTTPMethod, path: String, options: Any? = nil) -> URLRequest { // Build api url let url = path.contains("://") ? URL(string: path)! : baseURL.appendingPathComponent(path) @@ -160,33 +143,33 @@ public struct APIClient { } /// Converts a dict to url encoded query string - private func urlEncodedQueryString(_ options: RequestOptions) -> String { - let queryParts = options.flatMap { key, value in + private func urlEncodedQueryString(_ options: Any) -> String { + guard let options = options as? RequestOptions else { + return "" + } + + let queryParts: [String] = options.compactMap { key, value in guard let safeKey = key.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed), let safeValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { return nil } return "\(safeKey)=\(safeValue)" } + return queryParts.joined(separator: "&") } /// Process a response private func processRequestCompletion(_ data: Data?) -> Response { guard let data = data else { - return .error(response: defaultErrorResponse()) + return .error(response: .unexpected) } - guard let result = try? JSONDecoder().decode(R.self, from: data), result.success else { - let error = try? JSONDecoder().decode(APIResponseError.self, from: data) - return .error(response: error ?? defaultErrorResponse()) + guard let result = try? JSONDecoder().decode(R.self, from: data) else { + let error = try? JSONDecoder().decode(APIError.self, from: data) + return .error(response: error ?? .unknown) } return .success(response: result) } - - /// Default error response - private func defaultErrorResponse() -> APIResponseError { - return APIResponseError(message: "Unknown Error") - } } diff --git a/Sources/Core/APIError.swift b/Sources/Core/APIError.swift new file mode 100644 index 0000000..4e26780 --- /dev/null +++ b/Sources/Core/APIError.swift @@ -0,0 +1,44 @@ +// +// APIError.swift +// Lisk +// +// Created by Andrew Barba on 12/27/17. +// + +import Foundation + +/// Protocol describing an error +public struct APIError { + + public let message: String + + public init(message: String) { + self.message = message + } +} + +extension APIError: Decodable { + + private enum Keys: String, CodingKey { + case message + case error + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: Keys.self) + if let message = try? container.decode(String.self, forKey: .message) { + self.message = message + } else { + self.message = try container.decode(String.self, forKey: .error) + } + } +} + +extension APIError { + + /// Describes an unexpected error + public static let unexpected = APIError(message: "Unexpected Error") + + /// Describes an unknown error response + public static let unknown = APIError(message: "Unknown Error") +} diff --git a/Sources/Core/APIModel.swift b/Sources/Core/APIModel.swift index 4f9771a..542051e 100644 --- a/Sources/Core/APIModel.swift +++ b/Sources/Core/APIModel.swift @@ -8,6 +8,12 @@ import Foundation /// API model -public protocol APIModel: Decodable { +public protocol APIModel: Decodable, Hashable { } + +/// Common model for single message response +public struct APIMessageModel: APIModel { + + public let message: String +} diff --git a/Sources/Core/APINethash.swift b/Sources/Core/APINethash.swift index 2973fc6..d28b3a9 100644 --- a/Sources/Core/APINethash.swift +++ b/Sources/Core/APINethash.swift @@ -3,43 +3,68 @@ // Lisk // // Created by Andrew Barba on 12/26/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation -private let mainnetNethash = "ed14889723f24ecc54871d058d98ce91ff2f973192075c0155ba2b7b70ad2511" - -private let testnetNethash = "da3ed6a45429278bac2666961289ca17ad86595d33b31037615d4b8e8f158bba" - /// Nethash options that are sent as request headers public struct APINethash { + /// Nethash + public let nethash: String + + /// Current api version + public let version: String + + /// Minmimum supported api version + public let minVersion = ">=1.0.0" + /// HTTP content type public let contentType = "application/json" - /// Swift os - public let clientOS = "lisk-api-swift" + // User-Agent Header; see https://tools.ietf.org/html/rfc7231#section-5.5.3 + // Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0` + // Source: https://github.com/Alamofire/Alamofire/blob/7bef9405f1d589605f253147b8e6939261b0867c/Source/SessionManager.swift#L68 + public let userAgent: String = { + let liskSwiftVersion = "LiskSwift/\(Constants.version)" - /// Minmimum supported api version - public let minVersion = ">=0.5.0" + guard let info = Bundle.main.infoDictionary else { + return liskSwiftVersion + } - /// Current api version - public let version: String + let executable = info[kCFBundleExecutableKey as String] as? String ?? "Unknown" + let bundle = info[kCFBundleIdentifierKey as String] as? String ?? "Unknown" + let appVersion = info["CFBundleShortVersionString"] as? String ?? "Unknown" + let appBuild = info[kCFBundleVersionKey as String] as? String ?? "Unknown" - /// Port to connect to - public let port: String + let osNameVersion: String = { + let version = ProcessInfo.processInfo.operatingSystemVersion + let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" - /// Nethash - public let nethash: String + let osName: String = { + #if os(iOS) + return "iOS" + #elseif os(watchOS) + return "watchOS" + #elseif os(tvOS) + return "tvOS" + #elseif os(macOS) + return "OS X" + #elseif os(Linux) + return "Linux" + #else + return "Unknown" + #endif + }() - /// Broadhash - public let broadhash: String + return "\(osName) \(versionString)" + }() - private init(port: String, nethash: String, broadhash: String, version: String) { - self.port = port + return "\(executable)/\(appVersion) (\(bundle); build:\(appBuild); \(osNameVersion)) \(liskSwiftVersion)" + }() + + private init(nethash: String, version: String) { self.nethash = nethash - self.broadhash = broadhash self.version = version } } @@ -47,14 +72,11 @@ public struct APINethash { extension APINethash { /// Mainnet options - public static func mainnet(port: String, nethash: String? = nil) -> APINethash { - let version = nethash == nil ? Constants.version : "0.0.0a" - return .init(port: port, nethash: nethash ?? mainnetNethash, broadhash: mainnetNethash, version: version) - } + public static let mainnet: APINethash = .init(nethash: Constants.Nethash.main, version: Constants.version) /// Testnet options - public static func testnet(port: String, nethash: String? = nil) -> APINethash { - let version = nethash == nil ? Constants.version : "0.0.0a" - return .init(port: port, nethash: nethash ?? testnetNethash, broadhash: testnetNethash, version: version) - } + public static let testnet: APINethash = .init(nethash: Constants.Nethash.test, version: Constants.version) + + /// Betanet options + public static let betanet: APINethash = .init(nethash: Constants.Nethash.beta, version: Constants.version) } diff --git a/Sources/Core/APINode.swift b/Sources/Core/APINode.swift index b842c8f..a669bb2 100644 --- a/Sources/Core/APINode.swift +++ b/Sources/Core/APINode.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/26/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -11,39 +10,45 @@ import Foundation /// Represents a Lisk node with API enabled public struct APINode { - /// Hostname or IP address of this node - public let hostname: String + /// Origin url of this node + public let origin: String - public init(hostname: String) { - self.hostname = hostname + public init(origin: String) { + self.origin = origin } } -extension APINode { +extension Array where Element == APINode { /// Mainnet nodes public static let mainnet: [APINode] = [ - .init(hostname: "node01.lisk.io"), - .init(hostname: "node02.lisk.io"), - .init(hostname: "node03.lisk.io"), - .init(hostname: "node04.lisk.io"), - .init(hostname: "node05.lisk.io"), - .init(hostname: "node06.lisk.io"), - .init(hostname: "node07.lisk.io"), - .init(hostname: "node08.lisk.io") + .init(origin: "https://node01.lisk.io:443"), + .init(origin: "https://node02.lisk.io:443"), + .init(origin: "https://node03.lisk.io:443"), + .init(origin: "https://node04.lisk.io:443"), + .init(origin: "https://node05.lisk.io:443"), + .init(origin: "https://node06.lisk.io:443"), + .init(origin: "https://node07.lisk.io:443"), + .init(origin: "https://node08.lisk.io:443") ] /// Testnet nodes public static let testnet: [APINode] = [ - .init(hostname: "testnet-wallet.lisknode.io") + .init(origin: "http://testnet.lisk.io:7000") + ] + + /// Betanet nodes + public static let betanet: [APINode] = [ + .init(origin: "http://94.237.42.109:5000"), + .init(origin: "http://83.136.252.99:5000") ] } -extension APINode { +extension Array where Element == APINode { /// Selects a random node from a list of nodes - public static func random(from nodes: [APINode] = APINode.mainnet) -> APINode { - let index = Random.roll(max: nodes.count) - return nodes[index] + public func select(random: Bool = false) -> APINode { + let index: Int = random ? Random.roll(max: count) : 0 + return self[index] } } diff --git a/Sources/Core/APIOptions.swift b/Sources/Core/APIOptions.swift index 58f77d6..0e45386 100644 --- a/Sources/Core/APIOptions.swift +++ b/Sources/Core/APIOptions.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/26/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -11,34 +10,29 @@ import Foundation /// Options for creating an API client public struct APIOptions { - /// Connect to Testnet - public let testnet: Bool + /// Force node selection + public let nodes: [APINode] - /// Use https: - public let ssl: Bool + /// Nethash + public let nethash: APINethash /// Selects a random node public let randomNode: Bool - /// Force node selection - public let node: APINode? + /// Get a node + public var node: APINode { + return nodes.select(random: randomNode) + } +} - /// Port to connect to - public let port: String? +extension APIOptions { - /// Optional nethash - public let nethash: String? + /// Mainnet options + public static let mainnet: APIOptions = .init(nodes: .mainnet, nethash: .mainnet, randomNode: true) - /// Set of banned nodes, unused for now - public let bannedNodes: [APINode]? + /// Testnet options + public static let testnet: APIOptions = .init(nodes: .testnet, nethash: .testnet, randomNode: true) - public init(testnet: Bool = false, ssl: Bool = true, randomNode: Bool = true, node: APINode? = nil, port: String? = nil, nethash: String? = nil, bannedNodes: [APINode]? = nil) { - self.testnet = testnet - self.ssl = ssl - self.randomNode = randomNode - self.node = node - self.port = port - self.nethash = nethash - self.bannedNodes = bannedNodes - } + /// Betanet options + public static let betanet: APIOptions = .init(nodes: .betanet, nethash: .mainnet, randomNode: true) } diff --git a/Sources/Core/APIRequest.swift b/Sources/Core/APIRequest.swift new file mode 100644 index 0000000..d48b4ed --- /dev/null +++ b/Sources/Core/APIRequest.swift @@ -0,0 +1,34 @@ +// +// APIRequest.swift +// LiskPackageDescription +// +// Created by Andrew Barba on 4/11/18. +// + +import Foundation + +public struct APIRequest { + + /// Combination of column and sort direction + public struct Sort { + + public enum Direction: String { + case ascending = "asc" + case descending = "desc" + } + + public let column: String + + public let direction: Direction + + public var value: String { + return "\(column):\(direction.rawValue)" + } + } + + /// Property join type + public enum Join: String { + case or = "" + case and = "AND:" + } +} diff --git a/Sources/Core/APIResponse.swift b/Sources/Core/APIResponse.swift index f487cfb..5274bc1 100644 --- a/Sources/Core/APIResponse.swift +++ b/Sources/Core/APIResponse.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import Foundation @@ -11,6 +10,8 @@ import Foundation /// Protocol describing an response public protocol APIResponse: Decodable { - /// All api responses have a success boolean - var success: Bool { get } + associatedtype APIData: Any + + /// All successful responses have a data key + var data: APIData { get } } diff --git a/Sources/Core/APIResponseError.swift b/Sources/Core/APIResponseError.swift deleted file mode 100644 index 13babc6..0000000 --- a/Sources/Core/APIResponseError.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// APIResponseError.swift -// Lisk -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import Foundation - -/// API response error with an error message -public struct APIResponseError: APIResponse { - - /// Success is always false if this is an error - public var success: Bool { - return false - } - - /// Error message - public let message: String - - /// Private coding keys - enum CodingKeys: String, CodingKey { - case error = "error" - case message = "message" - } - - public init(message: String) { - self.message = message - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - do { - message = try container.decode(String.self, forKey: .error) - } catch { - message = try container.decode(String.self, forKey: .message) - } - } -} diff --git a/Sources/Core/APIService.swift b/Sources/Core/APIService.swift index c735cbe..3dfecc4 100644 --- a/Sources/Core/APIService.swift +++ b/Sources/Core/APIService.swift @@ -14,21 +14,3 @@ public protocol APIService { init(client: APIClient) } - -/// Combination of column and sort direction -public struct OrderBy { - public let column: String - public let direction: OrderByDirection -} - -/// Transactions sort order -public enum OrderByDirection: String { - case ascending = "asc" - case descending = "desc" -} - -/// Property join type -public enum PropertyJoin: String { - case or = "" - case and = "AND:" -} diff --git a/Sources/Crypto/Crypto.swift b/Sources/Crypto/Crypto.swift index 9fba4ca..2523895 100644 --- a/Sources/Crypto/Crypto.swift +++ b/Sources/Crypto/Crypto.swift @@ -11,14 +11,14 @@ import Ed25519 public struct Crypto { /// Generate public and private keys from a given secret - public static func keys(fromSecret secret: String) throws -> (publicKey: String, privateKey: String) { - let keyPair = try self.keyPair(fromSecret: secret) + public static func keys(fromPassphrase passphrase: String) throws -> (publicKey: String, privateKey: String) { + let keyPair = try self.keyPair(fromPassphrase: passphrase) return (keyPair.publicKeyString, keyPair.privateKeyString) } /// Generate key pair from a given secret - public static func keyPair(fromSecret secret: String) throws -> KeyPair { - let bytes = SHA256(secret).digest() + public static func keyPair(fromPassphrase passphrase: String) throws -> KeyPair { + let bytes = SHA256(passphrase).digest() let seed = try Seed(bytes: bytes) return KeyPair(seed: seed) } @@ -30,10 +30,24 @@ public struct Crypto { return "\(identifier)L" } + /// Sign a message + public static func signMessage(_ message: String, passphrase: String) throws -> String { + let keyPair = try self.keyPair(fromPassphrase: passphrase) + let bytes = keyPair.sign(message.hexBytes()) + return bytes.hexString() + } + + /// Verify a message + public static func verifyMessage(_ message: String, signature: String, publicKey: String) throws -> Bool { + let key = try PublicKey(publicKey.hexBytes()) + return try key.verify(signature: signature.hexBytes(), message: message.hexBytes()) + } + /// Epoch time relative to genesis block public static func timeIntervalSinceGenesis(offset: TimeInterval = 0) -> UInt32 { let now = Date().timeIntervalSince1970 + offset - return UInt32(now - Constants.Time.epochSeconds) + let diff = max(0, now - Constants.Time.epochSeconds) + return UInt32(diff) } /// Multiplies a given amount by Lisk fixed point diff --git a/Sources/Crypto/SHA256.swift b/Sources/Crypto/SHA256.swift index 919ce8c..b6bd0e7 100644 --- a/Sources/Crypto/SHA256.swift +++ b/Sources/Crypto/SHA256.swift @@ -86,12 +86,11 @@ public final class SHA256 { // Finally, compute the result. var result = [UInt8](repeating: 0, count: digestLength / 8) for (idx, element) in hash.enumerated() { - let hash = element.bigEndian let pos = idx * 4 - result[pos + 0] = UInt8(hash & 0xff) - result[pos + 1] = UInt8((hash >> 8) & 0xff) - result[pos + 2] = UInt8((hash >> 16) & 0xff) - result[pos + 3] = UInt8((hash >> 24) & 0xff) + result[pos + 0] = UInt8((element >> 24) & 0xff) + result[pos + 1] = UInt8((element >> 16) & 0xff) + result[pos + 2] = UInt8((element >> 8) & 0xff) + result[pos + 3] = UInt8(element & 0xff) } self.result = result @@ -170,7 +169,7 @@ public final class SHA256 { // // inputBitLength + 1 + bitsToAppend ≡ 448 mod 512 let mod = inputBitLength % 512 - let bitsToAppend = mod == 448 ? 512 : 448 - mod - 1 + let bitsToAppend = mod < 448 ? 448 - 1 - mod : 512 + 448 - mod - 1 // We already appended first 7 bits with 0x80 above. input += [UInt8](repeating: 0, count: (bitsToAppend - 7) / 8) @@ -186,9 +185,9 @@ public final class SHA256 { // MARK:- Helpers private extension UInt64 { - /// Converts the 64 bit integer into array of 4-byte integers. + /// Converts the 64 bit integer into an array of single byte integers. func toByteArray() -> [UInt8] { - var value = self + var value = self.littleEndian return withUnsafeBytes(of: &value, Array.init) } } @@ -213,4 +212,3 @@ private extension Array { } } } - diff --git a/Sources/Crypto/WebToken.swift b/Sources/Crypto/WebToken.swift new file mode 100644 index 0000000..edb13a1 --- /dev/null +++ b/Sources/Crypto/WebToken.swift @@ -0,0 +1,75 @@ +// +// WebToken.swift +// Lisk +// +// Created by Andrew Barba on 5/15/18. +// + +import Foundation + +public enum WebTokenError: Error { + case expired + case invalid + case unauthorized +} + +public struct WebToken { + + /// Time the token was created + let timestamp: UInt32 + + /// Public key of the sender + let publicKey: String + + /// Signed message of the tokens timestamp + let signature: String + + /// Address from the tokens public key + var address: String { + return Crypto.address(fromPublicKey: publicKey) + } + + /// Initialized from a passphrase + public init(passphrase: String, offset: TimeInterval = 0) throws { + self.timestamp = Crypto.timeIntervalSinceGenesis(offset: offset) + self.publicKey = try Crypto.keys(fromPassphrase: passphrase).publicKey + self.signature = try Crypto.signMessage("\(timestamp)", passphrase: passphrase) + } + + /// Initialized from a token string, throws an error if: + /// - Token string is invalid + /// - Token string fails signature check + /// - Token is expired + public init(tokenString: String, expiration: TimeInterval = 30) throws { + let parts = tokenString.trimmingCharacters(in: .whitespacesAndNewlines).components(separatedBy: ".") + + guard parts.count == 3, let timestamp = UInt32(parts[0]) else { + throw WebTokenError.invalid + } + + let publicKey = parts[1] + let signature = parts[2] + + guard try Crypto.verifyMessage("\(timestamp)", signature: signature, publicKey: publicKey) else { + throw WebTokenError.unauthorized + } + + guard timestamp >= Crypto.timeIntervalSinceGenesis(offset: -expiration) else { + throw WebTokenError.expired + } + + self.timestamp = timestamp + self.publicKey = publicKey + self.signature = signature + } + + /// Returns a string in the format {timestamp}.{publicKey}.{signature(timestamp)} + public func tokenString() -> String { + return "\(timestamp).\(publicKey).\(signature)" + } + + /// Is the token expired relative to an expiration time from now + public func isExpired(expiration: TimeInterval = 30) -> Bool { + return timestamp < Crypto.timeIntervalSinceGenesis(offset: -expiration) + } +} diff --git a/Tests/API/Accounts/AccountsAccountTests.swift b/Tests/API/Accounts/AccountsAccountTests.swift index 31a0854..30be264 100644 --- a/Tests/API/Accounts/AccountsAccountTests.swift +++ b/Tests/API/Accounts/AccountsAccountTests.swift @@ -3,7 +3,6 @@ // LiskTests // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import XCTest @@ -13,9 +12,9 @@ class AccountsAccountTests: LiskTestCase { func testMainnetAccount() { let accounts = Accounts(client: mainNetClient) - let response = tryRequest { accounts.account(address: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.account.address, andrewAddress) - XCTAssertEqual(response.account.publicKey, andrewPublicKey) + let response = tryRequest { accounts.accounts(address: andrewAddress, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].address, andrewAddress) + XCTAssertEqual(response.data[0].publicKey, andrewPublicKey) } } diff --git a/Tests/API/Accounts/AccountsBalanceTests.swift b/Tests/API/Accounts/AccountsBalanceTests.swift deleted file mode 100644 index 2cc2a5e..0000000 --- a/Tests/API/Accounts/AccountsBalanceTests.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// AccountsBalanceTests.swift -// Lisk -// -// Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import XCTest -@testable import Lisk - -class AccountsBalanceTests: LiskTestCase { - - func testMainnetBalance() { - let accounts = Accounts(client: mainNetClient) - let response = tryRequest { accounts.balance(address: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssert(Double(response.balance)! > 0) - } - - func testBadAddressBalance() { - let address = UUID().uuidString - let accounts = Accounts(client: mainNetClient) - let response = tryRequestError { accounts.balance(address: address, completionHandler: $0) } - XCTAssertFalse(response.success) - XCTAssertEqual(response.message, "Object didn't pass validation for format address: \(address)") - } -} diff --git a/Tests/API/Accounts/AccountsOpenTests.swift b/Tests/API/Accounts/AccountsOpenTests.swift index c2ea187..ffc3c7c 100644 --- a/Tests/API/Accounts/AccountsOpenTests.swift +++ b/Tests/API/Accounts/AccountsOpenTests.swift @@ -11,16 +11,9 @@ import XCTest class AccountsOpenTests: LiskTestCase { func testCryptoKeys() { - let (publicKey, _) = try! Crypto.keys(fromSecret: exampleSecret) + let (publicKey, _) = try! Crypto.keys(fromPassphrase: exampleSecret) XCTAssertEqual(publicKey, examplePublicKey) let address = Crypto.address(fromPublicKey: publicKey) XCTAssertEqual(address, exampleAddress) } - - func testMainnetOpen() { - let accounts = Accounts(client: mainNetClient) - let response = tryRequest { accounts.open(secret: exampleSecret, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.account.address, exampleAddress) - } } diff --git a/Tests/API/Accounts/AccountsPublicKeyTests.swift b/Tests/API/Accounts/AccountsPublicKeyTests.swift index 666a784..247c6d1 100644 --- a/Tests/API/Accounts/AccountsPublicKeyTests.swift +++ b/Tests/API/Accounts/AccountsPublicKeyTests.swift @@ -3,7 +3,6 @@ // Lisk // // Created by Andrew Barba on 12/31/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import XCTest @@ -13,8 +12,8 @@ class AccountsPublicKeyTests: LiskTestCase { func testMainnetPublicKey() { let accounts = Accounts(client: mainNetClient) - let response = tryRequest { accounts.publicKey(address: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.publicKey, andrewPublicKey) + let response = tryRequest { accounts.accounts(address: andrewAddress, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].publicKey, andrewPublicKey) } } diff --git a/Tests/API/Blocks/BlocksGetTests.swift b/Tests/API/Blocks/BlocksGetTests.swift index 7de30cb..c96ad06 100644 --- a/Tests/API/Blocks/BlocksGetTests.swift +++ b/Tests/API/Blocks/BlocksGetTests.swift @@ -13,8 +13,8 @@ class BlocksGetTests: LiskTestCase { func testMainnetGet() { let blockId = "6699130148421113207" let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.block(id: blockId, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.block.id, blockId) + let response = tryRequest { blocks.blocks(id: blockId, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].id, blockId) } } diff --git a/Tests/API/Blocks/BlocksListTests.swift b/Tests/API/Blocks/BlocksListTests.swift index 034fe5f..11352bc 100644 --- a/Tests/API/Blocks/BlocksListTests.swift +++ b/Tests/API/Blocks/BlocksListTests.swift @@ -13,7 +13,6 @@ class BlocksListTests: LiskTestCase { func testMainnetGet() { let blocks = Blocks(client: mainNetClient) let response = tryRequest { blocks.blocks(limit: 5, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.blocks.count, 5) + XCTAssertEqual(response.data.count, 5) } } diff --git a/Tests/API/Blocks/BlocksMiscTests.swift b/Tests/API/Blocks/BlocksMiscTests.swift deleted file mode 100644 index 4bb88ba..0000000 --- a/Tests/API/Blocks/BlocksMiscTests.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// BlocksMiscTests.swift -// LiskTests -// -// Created by Andrew Barba on 1/9/18. -// - -import XCTest -@testable import Lisk - -class BlocksMiscTests: LiskTestCase { - - func testMainnetFee() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.fee(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetFees() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.fees(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetReward() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.reward(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetSupply() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.supply(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetHeight() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.height(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetStatus() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.status(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetNethash() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.nethash(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainnetMilestone() { - let blocks = Blocks(client: mainNetClient) - let response = tryRequest { blocks.milestone(completionHandler: $0) } - XCTAssert(response.success) - } -} diff --git a/Tests/API/Delegates/DelegatesCountTests.swift b/Tests/API/Delegates/DelegatesCountTests.swift deleted file mode 100644 index 6fd8697..0000000 --- a/Tests/API/Delegates/DelegatesCountTests.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// DelegatesCountTests.swift -// LiskTests -// -// Created by Andrew Barba on 1/8/18. -// - -import XCTest -@testable import Lisk - -class DelegatesCountTests: LiskTestCase { - - func testMainnetCount() { - let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.count(completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThanOrEqual(response.count, 101) - } -} diff --git a/Tests/API/Delegates/DelegatesGetTests.swift b/Tests/API/Delegates/DelegatesGetTests.swift index 1b88327..87a5b29 100644 --- a/Tests/API/Delegates/DelegatesGetTests.swift +++ b/Tests/API/Delegates/DelegatesGetTests.swift @@ -12,19 +12,15 @@ class DelegatesGetTests: LiskTestCase { func testMainnetGetUsername() { let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.delegate(username: andrewUsername, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.delegate.username, andrewUsername) - XCTAssertEqual(response.delegate.address, andrewAddress) - XCTAssertEqual(response.delegate.publicKey, andrewPublicKey) + let response = tryRequest { delegates.delegates(username: andrewUsername, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].username, andrewUsername) } func testMainnetGetPublicKey() { let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.delegate(publicKey: andrewPublicKey, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.delegate.username, andrewUsername) - XCTAssertEqual(response.delegate.address, andrewAddress) - XCTAssertEqual(response.delegate.publicKey, andrewPublicKey) + let response = tryRequest { delegates.delegates(publicKey: andrewPublicKey, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].username, andrewUsername) } } diff --git a/Tests/API/Delegates/DelegatesListTests.swift b/Tests/API/Delegates/DelegatesListTests.swift index 12d571b..a01293d 100644 --- a/Tests/API/Delegates/DelegatesListTests.swift +++ b/Tests/API/Delegates/DelegatesListTests.swift @@ -13,14 +13,12 @@ class DelegatesListsTests: LiskTestCase { func testMainnetList() { let delegates = Delegates(client: mainNetClient) let response = tryRequest { delegates.delegates(limit: 5, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.delegates.count, 5) + XCTAssertEqual(response.data.count, 5) } func testMainnetSearch() { let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.search(query: "andr", completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.delegates.count, 0) + let response = tryRequest { delegates.delegates(search: "andr", completionHandler: $0) } + XCTAssertGreaterThanOrEqual(response.data.count, 1) } } diff --git a/Tests/API/Delegates/DelegatesVotesTests.swift b/Tests/API/Delegates/DelegatesVotesTests.swift deleted file mode 100644 index aef96e5..0000000 --- a/Tests/API/Delegates/DelegatesVotesTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// DelegatesVotesTests.swift -// LiskTests -// -// Created by Andrew Barba on 1/8/18. -// - -import XCTest -@testable import Lisk - -class DelegatesVotesTests: LiskTestCase { - - func testMainnetVotes() { - let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.votes(address: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.delegates.count, 0) - } - - func testMainnetVoters() { - let delegates = Delegates(client: mainNetClient) - let response = tryRequest { delegates.voters(publicKey: andrewPublicKey, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.accounts.count, 0) - } -} diff --git a/Tests/API/Loader/LoaderStatusPingTests.swift b/Tests/API/Loader/LoaderStatusPingTests.swift deleted file mode 100644 index ab1477b..0000000 --- a/Tests/API/Loader/LoaderStatusPingTests.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// LoaderStatusPingTests.swift -// LiskTests -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import XCTest -@testable import Lisk - -class LoaderStatusPingTests: LiskTestCase { - - func testMainnetPingStatus() { - let loader = Loader(client: mainNetClient) - let response = tryRequest { loader.pingStatus(completionHandler: $0) } - XCTAssert(response.success) - } - - func testMainPeerPingStatus() { - let loader = Loader(client: mainPeerClient) - let response = tryRequest { loader.pingStatus(completionHandler: $0) } - XCTAssert(response.success) - } -} diff --git a/Tests/API/Loader/LoaderStatusSyncTests.swift b/Tests/API/Loader/LoaderStatusSyncTests.swift deleted file mode 100644 index 6f0a33f..0000000 --- a/Tests/API/Loader/LoaderStatusSyncTests.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// LoaderStatusSyncTests.swift -// LiskTests -// -// Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import XCTest -@testable import Lisk - -class LoaderStatusSyncTests: LiskTestCase { - - func testMainnetSyncStatus() { - let loader = Loader(client: mainNetClient) - let response = tryRequest { loader.syncStatus(completionHandler: $0) } - XCTAssert(response.success) - XCTAssertFalse(response.syncing) - } - - func testMainPeerSyncStatus() { - let loader = Loader(client: mainPeerClient) - let response = tryRequest { loader.syncStatus(completionHandler: $0) } - XCTAssert(response.success) - XCTAssertFalse(response.syncing) - } -} diff --git a/Tests/API/Loader/LoaderStatusTests.swift b/Tests/API/Loader/LoaderStatusTests.swift deleted file mode 100644 index 480029b..0000000 --- a/Tests/API/Loader/LoaderStatusTests.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// LoaderStatusTests.swift -// LiskTests -// -// Created by Andrew Barba on 12/11/17. -// Copyright © 2017 Andrew Barba. All rights reserved. -// - -import XCTest -@testable import Lisk - -class LoaderStatusTests: LiskTestCase { - - func testMainnetStatus() { - let loader = Loader(client: mainNetClient) - let response = tryRequest { loader.status(completionHandler: $0) } - XCTAssert(response.success) - XCTAssert(response.loaded) - XCTAssert(response.now > 0) - } - - func testMainPeerStatus() { - let loader = Loader(client: mainPeerClient) - let response = tryRequest { loader.status(completionHandler: $0) } - XCTAssert(response.success) - XCTAssert(response.loaded) - XCTAssert(response.now > 0) - } -} diff --git a/Tests/API/Peers/PeersGetTests.swift b/Tests/API/Peers/PeersGetTests.swift index 4badbb6..21d797b 100644 --- a/Tests/API/Peers/PeersGetTests.swift +++ b/Tests/API/Peers/PeersGetTests.swift @@ -12,8 +12,8 @@ class PeersGetTests: LiskTestCase { func testMainnetGet() { let peers = Peers(client: mainNetClient) - let response = tryRequest { peers.peer(ip: "165.227.215.126", port: 8000, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.peer.version, "0.9.11") + let response = tryRequest { peers.peers(ip: "165.227.215.126", completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].version, "0.9.11") } } diff --git a/Tests/API/Peers/PeersListTests.swift b/Tests/API/Peers/PeersListTests.swift index 1e1aad7..d0dfc94 100644 --- a/Tests/API/Peers/PeersListTests.swift +++ b/Tests/API/Peers/PeersListTests.swift @@ -13,7 +13,6 @@ class PeersListTests: LiskTestCase { func testMainnetList() { let peers = Peers(client: mainNetClient) let response = tryRequest { peers.peers(limit: 5, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.peers.count, 5) + XCTAssertEqual(response.data.count, 5) } } diff --git a/Tests/API/Peers/PeersVersionTests.swift b/Tests/API/Peers/PeersVersionTests.swift deleted file mode 100644 index 4ed10d6..0000000 --- a/Tests/API/Peers/PeersVersionTests.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// PeersVersionTests.swift -// LiskTests -// -// Created by Andrew Barba on 1/8/18. -// - -import XCTest -@testable import Lisk - -class PeersVersionTests: LiskTestCase { - - func testMainnetVersion() { - let peers = Peers(client: mainNetClient) - let response = tryRequest { peers.version(completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.version, "0.9.11") - } -} diff --git a/Tests/API/Signatures/SignaturesFeeTests.swift b/Tests/API/Signatures/SignaturesFeeTests.swift deleted file mode 100644 index 4cab067..0000000 --- a/Tests/API/Signatures/SignaturesFeeTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// SignaturesFeeTests.swift -// LiskTests -// -// Created by Andrew Barba on 1/10/18. -// - -import XCTest -@testable import Lisk - -class SignaturesFeeTests: LiskTestCase { - - func testMainnetFee() { - let signatures = Signatures(client: mainNetClient) - let response = tryRequest { signatures.fee(completionHandler: $0) } - XCTAssert(response.success) - } -} diff --git a/Tests/API/Signatures/SignaturesRegisterTests.swift b/Tests/API/Signatures/SignaturesRegisterTests.swift index 4697d55..176239d 100644 --- a/Tests/API/Signatures/SignaturesRegisterTests.swift +++ b/Tests/API/Signatures/SignaturesRegisterTests.swift @@ -10,18 +10,18 @@ import XCTest class SignaturesRegisterTests: LiskTestCase { - func testMainnetRegisterNoFunds() { - let signatures = Signatures(client: mainNetClient) - let response = tryRequestError { signatures.register(secondSecret: exampleSecret, secret: exampleSecret, completionHandler: $0) } - XCTAssertFalse(response.success) - XCTAssertEqual(response.message, "Account does not have enough LSK: 5549607903333983622L balance: 0") - } +// func testMainnetRegisterNoFunds() { +// let signatures = Signatures(client: mainNetClient) +// let response = tryRequestError { signatures.register(secondSecret: exampleSecret, secret: exampleSecret, completionHandler: $0) } +// XCTAssertFalse(response.success) +// XCTAssertEqual(response.message, "Account does not have enough LSK: 5549607903333983622L balance: 0") +// } func testRegisterTransaction() { - let (publicKey, _) = try! Crypto.keys(fromSecret: testSecondSecret) + let (publicKey, _) = try! Crypto.keys(fromPassphrase: testSecondSecret) let asset = ["signature": ["publicKey": publicKey]] var transaction = LocalTransaction(.registerSecondPassphrase, amount: 0, timestamp: 51497510, asset: asset) - try? transaction.sign(secret: testSecret) + try? transaction.sign(passphrase: testSecret) print(transaction) XCTAssertEqual(transaction.id, "6158495690989447317") XCTAssertEqual(transaction.amountBytes, [0, 0, 0, 0, 0, 0, 0, 0]) diff --git a/Tests/API/Transactions/TransactionsGetTests.swift b/Tests/API/Transactions/TransactionsGetTests.swift index 9480fbe..ead0cdc 100644 --- a/Tests/API/Transactions/TransactionsGetTests.swift +++ b/Tests/API/Transactions/TransactionsGetTests.swift @@ -13,8 +13,8 @@ class TransactionsGetTests: LiskTestCase { func testMainnetGet() { let id = "10861152394901264352" let transactions = Transactions(client: mainNetClient) - let response = tryRequest { transactions.transaction(id: id, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.transaction.id, id) + let response = tryRequest { transactions.transactions(id: id, completionHandler: $0) } + XCTAssertEqual(response.data.count, 1) + XCTAssertEqual(response.data[0].id, id) } } diff --git a/Tests/API/Transactions/TransactionsListTest.swift b/Tests/API/Transactions/TransactionsListTest.swift index 5bc8c8f..4ff9331 100644 --- a/Tests/API/Transactions/TransactionsListTest.swift +++ b/Tests/API/Transactions/TransactionsListTest.swift @@ -13,28 +13,24 @@ class TransactionsListTests: LiskTestCase { func testMainnetList() { let transactions = Transactions(client: mainNetClient) let response = tryRequest { transactions.transactions(completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.transactions.count, 0) + XCTAssertGreaterThan(response.data.count, 0) } func testMainnetListSender() { let transactions = Transactions(client: mainNetClient) let response = tryRequest { transactions.transactions(sender: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.transactions.count, 0) + XCTAssertGreaterThan(response.data.count, 0) } func testMainnetListRecipient() { let transactions = Transactions(client: mainNetClient) let response = tryRequest { transactions.transactions(recipient: andrewAddress, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertGreaterThan(response.transactions.count, 0) + XCTAssertGreaterThan(response.data.count, 0) } func testMainnetLimit() { let transactions = Transactions(client: mainNetClient) let response = tryRequest { transactions.transactions(limit: 2, completionHandler: $0) } - XCTAssert(response.success) - XCTAssertEqual(response.transactions.count, 2) + XCTAssertEqual(response.data.count, 2) } } diff --git a/Tests/API/Transactions/TransactionsSigningTest.swift b/Tests/API/Transactions/TransactionsSigningTest.swift index 17898b4..f3f08e2 100644 --- a/Tests/API/Transactions/TransactionsSigningTest.swift +++ b/Tests/API/Transactions/TransactionsSigningTest.swift @@ -12,7 +12,7 @@ class TransactionsSigningTests: LiskTestCase { func testSign() { var transaction = LocalTransaction(.transfer, lsk: 1.12, recipientId: andrewAddress, timestamp: 10) - try? transaction.sign(secret: exampleSecret) + try? transaction.sign(passphrase: exampleSecret) XCTAssertEqual(transaction.typeBytes, [0]) XCTAssertEqual(transaction.timestampBytes, [10, 0, 0, 0]) @@ -25,7 +25,7 @@ class TransactionsSigningTests: LiskTestCase { func testSignWithRealmTimestamp() { var transaction = LocalTransaction(.transfer, lsk: 1, recipientId: andrewAddress, timestamp: 51262230) - try? transaction.sign(secret: exampleSecret) + try? transaction.sign(passphrase: exampleSecret) // Check bytes XCTAssertEqual(transaction.signature, "5bcfbd0ed92df0fbb96dab8dd844b06f82aab05b89f3ac2e53b4ffc632ad96ca0a6dd9b158d754ccde08dac50a831a21bcfc16029e80710a9faf78ac94f0ec01") @@ -34,7 +34,7 @@ class TransactionsSigningTests: LiskTestCase { func testSecondSign() { var transaction = LocalTransaction(.transfer, lsk: 1.12, recipientId: andrewAddress, timestamp: 10) - try? transaction.sign(secret: exampleSecret, secondSecret: exampleSecret) + try? transaction.sign(passphrase: exampleSecret, secondPassphrase: exampleSecret) XCTAssertEqual(transaction.typeBytes, [0]) XCTAssertEqual(transaction.timestampBytes, [10, 0, 0, 0]) @@ -48,7 +48,7 @@ class TransactionsSigningTests: LiskTestCase { func testSignRequestOptions() { var transaction = LocalTransaction(.transfer, lsk: 1.12, recipientId: andrewAddress, timestamp: 10) - try? transaction.sign(secret: exampleSecret) + try? transaction.sign(passphrase: exampleSecret) let options = transaction.requestOptions diff --git a/Tests/API/Transactions/TransactionsTransferTests.swift b/Tests/API/Transactions/TransactionsTransferTests.swift index a584145..608d89b 100644 --- a/Tests/API/Transactions/TransactionsTransferTests.swift +++ b/Tests/API/Transactions/TransactionsTransferTests.swift @@ -12,14 +12,12 @@ class TransactionsTransferTests: LiskTestCase { func testMainnetSendNoFunds() { let transactions = Transactions(client: mainNetClient) - let response = tryRequestError { transactions.transfer(lsk: 1, to: andrewAddress, secret: exampleSecret, completionHandler: $0) } - XCTAssertFalse(response.success) + let response = tryRequestError { transactions.transfer(lsk: 1, to: andrewAddress, passphrase: exampleSecret, completionHandler: $0) } XCTAssertEqual(response.message, "Account does not have enough LSK: 5549607903333983622L balance: 0") } func testTestnetSendWithFunds() { let transactions = Transactions(client: testNetClient) - let response = tryRequest { transactions.transfer(lsk: 0.1, to: exampleAddress, secret: testSecret, completionHandler: $0) } - XCTAssert(response.success) + let _ = tryRequest { transactions.transfer(lsk: 0.1, to: exampleAddress, passphrase: testSecret, completionHandler: $0) } } } diff --git a/Tests/Crypto/MnemonicPassphraseTests.swift b/Tests/Crypto/MnemonicPassphraseTests.swift index bf7ad06..c929df2 100644 --- a/Tests/Crypto/MnemonicPassphraseTests.swift +++ b/Tests/Crypto/MnemonicPassphraseTests.swift @@ -12,7 +12,7 @@ class MnemonicPassphraseTests: LiskTestCase { func testPassphrases() { var passphrases = Set() - for _ in 0...10_000 { + for _ in 0...100_000 { let passphrase = MnemonicPassphrase().passphrase XCTAssertFalse(passphrases.contains(passphrase)) passphrases.insert(passphrase) diff --git a/Tests/Crypto/SignMessageTests.swift b/Tests/Crypto/SignMessageTests.swift new file mode 100644 index 0000000..355ff9e --- /dev/null +++ b/Tests/Crypto/SignMessageTests.swift @@ -0,0 +1,21 @@ +// +// SignMessageTests.swift +// LiskTests +// +// Created by Andrew Barba on 4/17/18. +// + +import XCTest +@testable import Lisk + +class SignMessageTests: LiskTestCase { + + func testSignMessage() { + let message = "Hello, World \(UUID().uuidString)" + let signature = try! Crypto.signMessage(message, passphrase: exampleSecret) + let verifiedYes = try! Crypto.verifyMessage(message, signature: signature, publicKey: examplePublicKey) + let verifiedNo = try! Crypto.verifyMessage(message, signature: signature, publicKey: andrewPublicKey) + XCTAssertTrue(verifiedYes) + XCTAssertFalse(verifiedNo) + } +} diff --git a/Tests/Crypto/WebTokenTests.swift b/Tests/Crypto/WebTokenTests.swift new file mode 100644 index 0000000..f46edf5 --- /dev/null +++ b/Tests/Crypto/WebTokenTests.swift @@ -0,0 +1,57 @@ +// +// WebTokenTests.swift +// LiskTests +// +// Created by Andrew Barba on 5/15/18. +// + +import XCTest +@testable import Lisk + +class WebTokenTests: LiskTestCase { + + func testAuthenticationToken() { + let token = try! WebToken(passphrase: exampleSecret) + XCTAssertEqual(token.address, exampleAddress) + } + + func testAuthenticationTokenOffset() { + let token = try! WebToken(passphrase: exampleSecret, offset: -60) + XCTAssertTrue(token.isExpired()) + } + + func testAuthenticationTokenToString() { + let token = try! WebToken(passphrase: exampleSecret) + let tokenString = token.tokenString() + XCTAssertEqual(tokenString, "\(token.timestamp).\(token.publicKey).\(token.signature)") + } + + func testAuthenticationTokenFromString() { + let timestamp = Crypto.timeIntervalSinceGenesis() + let signature = try! Crypto.signMessage("\(timestamp)", passphrase: exampleSecret) + let tokenString = "\(timestamp).\(examplePublicKey).\(signature)" + XCTAssertNoThrow(try WebToken(tokenString: tokenString)) + } + + func testAuthenticationTokenExpired() { + let timestamp = Crypto.timeIntervalSinceGenesis(offset: -60) + let signature = try! Crypto.signMessage("\(timestamp)", passphrase: exampleSecret) + let tokenString = "\(timestamp).\(examplePublicKey).\(signature)" + XCTAssertThrowsError(try WebToken(tokenString: tokenString)) + } + + func testAuthenticationTokenTimestampMismatch() { + let timestamp = Crypto.timeIntervalSinceGenesis() + let timestampExpired = Crypto.timeIntervalSinceGenesis(offset: -60) + let signature = try! Crypto.signMessage("\(timestampExpired)", passphrase: exampleSecret) + let tokenString = "\(timestamp).\(examplePublicKey).\(signature)" + XCTAssertThrowsError(try WebToken(tokenString: tokenString)) + } + + func testAuthenticationTokenInvalidSecret() { + let timestamp = Crypto.timeIntervalSinceGenesis() + let signature = try! Crypto.signMessage("\(timestamp)", passphrase: testSecret) + let tokenString = "\(timestamp).\(examplePublicKey).\(signature)" + XCTAssertThrowsError(try WebToken(tokenString: tokenString)) + } +} diff --git a/Tests/LiskTestCase.swift b/Tests/LiskTestCase.swift index 510eecf..aaf7b43 100644 --- a/Tests/LiskTestCase.swift +++ b/Tests/LiskTestCase.swift @@ -3,7 +3,6 @@ // LiskTests // // Created by Andrew Barba on 12/27/17. -// Copyright © 2017 Andrew Barba. All rights reserved. // import XCTest @@ -15,7 +14,13 @@ class LiskTestCase: XCTestCase { let testNetClient = APIClient.testnet - let mainPeerClient = APIClient(options: .init(ssl: false, node: .init(hostname: "lisk0.abarba.me"))) + let betaNetClient = APIClient.betanet + + let mainPeerClient: APIClient = { + let nodes: [APINode] = [.init(origin: "http://lisk0.abarba.me:8000")] + let options = APIOptions(nodes: nodes, nethash: .mainnet, randomNode: true) + return APIClient(options: options) + }() let andrewUsername = "andrew" let andrewAddress = "14987768355736502769L" @@ -49,9 +54,9 @@ class LiskTestCase: XCTestCase { } @discardableResult - func tryRequestError(_ block: (@escaping (Response) -> Void) -> Void) -> APIResponseError { + func tryRequestError(_ block: (@escaping (Response) -> Void) -> Void) -> APIError { let expectation = XCTestExpectation() - var error: APIResponseError? + var error: APIError? block() { response in switch response { case .success: diff --git a/docs/Classes.html b/docs/Classes.html index 94b089c..e92572a 100644 --- a/docs/Classes.html +++ b/docs/Classes.html @@ -13,7 +13,7 @@
-

Lisk Docs (54% documented)

+

Lisk Docs (42% documented)

View on GitHub

@@ -41,12 +41,6 @@ - - @@ -58,6 +52,9 @@