diff --git a/build.gradle.kts b/build.gradle.kts index 882c86f85..0e3938ba8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,7 +49,7 @@ allprojects { } group = "exchange.dydx.abacus" -version = "1.6.54" +version = "1.6.55" repositories { google() diff --git a/integration/iOS/Podfile.lock b/integration/iOS/Podfile.lock index be8f54a9f..a6f7cbf67 100644 --- a/integration/iOS/Podfile.lock +++ b/integration/iOS/Podfile.lock @@ -15,9 +15,9 @@ EXTERNAL SOURCES: :path: "~/v4-abacus" SPEC CHECKSUMS: - abacus: 46f62be6dc9b3f888093eb2c9952d0267ab40670 + abacus: a57d55b0ca0d3514389573a87c47507f88eb6b0a CryptoSwift: 562f8eceb40e80796fffc668b0cad9313284cfa6 PODFILE CHECKSUM: 37d72c15b180e62a4c42b8fb41b4836c89aa63c9 -COCOAPODS: 1.15.2 +COCOAPODS: 1.12.1 diff --git a/integration/iOS/Pods/Local Podspecs/abacus.podspec.json b/integration/iOS/Pods/Local Podspecs/abacus.podspec.json index 33e8c60d2..19df5e4ce 100644 --- a/integration/iOS/Pods/Local Podspecs/abacus.podspec.json +++ b/integration/iOS/Pods/Local Podspecs/abacus.podspec.json @@ -26,7 +26,6 @@ "osx": null, "ios": null, "tvos": null, - "visionos": null, "watchos": null } } diff --git a/integration/iOS/Pods/Manifest.lock b/integration/iOS/Pods/Manifest.lock index be8f54a9f..a6f7cbf67 100644 --- a/integration/iOS/Pods/Manifest.lock +++ b/integration/iOS/Pods/Manifest.lock @@ -15,9 +15,9 @@ EXTERNAL SOURCES: :path: "~/v4-abacus" SPEC CHECKSUMS: - abacus: 46f62be6dc9b3f888093eb2c9952d0267ab40670 + abacus: a57d55b0ca0d3514389573a87c47507f88eb6b0a CryptoSwift: 562f8eceb40e80796fffc668b0cad9313284cfa6 PODFILE CHECKSUM: 37d72c15b180e62a4c42b8fb41b4836c89aa63c9 -COCOAPODS: 1.15.2 +COCOAPODS: 1.12.1 diff --git a/integration/iOS/Pods/Pods.xcodeproj/project.pbxproj b/integration/iOS/Pods/Pods.xcodeproj/project.pbxproj index 4939537ed..df631aa42 100644 --- a/integration/iOS/Pods/Pods.xcodeproj/project.pbxproj +++ b/integration/iOS/Pods/Pods.xcodeproj/project.pbxproj @@ -9,10 +9,9 @@ /* Begin PBXAggregateTarget section */ 4084846DAF1774840D25DF1BF2460325 /* abacus */ = { isa = PBXAggregateTarget; - buildConfigurationList = 127F9C06E33E9DC2AB3876F089264EB1 /* Build configuration list for PBXAggregateTarget "abacus" */; + buildConfigurationList = B36D4FC54F44832C64D6BFCFC7EF4665 /* Build configuration list for PBXAggregateTarget "abacus" */; buildPhases = ( - DB36ACE8A857E9B93C25EA309FF42C2A /* [CP-User] Build abacus */, - 903ECA29140368245E4B69BE2D0DBCA4 /* [CP] Copy dSYMs */, + 1403E0AEBF8A2087DF8CACA188B609E8 /* [CP-User] Build abacus */, ); dependencies = ( ); @@ -143,13 +142,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 174DE097054DE7A0410C57AF4AEF5A1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 469F25E790D19440507BF938A40578A7; - remoteInfo = "Pods-abacus.ios"; - }; 8437FCB39ECA4A44D93FCDCBF6066E92 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; @@ -164,6 +156,13 @@ remoteGlobalIDString = 4084846DAF1774840D25DF1BF2460325; remoteInfo = abacus; }; + F99C8B5A9E9146040BECE7ABFD8E196E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 469F25E790D19440507BF938A40578A7; + remoteInfo = "Pods-abacus.ios"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -188,6 +187,7 @@ 1C5732A96CD4AA2A534F0887522F1C39 /* CryptoSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CryptoSwift.debug.xcconfig; sourceTree = ""; }; 1CF2318F38D1207A2F8BF92B7B8A294E /* Array+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Extension.swift"; path = "Sources/CryptoSwift/Array+Extension.swift"; sourceTree = ""; }; 1DE302C0F83772A905581CC7090CA123 /* Collection+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Collection+Extension.swift"; path = "Sources/CryptoSwift/Collection+Extension.swift"; sourceTree = ""; }; + 1E1F36967D766BC17B1215E06682912E /* abacus.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = abacus.release.xcconfig; sourceTree = ""; }; 1E34A6EC8D702D85DFC8AB0BCA04D225 /* Pods-abacus.iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-abacus.iosTests-acknowledgements.markdown"; sourceTree = ""; }; 233CC871C3B5E5D1C643AA3F5362558A /* DigestType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DigestType.swift; path = Sources/CryptoSwift/DigestType.swift; sourceTree = ""; }; 236DF73D92D4D71C82089CF882764244 /* NoPadding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NoPadding.swift; path = Sources/CryptoSwift/NoPadding.swift; sourceTree = ""; }; @@ -202,7 +202,6 @@ 37E3B9DB40B26E67EACDE716904859D9 /* OFB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OFB.swift; path = Sources/CryptoSwift/BlockMode/OFB.swift; sourceTree = ""; }; 37E6750B2D87EBA042E7B6C17E6D6CC6 /* Data+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Extension.swift"; path = "Sources/CryptoSwift/Foundation/Data+Extension.swift"; sourceTree = ""; }; 38422D3128360E50B8D6715E1F390E08 /* Division.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Division.swift; path = Sources/CryptoSwift/CS_BigInt/Division.swift; sourceTree = ""; }; - 3B9814D8EB9409314A6ECBBAE173E4AE /* abacus.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = abacus.release.xcconfig; sourceTree = ""; }; 3C1FCD96FB6C948BA9ACE2A4FDB3A3A6 /* Exponentiation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Exponentiation.swift; path = Sources/CryptoSwift/CS_BigInt/Exponentiation.swift; sourceTree = ""; }; 3E0AAD4392F812C1C216CCFB8F6C83F1 /* HMAC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HMAC.swift; path = Sources/CryptoSwift/HMAC.swift; sourceTree = ""; }; 3EA11A675218D8EC495F817C58CD7850 /* RSA+Cipher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RSA+Cipher.swift"; path = "Sources/CryptoSwift/RSA/RSA+Cipher.swift"; sourceTree = ""; }; @@ -218,6 +217,7 @@ 5825EF8E1C9D92AFC155A41AB00E7CDE /* CryptoSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CryptoSwift-umbrella.h"; sourceTree = ""; }; 58D9EEC98E8673B039471D0E403B05CD /* PCBC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PCBC.swift; path = Sources/CryptoSwift/BlockMode/PCBC.swift; sourceTree = ""; }; 5B30BDDC9AD9C2380BF6791299AE1FBE /* Subtraction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Subtraction.swift; path = Sources/CryptoSwift/CS_BigInt/Subtraction.swift; sourceTree = ""; }; + 5B4434D04B297F5AA300030644FC6AED /* abacus.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = abacus.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 5E828917FF2AA3CC6B23ECF8A598B684 /* CryptoSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CryptoSwift.release.xcconfig; sourceTree = ""; }; 61300E9B71B8A176D5EAA3B605958848 /* AES.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AES.swift; path = Sources/CryptoSwift/AES.swift; sourceTree = ""; }; 64F91D24D56FF58C2F34255BCC0CA8D2 /* Strideable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Strideable.swift; path = Sources/CryptoSwift/CS_BigInt/Strideable.swift; sourceTree = ""; }; @@ -229,15 +229,15 @@ 70AEA7453A63A13648C04F8DBDA947E8 /* Pods-abacus.iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-abacus.iosTests-dummy.m"; sourceTree = ""; }; 72ED5A3746B04AD8516BAA07DEB0AFFB /* Rabbit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rabbit.swift; path = Sources/CryptoSwift/Rabbit.swift; sourceTree = ""; }; 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 7387438C7495F77B43770D7B6FC19DEA /* abacus.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = abacus.debug.xcconfig; sourceTree = ""; }; + 741487B600AA498D6CA5F665C3E8FB41 /* Abacus.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Abacus.framework; path = build/cocoapods/framework/Abacus.framework; sourceTree = ""; }; 75EBB1F2A3091B11F34E2303C5FF61FF /* Integer Conversion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Integer Conversion.swift"; path = "Sources/CryptoSwift/CS_BigInt/Integer Conversion.swift"; sourceTree = ""; }; 770402A5FA60DB3BB6604065DEAF7112 /* Updatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Updatable.swift; path = Sources/CryptoSwift/Updatable.swift; sourceTree = ""; }; 77C0EE24E7443418813C133F648727B2 /* BigInt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BigInt.swift; path = Sources/CryptoSwift/CS_BigInt/BigInt.swift; sourceTree = ""; }; 78AB32080590FEF8DC83D622EA15A854 /* RSA+Signature.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RSA+Signature.swift"; path = "Sources/CryptoSwift/RSA/RSA+Signature.swift"; sourceTree = ""; }; 7996373D44C9A5554EA9135984BC01DB /* Pods-abacus.iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-abacus.iosTests.release.xcconfig"; sourceTree = ""; }; - 7DDE94C33DA441C757D1443A9E6029D8 /* abacus.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = abacus.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 80BE961EA000C9CB92BFA1E9F5768324 /* String+FoundationExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+FoundationExtension.swift"; path = "Sources/CryptoSwift/Foundation/String+FoundationExtension.swift"; sourceTree = ""; }; 80CCC2677D931811101207B70F1D6228 /* Utils+Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Utils+Foundation.swift"; path = "Sources/CryptoSwift/Foundation/Utils+Foundation.swift"; sourceTree = ""; }; - 8185A52ED7B207F675CF2934EC63EA6D /* abacus.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = abacus.debug.xcconfig; sourceTree = ""; }; 82E21560551522E26DA29FC2711C8B79 /* UInt64+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UInt64+Extension.swift"; path = "Sources/CryptoSwift/UInt64+Extension.swift"; sourceTree = ""; }; 8401ED14FF39BBF39217A88493885CA8 /* BlockDecryptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockDecryptor.swift; path = Sources/CryptoSwift/BlockDecryptor.swift; sourceTree = ""; }; 8829F5E52FB40D40BE9F6752C2C053EE /* Pods-abacus.ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-abacus.ios-umbrella.h"; sourceTree = ""; }; @@ -274,7 +274,6 @@ BE661C419D51DFFFB6B607BA7129ACE8 /* AEADChaCha20Poly1305.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AEADChaCha20Poly1305.swift; path = Sources/CryptoSwift/AEAD/AEADChaCha20Poly1305.swift; sourceTree = ""; }; BEB92CA3382C315CBB298FD2AED86DAA /* CryptoSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = CryptoSwift.modulemap; sourceTree = ""; }; C092A9F126768AFC3252AC09865ADD00 /* UInt128.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UInt128.swift; path = Sources/CryptoSwift/UInt128.swift; sourceTree = ""; }; - C14B99ACD1414B162CCDFC4980F61545 /* Abacus.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Abacus.framework; path = build/cocoapods/framework/Abacus.framework; sourceTree = ""; }; C2FEF290DD729D9EEDDCCFA0F8D26A2D /* ISO10126Padding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO10126Padding.swift; path = Sources/CryptoSwift/ISO10126Padding.swift; sourceTree = ""; }; C38A4324A470C5585A01FF30D07C9DF4 /* Data Conversion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data Conversion.swift"; path = "Sources/CryptoSwift/CS_BigInt/Data Conversion.swift"; sourceTree = ""; }; C3D50E92BF2CBF4A9B65921871BDF2FF /* ASN1Scanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ASN1Scanner.swift; path = Sources/CryptoSwift/ASN1/ASN1Scanner.swift; sourceTree = ""; }; @@ -310,7 +309,6 @@ F3BBCD0680550B4404763E23B515A31F /* OCB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OCB.swift; path = Sources/CryptoSwift/BlockMode/OCB.swift; sourceTree = ""; }; F702C9EC7CE0BC75E37AA56B71F7E614 /* AES.Cryptors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AES.Cryptors.swift; path = Sources/CryptoSwift/AES.Cryptors.swift; sourceTree = ""; }; F81274EDB681F11E7CB05F7DCA2BB33C /* CryptoSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CryptoSwift; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FEB3D1B3294D15FB6DBA2952BAE81186 /* abacus-copy-dsyms.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "abacus-copy-dsyms.sh"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -341,6 +339,25 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 11D79B65BBCD0960017163F4C9B7E49A /* abacus */ = { + isa = PBXGroup; + children = ( + FED2887D0E5091C4759D8D8ADFF59C66 /* Frameworks */, + 8C61F33543ADD6CAD21A0CF0AA823AAF /* Pod */, + 6B380C499C1E361C8E35461210459B6B /* Support Files */, + ); + name = abacus; + path = "/Users/zhenqianhe/v4-abacus"; + sourceTree = ""; + }; + 28A0B44B5E70F779B3A567F1AE82D8B7 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 11D79B65BBCD0960017163F4C9B7E49A /* abacus */, + ); + name = "Development Pods"; + sourceTree = ""; + }; 578452D2E740E91742655AC8F1636D1F /* iOS */ = { isa = PBXGroup; children = ( @@ -349,12 +366,14 @@ name = iOS; sourceTree = ""; }; - 739C485E60C1DDFC7A3EBC06D0A3072C /* Pod */ = { + 6B380C499C1E361C8E35461210459B6B /* Support Files */ = { isa = PBXGroup; children = ( - 7DDE94C33DA441C757D1443A9E6029D8 /* abacus.podspec */, + 7387438C7495F77B43770D7B6FC19DEA /* abacus.debug.xcconfig */, + 1E1F36967D766BC17B1215E06682912E /* abacus.release.xcconfig */, ); - name = Pod; + name = "Support Files"; + path = "integration/iOS/Pods/Target Support Files/abacus"; sourceTree = ""; }; 77BFA6027665EBACC42B94A7C2372871 /* Pods-abacus.iosTests */ = { @@ -373,17 +392,6 @@ path = "Target Support Files/Pods-abacus.iosTests"; sourceTree = ""; }; - 7CA89820B7C615522A1E103AFE897113 /* Support Files */ = { - isa = PBXGroup; - children = ( - FEB3D1B3294D15FB6DBA2952BAE81186 /* abacus-copy-dsyms.sh */, - 8185A52ED7B207F675CF2934EC63EA6D /* abacus.debug.xcconfig */, - 3B9814D8EB9409314A6ECBBAE173E4AE /* abacus.release.xcconfig */, - ); - name = "Support Files"; - path = "integration/iOS/Pods/Target Support Files/abacus"; - sourceTree = ""; - }; 7D94CDF401128D689D2B11EDCC7ECD3A /* Products */ = { isa = PBXGroup; children = ( @@ -394,12 +402,12 @@ name = Products; sourceTree = ""; }; - 90A2ECA4CB85E9B524F94B07F44602BA /* Development Pods */ = { + 8C61F33543ADD6CAD21A0CF0AA823AAF /* Pod */ = { isa = PBXGroup; children = ( - D9B301EFE4BB95FFB9601DF90BE5310C /* abacus */, + 5B4434D04B297F5AA300030644FC6AED /* abacus.podspec */, ); - name = "Development Pods"; + name = Pod; sourceTree = ""; }; 915C28C583640C124E56AE6BB9F0DAB2 /* CryptoSwift */ = { @@ -521,14 +529,6 @@ path = CryptoSwift; sourceTree = ""; }; - AAA3C44113D6B89851396A22AFA71EC6 /* Frameworks */ = { - isa = PBXGroup; - children = ( - C14B99ACD1414B162CCDFC4980F61545 /* Abacus.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; B284BBC13E1216FA4484D74F45F3F36F /* Pods-abacus.ios */ = { isa = PBXGroup; children = ( @@ -559,7 +559,7 @@ isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 90A2ECA4CB85E9B524F94B07F44602BA /* Development Pods */, + 28A0B44B5E70F779B3A567F1AE82D8B7 /* Development Pods */, D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, DA389CCA0C382AECE0DD24ED555B7245 /* Pods */, 7D94CDF401128D689D2B11EDCC7ECD3A /* Products */, @@ -575,17 +575,6 @@ name = Frameworks; sourceTree = ""; }; - D9B301EFE4BB95FFB9601DF90BE5310C /* abacus */ = { - isa = PBXGroup; - children = ( - AAA3C44113D6B89851396A22AFA71EC6 /* Frameworks */, - 739C485E60C1DDFC7A3EBC06D0A3072C /* Pod */, - 7CA89820B7C615522A1E103AFE897113 /* Support Files */, - ); - name = abacus; - path = "/Users/ruihuang/v4-abacus"; - sourceTree = ""; - }; DA389CCA0C382AECE0DD24ED555B7245 /* Pods */ = { isa = PBXGroup; children = ( @@ -609,6 +598,14 @@ path = "../Target Support Files/CryptoSwift"; sourceTree = ""; }; + FED2887D0E5091C4759D8D8ADFF59C66 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 741487B600AA498D6CA5F665C3E8FB41 /* Abacus.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -671,7 +668,7 @@ buildRules = ( ); dependencies = ( - 1F67D19EAC36A41088EB458D7432B293 /* PBXTargetDependency */, + AC2EBD83354400DAA47E7F9069901F4A /* PBXTargetDependency */, ); name = "Pods-abacus.iosTests"; productName = Pods_abacus_iosTests; @@ -702,8 +699,8 @@ BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1500; - LastUpgradeCheck = 1500; + LastSwiftUpdateCheck = 1300; + LastUpgradeCheck = 1300; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 13.0"; @@ -751,24 +748,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 903ECA29140368245E4B69BE2D0DBCA4 /* [CP] Copy dSYMs */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/abacus/abacus-copy-dsyms-input-files.xcfilelist", - ); - name = "[CP] Copy dSYMs"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/abacus/abacus-copy-dsyms-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/abacus/abacus-copy-dsyms.sh\"\n"; - showEnvVarsInLog = 0; - }; - DB36ACE8A857E9B93C25EA309FF42C2A /* [CP-User] Build abacus */ = { + 1403E0AEBF8A2087DF8CACA188B609E8 /* [CP-User] Build abacus */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -918,11 +898,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1F67D19EAC36A41088EB458D7432B293 /* PBXTargetDependency */ = { + AC2EBD83354400DAA47E7F9069901F4A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-abacus.ios"; target = 469F25E790D19440507BF938A40578A7 /* Pods-abacus.ios */; - targetProxy = 174DE097054DE7A0410C57AF4AEF5A1A /* PBXContainerItemProxy */; + targetProxy = F99C8B5A9E9146040BECE7ABFD8E196E /* PBXContainerItemProxy */; }; CF848ADCA9D462971E67CA041BBB55DD /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -976,6 +956,23 @@ }; name = Debug; }; + 22B0388248EDA44270493DDECC58CF78 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1E1F36967D766BC17B1215E06682912E /* abacus.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 4C06C857647A16E5CF368D22DFA55BAF /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 0ECEA0D8830DCE37C7297C5F1342B08E /* Pods-abacus.ios.release.xcconfig */; @@ -1049,6 +1046,22 @@ }; name = Debug; }; + 5B331F72A7F4402311EBC4A06282E60D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7387438C7495F77B43770D7B6FC19DEA /* abacus.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; 5D1E4AA7093DAD0F254B24C6406C303C /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7996373D44C9A5554EA9135984BC01DB /* Pods-abacus.iosTests.release.xcconfig */; @@ -1215,39 +1228,6 @@ }; name = Debug; }; - 96B05028328C5704FCE6A41A515364C0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8185A52ED7B207F675CF2934EC63EA6D /* abacus.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - B0264023D64B16BF2F6C8B4C076E862A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B9814D8EB9409314A6ECBBAE173E4AE /* abacus.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; F3A0E769E09875E7B65318E499E93FAC /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5E828917FF2AA3CC6B23ECF8A598B684 /* CryptoSwift.release.xcconfig */; @@ -1324,15 +1304,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 127F9C06E33E9DC2AB3876F089264EB1 /* Build configuration list for PBXAggregateTarget "abacus" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 96B05028328C5704FCE6A41A515364C0 /* Debug */, - B0264023D64B16BF2F6C8B4C076E862A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 2ECD87CECC0DF0128DB6EE0BDC2D9E8A /* Build configuration list for PBXNativeTarget "CryptoSwift" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1351,6 +1322,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + B36D4FC54F44832C64D6BFCFC7EF4665 /* Build configuration list for PBXAggregateTarget "abacus" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5B331F72A7F4402311EBC4A06282E60D /* Debug */, + 22B0388248EDA44270493DDECC58CF78 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; D5458BD03143642191683A4348FED1F8 /* Build configuration list for PBXNativeTarget "Pods-abacus.ios" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.debug.xcconfig b/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.debug.xcconfig index c306fb0b0..35a7ac658 100644 --- a/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.debug.xcconfig +++ b/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.debug.xcconfig @@ -1,7 +1,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwift GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.release.xcconfig b/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.release.xcconfig index c306fb0b0..35a7ac658 100644 --- a/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.release.xcconfig +++ b/integration/iOS/Pods/Target Support Files/CryptoSwift/CryptoSwift.release.xcconfig @@ -1,7 +1,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwift GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios-frameworks.sh b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios-frameworks.sh index 91b03c4c7..f3fa5fd5a 100755 --- a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios-frameworks.sh +++ b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios-frameworks.sh @@ -18,7 +18,7 @@ echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" BCSYMBOLMAP_DIR="BCSymbolMaps" diff --git a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.debug.xcconfig b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.debug.xcconfig index bb1b3d88e..3340eaffa 100644 --- a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.debug.xcconfig +++ b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.debug.xcconfig @@ -4,7 +4,7 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwi GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwift/CryptoSwift.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_LDFLAGS = $(inherited) -l"c++" -framework "Abacus" -framework "CryptoSwift" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.release.xcconfig b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.release.xcconfig index bb1b3d88e..3340eaffa 100644 --- a/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.release.xcconfig +++ b/integration/iOS/Pods/Target Support Files/Pods-abacus.ios/Pods-abacus.ios.release.xcconfig @@ -4,7 +4,7 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwi GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CryptoSwift/CryptoSwift.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift OTHER_LDFLAGS = $(inherited) -l"c++" -framework "Abacus" -framework "CryptoSwift" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManager.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManager.kt index a9fa13fd6..06fa57b2d 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManager.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManager.kt @@ -1,5 +1,6 @@ package exchange.dydx.abacus.state.manager +import exchange.dydx.abacus.output.ComplianceAction import exchange.dydx.abacus.output.Documentation import exchange.dydx.abacus.output.Restriction import exchange.dydx.abacus.output.input.SelectionOption @@ -518,6 +519,15 @@ class AsyncAbacusStateManager( } } + override fun triggerCompliance(action: ComplianceAction, callback: TransactionCallback) { + try { + adaptor?.triggerCompliance(action, callback) + } catch (e: Exception) { + val error = V4TransactionErrors.error(null, e.toString()) + callback(false, error, null) + } + } + internal fun parseTransactionResponse(response: String?): ParsingError? { return adaptor?.parseTransactionResponse(response) } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManagerProtocol.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManagerProtocol.kt index fef17121d..581093cfc 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManagerProtocol.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/AsyncAbacusStateManagerProtocol.kt @@ -1,5 +1,6 @@ package exchange.dydx.abacus.state.manager +import exchange.dydx.abacus.output.ComplianceAction import exchange.dydx.abacus.output.Documentation import exchange.dydx.abacus.output.Restriction import exchange.dydx.abacus.output.input.SelectionOption @@ -80,6 +81,9 @@ interface AsyncAbacusStateManagerProtocol { // Screen for restrictions fun screen(address: String, callback: (restriction: Restriction) -> Unit) + + // Trigger update for compliance + fun triggerCompliance(action: ComplianceAction, callback: TransactionCallback) } @JsExport diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/Enviroment.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/Enviroment.kt index abc603589..dc3546664 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/Enviroment.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/Enviroment.kt @@ -32,6 +32,7 @@ data class EnvironmentEndpoints( val faucet: String?, val squid: String?, val nobleValidator: String?, + val geo: String?, ) { companion object { fun parse( @@ -47,7 +48,8 @@ data class EnvironmentEndpoints( val faucet = parser.asString(data["faucet"]) val squid = parser.asString(data["0xsquid"]) val nobleValidator = parser.asString(data["nobleValidator"]) - return EnvironmentEndpoints(indexers, validators, faucet, squid, nobleValidator) + val geo = parser.asString(data["geo"]) + return EnvironmentEndpoints(indexers, validators, faucet, squid, nobleValidator, geo) } } } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt index e5b8b27c0..5281a6f46 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt @@ -1802,6 +1802,16 @@ open class StateManagerAdaptor( callback(false, V4TransactionErrors.error(null, "Not implemented"), null) } + internal open fun triggerCompliance(action: ComplianceAction, callback: TransactionCallback) { + accountAddress?.let { + if (compliance.status != ComplianceStatus.UNKNOWN) { + updateCompliance(DydxAddress(it), compliance.status, action) + callback(true, null, null) + } + } + callback(false, V4TransactionErrors.error(null, "No account address"), null) + } + internal open fun parseTransactionResponse(response: String?): ParsingError? { return null } @@ -2454,13 +2464,14 @@ open class StateManagerAdaptor( return compliance.status } - private fun updateCompliance(address: DydxAddress, status: ComplianceStatus) { + private fun updateCompliance(address: DydxAddress, status: ComplianceStatus, complianceAction: ComplianceAction? = null) { val message = "Compliance verification message" - val action = if ((stateMachine.state?.account?.subaccounts?.size ?: 0) > 0) { - ComplianceAction.CONNECT - } else { - ComplianceAction.ONBOARD - } + val action = complianceAction + ?: if ((stateMachine.state?.account?.subaccounts?.size ?: 0) > 0) { + ComplianceAction.CONNECT + } else { + ComplianceAction.ONBOARD + } val payload = jsonEncoder.encode( mapOf( "message" to message, diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt index 443a0d5f2..226f96cce 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt @@ -244,8 +244,8 @@ class V4StateManagerAdaptor( return configs.publicApiUrl("screen") } - override fun geoUrl(): String { - return "https://api.dydx.exchange/v4/geo" + override fun geoUrl(): String? { + return environment.endpoints.geo } override fun complianceScreenUrl(address: String): String? { diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/AsyncAbacusStateManagerV2.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/AsyncAbacusStateManagerV2.kt index 9177da785..bac742fe5 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/AsyncAbacusStateManagerV2.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/AsyncAbacusStateManagerV2.kt @@ -1,5 +1,6 @@ package exchange.dydx.abacus.state.v2.manager +import exchange.dydx.abacus.output.ComplianceAction import exchange.dydx.abacus.output.Documentation import exchange.dydx.abacus.output.Restriction import exchange.dydx.abacus.output.input.SelectionOption @@ -541,6 +542,15 @@ class AsyncAbacusStateManagerV2( } } + override fun triggerCompliance(action: ComplianceAction, callback: TransactionCallback) { + try { + adaptor?.triggerCompliance(action, callback) + } catch (e: Exception) { + val error = V4TransactionErrors.error(null, e.toString()) + callback(false, error, null) + } + } + // Bridge functions. // If client is not using cancelOrder function, it should call orderCanceled function with // payload from v4-client to process state diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/StateManagerAdaptorV2.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/StateManagerAdaptorV2.kt index 6d340bd40..bfeccf111 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/StateManagerAdaptorV2.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/manager/StateManagerAdaptorV2.kt @@ -1,5 +1,8 @@ package exchange.dydx.abacus.state.v2.manager +import exchange.dydx.abacus.output.Compliance +import exchange.dydx.abacus.output.ComplianceAction +import exchange.dydx.abacus.output.ComplianceStatus import exchange.dydx.abacus.output.Notification import exchange.dydx.abacus.output.PerpetualState import exchange.dydx.abacus.output.Restriction @@ -70,6 +73,7 @@ import exchange.dydx.abacus.state.v2.supervisor.stopWatchingLastOrder import exchange.dydx.abacus.state.v2.supervisor.subaccountNumber import exchange.dydx.abacus.state.v2.supervisor.subaccountTransferPayload import exchange.dydx.abacus.state.v2.supervisor.trade +import exchange.dydx.abacus.state.v2.supervisor.triggerCompliance import exchange.dydx.abacus.state.v2.supervisor.triggerOrders import exchange.dydx.abacus.state.v2.supervisor.triggerOrdersPayload import exchange.dydx.abacus.state.v2.supervisor.withdrawPayload @@ -81,6 +85,7 @@ import exchange.dydx.abacus.utils.Parser import exchange.dydx.abacus.utils.UIImplementations import kollections.JsExport import kollections.iListOf +import kollections.toIMap @JsExport internal class StateManagerAdaptorV2( @@ -170,6 +175,14 @@ internal class StateManagerAdaptorV2( } } + internal open var geo: String? = null + set(value) { + if (field != value) { + field = value + didSetGeo(value) + } + } + internal var readyToConnect: Boolean = false internal set(value) { if (field != value) { @@ -298,6 +311,9 @@ internal class StateManagerAdaptorV2( onboarding.readyToConnect = readyToConnect markets.readyToConnect = readyToConnect accounts.readyToConnect = readyToConnect + if (readyToConnect) { + fetchGeo() + } } private fun didSetIndexerConnected(indexerConnected: Boolean) { @@ -429,6 +445,30 @@ internal class StateManagerAdaptorV2( return null } + private fun fetchGeo() { + val url = environment.endpoints.geo + if (url != null) { + networkHelper.get( + url, + null, + null, + callback = { _, response, httpCode, _ -> + geo = if (networkHelper.success(httpCode) && response != null) { + val payload = networkHelper.parser.decodeJsonObject(response)?.toIMap() + if (payload != null) { + val country = networkHelper.parser.asString(networkHelper.parser.value(payload, "geo.country")) + country + } else { + null + } + } else { + null + } + }, + ) + } + } + internal fun trade(data: String?, type: TradeInputField?) { accounts.trade(data, type) } @@ -553,6 +593,10 @@ internal class StateManagerAdaptorV2( accounts.screen(address, callback) } + internal fun triggerCompliance(address: ComplianceAction, callback: TransactionCallback) { + accounts.triggerCompliance(address, callback) + } + private fun updateRestriction(indexerRestriction: UsageRestriction?) { restriction = indexerRestriction ?: accounts.addressRestriction ?: UsageRestriction.noRestriction } @@ -589,4 +633,37 @@ internal class StateManagerAdaptorV2( ) } } + + private fun didSetGeo(geo: String?) { + val state = stateMachine.state + stateMachine.state = PerpetualState( + state?.assets, + state?.marketsSummary, + state?.orderbooks, + state?.candles, + state?.trades, + state?.historicalFundings, + state?.wallet, + state?.account, + state?.historicalPnl, + state?.fills, + state?.transfers, + state?.fundingPayments, + state?.configs, + state?.input, + state?.availableSubaccountNumbers ?: iListOf(), + state?.transferStatuses, + state?.restriction, + state?.launchIncentive, + Compliance(geo, state?.compliance?.status ?: ComplianceStatus.COMPLIANT), + ) + ioImplementations.threading?.async(ThreadingType.main) { + stateNotification?.stateChanged( + stateMachine.state, + StateChanges( + iListOf(Changes.restriction), + ), + ) + } + } } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountSupervisor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountSupervisor.kt index 155534018..79c41df89 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountSupervisor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountSupervisor.kt @@ -1,6 +1,9 @@ package exchange.dydx.abacus.state.v2.supervisor import com.ionspin.kotlin.bignum.decimal.BigDecimal +import exchange.dydx.abacus.output.Compliance +import exchange.dydx.abacus.output.ComplianceAction +import exchange.dydx.abacus.output.ComplianceStatus import exchange.dydx.abacus.output.Notification import exchange.dydx.abacus.output.PerpetualState import exchange.dydx.abacus.output.Restriction @@ -11,6 +14,7 @@ import exchange.dydx.abacus.protocols.ThreadingType import exchange.dydx.abacus.protocols.TransactionCallback import exchange.dydx.abacus.protocols.TransactionType import exchange.dydx.abacus.responses.SocketInfo +import exchange.dydx.abacus.state.app.adaptors.V4TransactionErrors import exchange.dydx.abacus.state.changes.Changes import exchange.dydx.abacus.state.changes.StateChanges import exchange.dydx.abacus.state.manager.ApiData @@ -24,6 +28,9 @@ import exchange.dydx.abacus.state.manager.HumanReadableTriggerOrdersPayload import exchange.dydx.abacus.state.manager.HumanReadableWithdrawPayload import exchange.dydx.abacus.state.manager.pendingCctpWithdraw import exchange.dydx.abacus.state.manager.processingCctpWithdraw +import exchange.dydx.abacus.state.manager.utils.Address +import exchange.dydx.abacus.state.manager.utils.DydxAddress +import exchange.dydx.abacus.state.manager.utils.EvmAddress import exchange.dydx.abacus.state.model.ClosePositionInputField import exchange.dydx.abacus.state.model.TradeInputField import exchange.dydx.abacus.state.model.TradingStateMachine @@ -41,10 +48,12 @@ import exchange.dydx.abacus.utils.IMap import exchange.dydx.abacus.utils.Logger import exchange.dydx.abacus.utils.iMapOf import exchange.dydx.abacus.utils.mutable +import exchange.dydx.abacus.utils.toJsonPrettyPrint import exchange.dydx.abacus.utils.toNobleAddress import kollections.iListOf import kollections.iSetOf import kollections.toIMap +import kotlin.collections.mutableMapOf import kotlin.time.Duration.Companion.days internal open class AccountSupervisor( @@ -125,6 +134,14 @@ internal open class AccountSupervisor( } } + private var complianceStatus: ComplianceStatus = ComplianceStatus.COMPLIANT + set(value) { + if (field != value) { + field = value + didSetComplianceStatus(value) + } + } + private var screenAccountAddressTimer: LocalTimerProtocol? = null set(value) { if (field !== value) { @@ -182,6 +199,7 @@ internal open class AccountSupervisor( init { screenAccountAddress() + complianceScreen(DydxAddress(accountAddress)) } internal fun subscribeToSubaccount(subaccountNumber: Int) { @@ -569,6 +587,123 @@ internal open class AccountSupervisor( } } + private fun handleComplianceResponse(response: String?, httpCode: Int): ComplianceStatus { + complianceStatus = if (helper.success(httpCode) && response != null) { + val res = helper.parser.decodeJsonObject(response)?.toIMap() + if (res != null) { + val status = helper.parser.asString(res["status"]) + val complianceStatus = + if (status != null) { + ComplianceStatus.valueOf(status) + } else { + ComplianceStatus.UNKNOWN + } + complianceStatus + } else { + ComplianceStatus.UNKNOWN + } + } else { + ComplianceStatus.UNKNOWN + } + return complianceStatus + } + + private fun updateCompliance(address: DydxAddress, status: ComplianceStatus, complianceAction: ComplianceAction? = null) { + val message = "Compliance verification message" + val action = complianceAction + ?: if ((stateMachine.state?.account?.subaccounts?.size ?: 0) > 0) { + ComplianceAction.CONNECT + } else { + ComplianceAction.ONBOARD + } + val payload = helper.jsonEncoder.encode( + mapOf( + "message" to message, + "action" to action.toString(), + "status" to status.toString(), + ), + ) + helper.transaction( + TransactionType.SignCompliancePayload, + payload, + ) { additionalPayload -> + val error = parseTransactionResponse(additionalPayload) + val result = helper.parser.decodeJsonObject(additionalPayload) + + if (error == null && result != null) { + val url = complianceGeoblockUrl() + val signedMessage = helper.parser.asString(result["signedMessage"]) + val publicKey = helper.parser.asString(result["publicKey"]) + val timestamp = helper.parser.asString(result["timestamp"]) + + val isUrlAndKeysPresent = + url != null && signedMessage != null && publicKey != null && timestamp != null + val isStatusValid = status != ComplianceStatus.UNKNOWN + + if (isUrlAndKeysPresent && isStatusValid) { + val body: IMap = iMapOf( + "address" to address.rawAddress, + "message" to message, + "currentStatus" to status.toString(), + "action" to action.toString(), + "signedMessage" to signedMessage!!, + "pubkey" to publicKey!!, + "timestamp" to timestamp!!, + ) + val header = iMapOf( + "Content-Type" to "application/json", + ) + helper.post( + url!!, + header, + body.toJsonPrettyPrint(), + callback = { _, response, httpCode, _ -> + handleComplianceResponse(response, httpCode) + }, + ) + } else { + complianceStatus = ComplianceStatus.UNKNOWN + } + } else { + complianceStatus = ComplianceStatus.UNKNOWN + } + } + } + + private fun complianceScreen(address: Address) { + val url = complianceScreenUrl(address.rawAddress) + if (url != null) { + helper.get( + url, + null, + null, + callback = { _, response, httpCode, _ -> + val complianceStatus = handleComplianceResponse(response, httpCode) + if (address is DydxAddress) { + updateCompliance(address, complianceStatus) + } + }, + ) + } + } + + internal open fun triggerCompliance(action: ComplianceAction, callback: TransactionCallback) { + if (complianceStatus != ComplianceStatus.UNKNOWN) { + updateCompliance(DydxAddress(accountAddress), complianceStatus, action) + callback(true, null, null) + } + callback(false, V4TransactionErrors.error(null, "No account address"), null) + } + + private fun complianceScreenUrl(address: String): String? { + val url = helper.configs.publicApiUrl("complianceScreen") ?: return null + return "$url/$address" + } + + private fun complianceGeoblockUrl(): String? { + return helper.configs.publicApiUrl("complianceGeoblock") + } + open fun screenSourceAddress() { val address = sourceAddress if (address != null) { @@ -691,6 +826,7 @@ internal open class AccountSupervisor( sourceAddressRestriction = null if (sourceAddress != null) { screenSourceAddress() + complianceScreen(EvmAddress(sourceAddress)) } } @@ -755,6 +891,39 @@ internal open class AccountSupervisor( } } + private fun didSetComplianceStatus(complianceStatus: ComplianceStatus) { + val state = stateMachine.state + stateMachine.state = PerpetualState( + state?.assets, + state?.marketsSummary, + state?.orderbooks, + state?.candles, + state?.trades, + state?.historicalFundings, + state?.wallet, + state?.account, + state?.historicalPnl, + state?.fills, + state?.transfers, + state?.fundingPayments, + state?.configs, + state?.input, + state?.availableSubaccountNumbers ?: iListOf(), + state?.transferStatuses, + state?.restriction, + state?.launchIncentive, + Compliance(state?.compliance?.geo, complianceStatus), + ) + helper.ioImplementations.threading?.async(ThreadingType.main) { + helper.stateNotification?.stateChanged( + stateMachine.state, + StateChanges( + iListOf(Changes.compliance), + ), + ) + } + } + internal fun receiveSubaccountChannelSocketData( info: SocketInfo, subaccountNumber: Int, diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountsSupervisor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountsSupervisor.kt index 7e0bf999d..b00133f9e 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountsSupervisor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/AccountsSupervisor.kt @@ -1,5 +1,6 @@ package exchange.dydx.abacus.state.v2.supervisor +import exchange.dydx.abacus.output.ComplianceAction import exchange.dydx.abacus.output.Notification import exchange.dydx.abacus.output.Restriction import exchange.dydx.abacus.output.UsageRestriction @@ -324,3 +325,10 @@ internal fun AccountsSupervisor.screen( ) { account?.screen(address, callback) } + +internal fun AccountsSupervisor.triggerCompliance( + action: ComplianceAction, + callback: TransactionCallback +) { + account?.triggerCompliance(action, callback) +} diff --git a/src/commonTest/kotlin/exchange.dydx.abacus/app/manager/v2/V4ForegroundCycleTests.kt b/src/commonTest/kotlin/exchange.dydx.abacus/app/manager/v2/V4ForegroundCycleTests.kt index c985e67a6..f3a56a872 100644 --- a/src/commonTest/kotlin/exchange.dydx.abacus/app/manager/v2/V4ForegroundCycleTests.kt +++ b/src/commonTest/kotlin/exchange.dydx.abacus/app/manager/v2/V4ForegroundCycleTests.kt @@ -119,7 +119,8 @@ class V4ForegroundCycleTests : NetworkTests() { "https://dydx.exchange/v4-launch-incentive/query/ccar-perpetuals", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", - "https://api.examples.com/configs/exchanges.json" + "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo" ] """.trimIndent(), testRest?.requests, @@ -217,6 +218,7 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/sparklines?timePeriod=ONE_DAY", "https://indexer.v4staging.dydx.exchange/v4/candles/perpetualMarkets/ETH-USD?resolution=1DAY", "https://indexer.v4staging.dydx.exchange/v4/historicalFunding/ETH-USD" @@ -286,6 +288,7 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/sparklines?timePeriod=ONE_DAY", "https://indexer.v4staging.dydx.exchange/v4/candles/perpetualMarkets/ETH-USD?resolution=1DAY", "https://indexer.v4staging.dydx.exchange/v4/historicalFunding/ETH-USD", @@ -340,6 +343,7 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/sparklines?timePeriod=ONE_DAY", "https://indexer.v4staging.dydx.exchange/v4/candles/perpetualMarkets/ETH-USD?resolution=1DAY", "https://indexer.v4staging.dydx.exchange/v4/historicalFunding/ETH-USD" @@ -419,7 +423,9 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/screen?address=0xsecondaryFakeAddress", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/0xsecondaryFakeAddress", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/0xsecondaryFakeAddress?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/0xsecondaryFakeAddress", "https://indexer.v4staging.dydx.exchange/v4/historicalTradingRewardAggregations/0xsecondaryFakeAddress?period=WEEKLY" @@ -489,7 +495,9 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/screen?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://indexer.v4staging.dydx.exchange/v4/fills?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm&subaccountNumber=0", @@ -616,7 +624,9 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/screen?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://indexer.v4staging.dydx.exchange/v4/fills?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm&subaccountNumber=0", @@ -679,7 +689,9 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/screen?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://indexer.v4staging.dydx.exchange/v4/fills?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm&subaccountNumber=0", @@ -687,6 +699,7 @@ class V4ForegroundCycleTests : NetworkTests() { "https://indexer.v4staging.dydx.exchange/v4/historical-pnl?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm&subaccountNumber=0", "https://indexer.v4staging.dydx.exchange/v4/historicalTradingRewardAggregations/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm?period=WEEKLY", "https://indexer.v4staging.dydx.exchange/v4/screen?address=cosmos1d67qczf2dz0n30qau2wg893fhpdeekmfu44p4f", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/cosmos1d67qczf2dz0n30qau2wg893fhpdeekmfu44p4f", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/cosmos1d67qczf2dz0n30qau2wg893fhpdeekmfu44p4f?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/cosmos1d67qczf2dz0n30qau2wg893fhpdeekmfu44p4f", "https://indexer.v4staging.dydx.exchange/v4/historicalTradingRewardAggregations/cosmos1d67qczf2dz0n30qau2wg893fhpdeekmfu44p4f?period=WEEKLY" @@ -776,7 +789,9 @@ class V4ForegroundCycleTests : NetworkTests() { "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/chains", "https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app/v1/tokens", "https://api.examples.com/configs/exchanges.json", + "https://api.dydx.exchange/v4/geo", "https://indexer.v4staging.dydx.exchange/v4/screen?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", + "https://indexer.v4staging.dydx.exchange/v4/compliance/screen/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://dydx.exchange/v4-launch-incentive/query/api/dydx/points/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm?n=2", "https://indexer.v4staging.dydx.exchange/v4/addresses/cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm", "https://indexer.v4staging.dydx.exchange/v4/fills?address=cosmos1fq8q55896ljfjj7v3x0qd0z3sr78wmes940uhm&subaccountNumber=0", diff --git a/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/AbacusMockData.kt b/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/AbacusMockData.kt index f04ed68c4..dc27cc5d0 100644 --- a/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/AbacusMockData.kt +++ b/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/AbacusMockData.kt @@ -63,6 +63,7 @@ class AbacusMockData { null, null, null, + null, ), null, WalletConnection( diff --git a/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/EnvironmentsMock.kt b/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/EnvironmentsMock.kt index de8363901..46fb195a6 100644 --- a/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/EnvironmentsMock.kt +++ b/src/commonTest/kotlin/exchange.dydx.abacus/tests/payloads/EnvironmentsMock.kt @@ -83,7 +83,8 @@ class EnvironmentsMock { "validators":[ "https://validator.v4staging.dydx.exchange" ], - "0xsquid":"https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app" + "0xsquid":"https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app", + "geo": "https://api.dydx.exchange/v4/geo" }, "featureFlags":{ "reduceOnlySupported":true, @@ -117,7 +118,8 @@ class EnvironmentsMock { "https://test-dydx.kingnodes.com/" ], "0xsquid":"https://squid-api-git-main-cosmos-testnet-0xsquid.vercel.app", - "faucet":"https://faucet.v4testnet.dydx.exchange" + "faucet":"https://faucet.v4testnet.dydx.exchange", + "geo": "https://api.dydx.exchange/v4/geo" }, "featureFlags":{ "reduceOnlySupported":false, diff --git a/v4_abacus.podspec b/v4_abacus.podspec index fa7356ea8..75fa009f8 100644 --- a/v4_abacus.podspec +++ b/v4_abacus.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'v4_abacus' - spec.version = '1.6.54' + spec.version = '1.6.55' spec.homepage = 'https://github.com/dydxprotocol/v4-abacus' spec.source = { :http=> ''} spec.authors = ''