Repository: SteadyAction/EtherWalletKit
Branch: develop
Commit: 3962c14ecf57
Files: 30
Total size: 76.0 KB
Directory structure:
gitextract_ee0jz0ij/
├── .gitignore
├── Docs/
│ └── Document.md
├── EtherWalletKit.podspec
├── EtherWalletKit.xcodeproj/
│ ├── EtherWalletKitTests_Info.plist
│ ├── EtherWalletKit_Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── EtherWalletKit-Package.xcscheme
│ └── xcschememanagement.plist
├── EtherWalletKit.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── EtherWalletKitTest/
│ ├── EtherWalletKitTest.swift
│ └── Info.plist
├── LICENSE
├── Package.swift
├── Podfile
├── README.md
└── Sources/
├── Structure/
│ ├── EtherscanAPIResponse.swift
│ ├── EthplorerAPIResponse.swift
│ ├── GasStationAPIResponse.swift
│ └── TransactionData.swift
└── Wallet/
├── EtherWallet+Account.swift
├── EtherWallet+Balance.swift
├── EtherWallet+History.swift
├── EtherWallet+Info.swift
├── EtherWallet+Transaction.swift
├── EtherWallet+Util.swift
├── EtherWallet.swift
├── EtherWalletTestnets.swift
└── WalletError.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.DS_Store
/.build
/Packages
*.xcuserstate
xcuserdata/
Pods/
================================================
FILE: Docs/Document.md
================================================
## Getting Started
#### 0. Don't forget to import it
``` swift
import EtherWalletKit
```
#### Mainet or Testnet(Rinkeby)
If you want to work on the testnet(Rinkeby), use `EtherWalletRinkeby` instead of `EtherWallet`.
#### Create an Ethereum Wallet
```swift
// Generate a new account with its new password.
try? EtherWallet.account.generateAccount(password: "ABCDEFG")
// Import an existing account from its private key and set its new password.
try? EtherWallet.account.importAccount(privateKey: "1dcbc1d6e0a4587a3a9095984cf051a1bc6ed975f15380a0ac97f01c0c045062, password: "ABCDEFG")
```
Note: ```password``` will be encrypted and saved to the device and it will be required to access the wallet.
#### Get account information
```swift
// Get address of your account
let address = EtherWallet.account.address
// Get private key of your account
let privateKey = try! EtherWallet.account.privateKey(password: "ABCDEFG")
```
#### Get balance
```swift
// Get balance of Ether
EtherWallet.balance.etherBalance { balance in
print(balance)
}
// Get balance of a token
EtherWallet.balance.tokenBalance(contractAddress: "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07") { balance in
print(balance)
}
```
#### Send
```swift
// send Ether to an address.
EtherWallet.transaction.sendEther(to: "0x7777787C97a35d37Db8E5afb0C92BCfd4F6480bE", amount: "1.5", password: "ABCDEFG") { txHash in
print(txHash)
}
// send a token to an address.
EtherWallet.transaction.sendToken(to: "0x7777787C97a35d37Db8E5afb0C92BCfd4F6480bE", contractAddress: "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", amount: "20", password: "ABCDEFG", decimal: 18) { txHash in
print(txHash)
}
```
Note: ```password``` should be eqaul to the password of wallet created. Also you can put ```gasPrice``` as an extra parameter to set gas price for the transcation.
================================================
FILE: EtherWalletKit.podspec
================================================
#
# Be sure to run `pod lib lint EtherWalletKit.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'EtherWalletKit'
s.version = '0.1.4'
s.summary = 'Ethereum Wallet Toolkit for iOS'
s.swift_version = '4.0'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
Ethereum Wallet Toolkit for iOS - You can implement Ethereum wallet without a server and blockchain knowledge.
DESC
s.homepage = 'https://github.com/SteadyAction/EtherWalletKit'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'SteadyAction' => 'steadyaction@gmail.com' }
s.source = { :git => 'https://github.com/SteadyAction/EtherWalletKit.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '10.0'
s.source_files = 'Sources/**/*'
# s.resource_bundles = {
# 'EtherWalletKit' => ['EtherWalletKit/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
s.dependency 'web3swift', '~> 2.0'
s.dependency 'SwiftKeychainWrapper'
end
================================================
FILE: EtherWalletKit.xcodeproj/EtherWalletKitTests_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: EtherWalletKit.xcodeproj/EtherWalletKit_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: EtherWalletKit.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXAggregateTarget section */
EtherWalletKit::EtherWalletKitPackageTests::ProductTarget /* EtherWalletKitPackageTests */ = {
isa = PBXAggregateTarget;
buildConfigurationList = OBJ_31 /* Build configuration list for PBXAggregateTarget "EtherWalletKitPackageTests" */;
buildPhases = (
);
dependencies = (
OBJ_34 /* PBXTargetDependency */,
);
name = EtherWalletKitPackageTests;
productName = EtherWalletKitPackageTests;
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
1EDFEC0DB3B02D59F8E546BB /* Pods_EtherWalletKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF04867D39E0379185470242 /* Pods_EtherWalletKit.framework */; };
E4746BA3B4CE720D158512A1 /* Pods_EtherWalletKitTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D808C8FA634AFA1C9EA96F19 /* Pods_EtherWalletKitTest.framework */; };
E83118B620F3391E00FF3CCC /* EtherWallet+Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83118B520F3391E00FF3CCC /* EtherWallet+Account.swift */; };
E83118BA20F33BCA00FF3CCC /* EtherWallet+Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83118B920F33BC900FF3CCC /* EtherWallet+Balance.swift */; };
E83118C120F4523D00FF3CCC /* EtherWallet+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83118C020F4523A00FF3CCC /* EtherWallet+Transaction.swift */; };
E83C24A120E399B0005645EF /* EtherWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83C24A020E399B0005645EF /* EtherWallet.swift */; };
E83C24AB20E39BE6005645EF /* EtherscanAPIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83C24AA20E39BE6005645EF /* EtherscanAPIResponse.swift */; };
E83C24AF20E39C2F005645EF /* TransactionData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83C24AE20E39C2F005645EF /* TransactionData.swift */; };
E849CEBA20EB1D0700F38B76 /* GasStationAPIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E849CEB920EB1D0700F38B76 /* GasStationAPIResponse.swift */; };
E849CEBC20EB4BA200F38B76 /* EthplorerAPIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E849CEBB20EB4BA200F38B76 /* EthplorerAPIResponse.swift */; };
E849CEBE20EB5C3B00F38B76 /* WalletError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E849CEBD20EB5C3B00F38B76 /* WalletError.swift */; };
E86669C621024E1200F99335 /* EtherWallet+Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = E86669C521024E1200F99335 /* EtherWallet+Util.swift */; };
E8B4753B21002C98004B65E9 /* EtherWallet+Info.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8B4753A21002C98004B65E9 /* EtherWallet+Info.swift */; };
E8CB3D7821043E8D00AC6A14 /* EtherWallet+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8CB3D7721043E8D00AC6A14 /* EtherWallet+History.swift */; };
E8D4CF342109CCB4008476B8 /* EtherWalletTestnets.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D4CF332109CCB4008476B8 /* EtherWalletTestnets.swift */; };
E8D4CF3E2109F07D008476B8 /* EtherWalletKitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D4CF3D2109F07D008476B8 /* EtherWalletKitTest.swift */; };
OBJ_29 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
OBJ_43 /* EtherWalletKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EtherWalletKit::EtherWalletKit::Product /* EtherWalletKit.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
E8665C8320E3939600F4AD19 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = "EtherWalletKit::EtherWalletKit";
remoteInfo = EtherWalletKit;
};
E8665C8420E3939A00F4AD19 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = "EtherWalletKit::EtherWalletKitTests";
remoteInfo = EtherWalletKitTests;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
E8CA9E4F2109FC0600F48458 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
20E55D35F58BE23153B75758 /* Pods-EtherWalletKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKit.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKit/Pods-EtherWalletKit.debug.xcconfig"; sourceTree = "<group>"; };
29F409A933CCEC902753AC43 /* Pods_EtherWalletKit_EtherWalletKitTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EtherWalletKit_EtherWalletKitTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
58BEAAFE6E50744CCC966592 /* Pods-EtherWalletKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKit.release.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKit/Pods-EtherWalletKit.release.xcconfig"; sourceTree = "<group>"; };
6049B9E4E2D438BB6F94139B /* Pods-EtherWalletKit-EtherWalletKitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKit-EtherWalletKitTest.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKit-EtherWalletKitTest/Pods-EtherWalletKit-EtherWalletKitTest.debug.xcconfig"; sourceTree = "<group>"; };
63C3EA9E421DCB0B6F2524FD /* Pods-EtherWalletKitTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKitTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKitTest/Pods-EtherWalletKitTest.release.xcconfig"; sourceTree = "<group>"; };
74D93172CB9698EEC90AF45E /* Pods-EtherWalletKitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKitTest.debug.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKitTest/Pods-EtherWalletKitTest.debug.xcconfig"; sourceTree = "<group>"; };
CF04867D39E0379185470242 /* Pods_EtherWalletKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EtherWalletKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D808C8FA634AFA1C9EA96F19 /* Pods_EtherWalletKitTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_EtherWalletKitTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E3051174CD82B2B4C9FA3E45 /* Pods-EtherWalletKit-EtherWalletKitTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EtherWalletKit-EtherWalletKitTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-EtherWalletKit-EtherWalletKitTest/Pods-EtherWalletKit-EtherWalletKitTest.release.xcconfig"; sourceTree = "<group>"; };
E83118B520F3391E00FF3CCC /* EtherWallet+Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EtherWallet+Account.swift"; sourceTree = "<group>"; };
E83118B920F33BC900FF3CCC /* EtherWallet+Balance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EtherWallet+Balance.swift"; sourceTree = "<group>"; };
E83118C020F4523A00FF3CCC /* EtherWallet+Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EtherWallet+Transaction.swift"; sourceTree = "<group>"; };
E83C24A020E399B0005645EF /* EtherWallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EtherWallet.swift; sourceTree = "<group>"; };
E83C24AA20E39BE6005645EF /* EtherscanAPIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EtherscanAPIResponse.swift; sourceTree = "<group>"; };
E83C24AE20E39C2F005645EF /* TransactionData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionData.swift; sourceTree = "<group>"; };
E849CEB920EB1D0700F38B76 /* GasStationAPIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GasStationAPIResponse.swift; sourceTree = "<group>"; };
E849CEBB20EB4BA200F38B76 /* EthplorerAPIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EthplorerAPIResponse.swift; sourceTree = "<group>"; };
E849CEBD20EB5C3B00F38B76 /* WalletError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletError.swift; sourceTree = "<group>"; };
E8665C8520E394CF00F4AD19 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
E8665C8620E394CF00F4AD19 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
E8665C8720E394CF00F4AD19 /* EtherWalletKit.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EtherWalletKit.podspec; sourceTree = "<group>"; };
E86669C521024E1200F99335 /* EtherWallet+Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EtherWallet+Util.swift"; sourceTree = "<group>"; };
E8B4753A21002C98004B65E9 /* EtherWallet+Info.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EtherWallet+Info.swift"; sourceTree = "<group>"; };
E8CB3D7721043E8D00AC6A14 /* EtherWallet+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EtherWallet+History.swift"; sourceTree = "<group>"; };
E8D4CF332109CCB4008476B8 /* EtherWalletTestnets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EtherWalletTestnets.swift; sourceTree = "<group>"; };
E8D4CF362109E66D008476B8 /* Document.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Document.md; sourceTree = "<group>"; };
E8D4CF3B2109F07D008476B8 /* EtherWalletKitTest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EtherWalletKitTest.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E8D4CF3D2109F07D008476B8 /* EtherWalletKitTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EtherWalletKitTest.swift; sourceTree = "<group>"; };
E8D4CF3F2109F07D008476B8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
EtherWalletKit::EtherWalletKit::Product /* EtherWalletKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = EtherWalletKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EtherWalletKit::EtherWalletKitTests::Product /* EtherWalletKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = EtherWalletKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
23A961ACB3F6BDC02E74968E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E8D4CF382109F07D008476B8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E4746BA3B4CE720D158512A1 /* Pods_EtherWalletKitTest.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_23 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
1EDFEC0DB3B02D59F8E546BB /* Pods_EtherWalletKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_42 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
OBJ_43 /* EtherWalletKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
287731197E01E164172DCDF5 /* Frameworks */ = {
isa = PBXGroup;
children = (
CF04867D39E0379185470242 /* Pods_EtherWalletKit.framework */,
29F409A933CCEC902753AC43 /* Pods_EtherWalletKit_EtherWalletKitTest.framework */,
D808C8FA634AFA1C9EA96F19 /* Pods_EtherWalletKitTest.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
83A5C5AAC8028885D5C13320 /* Pods */ = {
isa = PBXGroup;
children = (
20E55D35F58BE23153B75758 /* Pods-EtherWalletKit.debug.xcconfig */,
58BEAAFE6E50744CCC966592 /* Pods-EtherWalletKit.release.xcconfig */,
6049B9E4E2D438BB6F94139B /* Pods-EtherWalletKit-EtherWalletKitTest.debug.xcconfig */,
E3051174CD82B2B4C9FA3E45 /* Pods-EtherWalletKit-EtherWalletKitTest.release.xcconfig */,
74D93172CB9698EEC90AF45E /* Pods-EtherWalletKitTest.debug.xcconfig */,
63C3EA9E421DCB0B6F2524FD /* Pods-EtherWalletKitTest.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
E83C249E20E399B0005645EF /* Sources */ = {
isa = PBXGroup;
children = (
E849CEB820EB19C200F38B76 /* Structure */,
E83C249F20E399B0005645EF /* Wallet */,
);
path = Sources;
sourceTree = "<group>";
};
E83C249F20E399B0005645EF /* Wallet */ = {
isa = PBXGroup;
children = (
E83C24A020E399B0005645EF /* EtherWallet.swift */,
E83118B520F3391E00FF3CCC /* EtherWallet+Account.swift */,
E83118B920F33BC900FF3CCC /* EtherWallet+Balance.swift */,
E83118C020F4523A00FF3CCC /* EtherWallet+Transaction.swift */,
E8B4753A21002C98004B65E9 /* EtherWallet+Info.swift */,
E8CB3D7721043E8D00AC6A14 /* EtherWallet+History.swift */,
E86669C521024E1200F99335 /* EtherWallet+Util.swift */,
E8D4CF332109CCB4008476B8 /* EtherWalletTestnets.swift */,
E849CEBD20EB5C3B00F38B76 /* WalletError.swift */,
);
path = Wallet;
sourceTree = "<group>";
};
E849CEB820EB19C200F38B76 /* Structure */ = {
isa = PBXGroup;
children = (
E83C24AA20E39BE6005645EF /* EtherscanAPIResponse.swift */,
E849CEB920EB1D0700F38B76 /* GasStationAPIResponse.swift */,
E849CEBB20EB4BA200F38B76 /* EthplorerAPIResponse.swift */,
E83C24AE20E39C2F005645EF /* TransactionData.swift */,
);
path = Structure;
sourceTree = "<group>";
};
E8D4CF352109E66D008476B8 /* Docs */ = {
isa = PBXGroup;
children = (
E8D4CF362109E66D008476B8 /* Document.md */,
);
path = Docs;
sourceTree = "<group>";
};
E8D4CF3C2109F07D008476B8 /* EtherWalletKitTest */ = {
isa = PBXGroup;
children = (
E8D4CF3D2109F07D008476B8 /* EtherWalletKitTest.swift */,
E8D4CF3F2109F07D008476B8 /* Info.plist */,
);
path = EtherWalletKitTest;
sourceTree = "<group>";
};
OBJ_14 /* Products */ = {
isa = PBXGroup;
children = (
EtherWalletKit::EtherWalletKitTests::Product /* EtherWalletKitTests.xctest */,
EtherWalletKit::EtherWalletKit::Product /* EtherWalletKit.framework */,
E8D4CF3B2109F07D008476B8 /* EtherWalletKitTest.xctest */,
);
name = Products;
sourceTree = BUILT_PRODUCTS_DIR;
};
OBJ_5 = {
isa = PBXGroup;
children = (
OBJ_6 /* Package.swift */,
E8665C8720E394CF00F4AD19 /* EtherWalletKit.podspec */,
E8665C8520E394CF00F4AD19 /* LICENSE */,
E8665C8620E394CF00F4AD19 /* README.md */,
E83C249E20E399B0005645EF /* Sources */,
E8D4CF352109E66D008476B8 /* Docs */,
E8D4CF3C2109F07D008476B8 /* EtherWalletKitTest */,
OBJ_14 /* Products */,
83A5C5AAC8028885D5C13320 /* Pods */,
287731197E01E164172DCDF5 /* Frameworks */,
);
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
E8D4CF3A2109F07D008476B8 /* EtherWalletKitTest */ = {
isa = PBXNativeTarget;
buildConfigurationList = E8D4CF402109F07D008476B8 /* Build configuration list for PBXNativeTarget "EtherWalletKitTest" */;
buildPhases = (
BB104CFDCBEFDE4B9B23AA5A /* [CP] Check Pods Manifest.lock */,
E8D4CF372109F07D008476B8 /* Sources */,
E8D4CF382109F07D008476B8 /* Frameworks */,
E8D4CF392109F07D008476B8 /* Resources */,
E8CA9E4F2109FC0600F48458 /* CopyFiles */,
D62F1E8A6BB12A40C37E82EC /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = EtherWalletKitTest;
productName = EtherWalletKitTest;
productReference = E8D4CF3B2109F07D008476B8 /* EtherWalletKitTest.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
EtherWalletKit::EtherWalletKit /* EtherWalletKit */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_18 /* Build configuration list for PBXNativeTarget "EtherWalletKit" */;
buildPhases = (
7ABA8827529429D5C2B7EEF4 /* [CP] Check Pods Manifest.lock */,
OBJ_21 /* Sources */,
OBJ_23 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = EtherWalletKit;
productName = EtherWalletKit;
productReference = EtherWalletKit::EtherWalletKit::Product /* EtherWalletKit.framework */;
productType = "com.apple.product-type.framework";
};
EtherWalletKit::EtherWalletKitTests /* EtherWalletKitTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_36 /* Build configuration list for PBXNativeTarget "EtherWalletKitTests" */;
buildPhases = (
OBJ_39 /* Sources */,
OBJ_42 /* Frameworks */,
);
buildRules = (
);
dependencies = (
OBJ_44 /* PBXTargetDependency */,
);
name = EtherWalletKitTests;
productName = EtherWalletKitTests;
productReference = EtherWalletKit::EtherWalletKitTests::Product /* EtherWalletKitTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
EtherWalletKit::SwiftPMPackageDescription /* EtherWalletKitPackageDescription */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_25 /* Build configuration list for PBXNativeTarget "EtherWalletKitPackageDescription" */;
buildPhases = (
OBJ_28 /* Sources */,
23A961ACB3F6BDC02E74968E /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = EtherWalletKitPackageDescription;
productName = EtherWalletKitPackageDescription;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
OBJ_1 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0940;
LastUpgradeCheck = 9999;
TargetAttributes = {
E8D4CF3A2109F07D008476B8 = {
CreatedOnToolsVersion = 9.4.1;
DevelopmentTeam = T4C6698GAN;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "EtherWalletKit" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = OBJ_5;
productRefGroup = OBJ_14 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
EtherWalletKit::EtherWalletKit /* EtherWalletKit */,
EtherWalletKit::SwiftPMPackageDescription /* EtherWalletKitPackageDescription */,
EtherWalletKit::EtherWalletKitPackageTests::ProductTarget /* EtherWalletKitPackageTests */,
EtherWalletKit::EtherWalletKitTests /* EtherWalletKitTests */,
E8D4CF3A2109F07D008476B8 /* EtherWalletKitTest */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
E8D4CF392109F07D008476B8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
7ABA8827529429D5C2B7EEF4 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-EtherWalletKit-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
BB104CFDCBEFDE4B9B23AA5A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-EtherWalletKitTest-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
D62F1E8A6BB12A40C37E82EC /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${SRCROOT}/Pods/Target Support Files/Pods-EtherWalletKitTest/Pods-EtherWalletKitTest-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/BigInt-iOS11.4/BigInt.framework",
"${BUILT_PRODUCTS_DIR}/CryptoSwift-iOS11.4/CryptoSwift.framework",
"${BUILT_PRODUCTS_DIR}/EthereumABI-iOS11.4/EthereumABI.framework",
"${BUILT_PRODUCTS_DIR}/EthereumAddress-iOS11.4/EthereumAddress.framework",
"${BUILT_PRODUCTS_DIR}/PromiseKit-iOS11.4/PromiseKit.framework",
"${BUILT_PRODUCTS_DIR}/SipHash-iOS11.4/SipHash.framework",
"${BUILT_PRODUCTS_DIR}/SwiftRLP-iOS11.4/SwiftRLP.framework",
"${BUILT_PRODUCTS_DIR}/scrypt-iOS11.4/scrypt.framework",
"${BUILT_PRODUCTS_DIR}/secp256k1_swift-iOS11.4/secp256k1_swift.framework",
"${BUILT_PRODUCTS_DIR}/web3swift-iOS11.4/Web3swift.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BigInt.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CryptoSwift.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EthereumABI.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EthereumAddress.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SipHash.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftRLP.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/scrypt.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/secp256k1_swift.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Web3swift.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-EtherWalletKitTest/Pods-EtherWalletKitTest-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
E8D4CF372109F07D008476B8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E8D4CF3E2109F07D008476B8 /* EtherWalletKitTest.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_21 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
E83C24A120E399B0005645EF /* EtherWallet.swift in Sources */,
E83C24AF20E39C2F005645EF /* TransactionData.swift in Sources */,
E86669C621024E1200F99335 /* EtherWallet+Util.swift in Sources */,
E849CEBA20EB1D0700F38B76 /* GasStationAPIResponse.swift in Sources */,
E849CEBE20EB5C3B00F38B76 /* WalletError.swift in Sources */,
E83118C120F4523D00FF3CCC /* EtherWallet+Transaction.swift in Sources */,
E83118B620F3391E00FF3CCC /* EtherWallet+Account.swift in Sources */,
E849CEBC20EB4BA200F38B76 /* EthplorerAPIResponse.swift in Sources */,
E83118BA20F33BCA00FF3CCC /* EtherWallet+Balance.swift in Sources */,
E83C24AB20E39BE6005645EF /* EtherscanAPIResponse.swift in Sources */,
E8CB3D7821043E8D00AC6A14 /* EtherWallet+History.swift in Sources */,
E8D4CF342109CCB4008476B8 /* EtherWalletTestnets.swift in Sources */,
E8B4753B21002C98004B65E9 /* EtherWallet+Info.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_28 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_29 /* Package.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_39 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
OBJ_34 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = EtherWalletKit::EtherWalletKitTests /* EtherWalletKitTests */;
targetProxy = E8665C8420E3939A00F4AD19 /* PBXContainerItemProxy */;
};
OBJ_44 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = EtherWalletKit::EtherWalletKit /* EtherWalletKit */;
targetProxy = E8665C8320E3939600F4AD19 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
E8D4CF412109F07D008476B8 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 74D93172CB9698EEC90AF45E /* Pods-EtherWalletKitTest.debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = T4C6698GAN;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = EtherWalletKitTest/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.SteadyAction.EtherWalletKitTest;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
E8D4CF422109F07D008476B8 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 63C3EA9E421DCB0B6F2524FD /* Pods-EtherWalletKitTest.release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = T4C6698GAN;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = EtherWalletKitTest/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = com.SteadyAction.EtherWalletKitTest;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
OBJ_19 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 20E55D35F58BE23153B75758 /* Pods-EtherWalletKit.debug.xcconfig */;
buildSettings = {
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = EtherWalletKit.xcodeproj/EtherWalletKit_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 = EtherWalletKit;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 4.0;
TARGET_NAME = EtherWalletKit;
};
name = Debug;
};
OBJ_20 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 58BEAAFE6E50744CCC966592 /* Pods-EtherWalletKit.release.xcconfig */;
buildSettings = {
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = EtherWalletKit.xcodeproj/EtherWalletKit_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 = EtherWalletKit;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 4.0;
TARGET_NAME = EtherWalletKit;
};
name = Release;
};
OBJ_26 /* 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_27 /* 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_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_32 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
};
name = Debug;
};
OBJ_33 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
};
name = Release;
};
OBJ_37 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = EtherWalletKit.xcodeproj/EtherWalletKitTests_Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks";
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
SWIFT_VERSION = 4.0;
TARGET_NAME = EtherWalletKitTests;
};
name = Debug;
};
OBJ_38 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = EtherWalletKit.xcodeproj/EtherWalletKitTests_Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks";
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
SWIFT_VERSION = 4.0;
TARGET_NAME = EtherWalletKitTests;
};
name = Release;
};
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 */
E8D4CF402109F07D008476B8 /* Build configuration list for PBXNativeTarget "EtherWalletKitTest" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E8D4CF412109F07D008476B8 /* Debug */,
E8D4CF422109F07D008476B8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_18 /* Build configuration list for PBXNativeTarget "EtherWalletKit" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_19 /* Debug */,
OBJ_20 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_2 /* Build configuration list for PBXProject "EtherWalletKit" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_3 /* Debug */,
OBJ_4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_25 /* Build configuration list for PBXNativeTarget "EtherWalletKitPackageDescription" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_26 /* Debug */,
OBJ_27 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_31 /* Build configuration list for PBXAggregateTarget "EtherWalletKitPackageTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_32 /* Debug */,
OBJ_33 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_36 /* Build configuration list for PBXNativeTarget "EtherWalletKitTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_37 /* Debug */,
OBJ_38 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = OBJ_1 /* Project object */;
}
================================================
FILE: EtherWalletKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
</Workspace>
================================================
FILE: EtherWalletKit.xcodeproj/xcshareddata/xcschemes/EtherWalletKit-Package.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "9999"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EtherWalletKit::EtherWalletKit"
BuildableName = "EtherWalletKit.framework"
BlueprintName = "EtherWalletKit"
ReferencedContainer = "container:EtherWalletKit.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EtherWalletKit::EtherWalletKitTests"
BuildableName = "EtherWalletKitTests.xctest"
BlueprintName = "EtherWalletKitTests"
ReferencedContainer = "container:EtherWalletKit.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EtherWalletKit::EtherWalletKit"
BuildableName = "EtherWalletKit.framework"
BlueprintName = "EtherWalletKit"
ReferencedContainer = "container:EtherWalletKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: EtherWalletKit.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>EtherWalletKit-Package.xcscheme</key>
<dict></dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict></dict>
</dict>
</plist>
================================================
FILE: EtherWalletKit.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:EtherWalletKit.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: EtherWalletKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: EtherWalletKitTest/EtherWalletKitTest.swift
================================================
import XCTest
@testable import EtherWalletKit
class EtherWalletKitTest: XCTestCase {
private let password = "PASSWORD123"
func testAccount() {
guard let _ = try? EtherWallet.account.generateAccount(password: password) else {
XCTFail()
return
}
XCTAssert(EtherWallet.account.hasAccount)
guard let address = EtherWallet.account.address else {
XCTFail()
return
}
XCTAssert(address.count == 42)
guard let privateKey = try? EtherWallet.account.privateKey(password: password) else {
XCTFail()
return
}
XCTAssert(privateKey.count == 64)
guard let _ = try? EtherWallet.account.importAccount(privateKey: privateKey, password: password) else {
XCTFail()
return
}
XCTAssert(address == EtherWallet.account.address)
XCTAssert(EtherWallet.account.verifyPassword(password))
XCTAssertFalse(EtherWallet.account.verifyPassword("WRONG_PASSWORD"))
}
func testBalance() {
XCTAssert(try! EtherWallet.balance.etherBalanceSync() == "0")
XCTAssert(try! EtherWallet.balance.tokenBalanceSync(contractAddress: "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07") == "0")
}
}
================================================
FILE: EtherWalletKitTest/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: LICENSE
================================================
Copyright (c) 2018 SteadyAction <steadyaction@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: Package.swift
================================================
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "EtherWalletKit",
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "EtherWalletKit",
targets: ["EtherWalletKit"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "EtherWalletKit",
dependencies: []),
.testTarget(
name: "EtherWalletKitTests",
dependencies: ["EtherWalletKit"]),
]
)
================================================
FILE: Podfile
================================================
use_frameworks!
target 'EtherWalletKit' do
platform :ios, '10.0'
pod "web3swift", '~> 2.0'
pod 'SwiftKeychainWrapper'
end
target 'EtherWalletKitTest' do
pod "web3swift", '~> 2.0'
end
================================================
FILE: README.md
================================================
<p align="center">
<a href="https://github.com/SteadyAction/EtherWalletKit">
<img src="https://i.imgur.com/Qyva4AF.png" height="240" alt="EtherWalletKit">
</a>
[](https://swift.org)
[](https://developer.apple.com/xcode)
[](https://opensource.org/licenses/MIT)
<img src="https://img.shields.io/badge/os-iOS-green.svg?style=flat" alt="iOS">
## Introduction
EtherWalletKit is an Ethereum Wallet Toolkit for iOS.<br><br>
I hope cryptocurrency and decentralized token economy become more widely adapted.
However, some developers hesitate to add a crypto wallet on apps since blockchain and cryptocurrency are complex and require many new knowledge. <br><br>
Don't worry. <br>With EtherWalletKit, you can implement an Ethereum wallet without a server and blockchain knowledge.
## Features
#### Released Features
* Creating/Importing an account(address and private key)
* Checking Ether and tokens balance
* Sending Ether and tokens to other addresses
* Browsing token information
* Testnet(Rinkeby & Ropsten) support
* BIP39 Mnemonics
#### Planned Features
* Browsing transaction history
* Keystore import / export
* Custom configuration / advanced transactions
* Multiple accounts
* Third party APIs
* ERC-721 supports
## Installation
### CocoaPods
<p>To integrate EtherWalletKit into your Xcode project using <a href="http://cocoapods.org">CocoaPods</a>, specify it in your <code>Podfile</code>:</p>
<pre><code class="ruby language-ruby">pod 'EtherWalletKit'</code></pre>
## Quick Start
#### 0. Don't forget to import it
``` swift
import EtherWalletKit
```
#### 1. Create an Ethereum Wallet
```swift
// Generate a new account with its new password.
try? EtherWallet.account.generateAccount(password: "ABCDEFG")
// Import an existing account from its private key and set its new password.
try? EtherWallet.account.importAccount(privateKey: "1dcbc1d6e0a4587a3a9095984cf051a1bc6ed975f15380a0ac97f01c0c045062, password: "ABCDEFG")
```
Note: ```password``` will be encrypted and saved to the device and it will be required to access the wallet.
#### 2. Get balance
```swift
// Get balance of Ether
EtherWallet.balance.etherBalance { balance in
print(balance)
}
// Get balance of a token
EtherWallet.balance.tokenBalance(contractAddress: "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07") { balance in
print(balance)
}
```
#### 3. Send
```swift
// send Ether to an address.
EtherWallet.transaction.sendEther(to: "0x7777787C97a35d37Db8E5afb0C92BCfd4F6480bE", amount: "1.5", password: "ABCDEFG") { txHash in
print(txHash)
}
// send a token to an address.
EtherWallet.transaction.sendToken(to: "0x7777787C97a35d37Db8E5afb0C92BCfd4F6480bE", contractAddress: "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", amount: "20", password: "ABCDEFG", decimal: 18) { txHash in
print(txHash)
}
```
Note: ```password``` should be eqaul to the password of wallet created. Also you can put ```gasPrice``` as an extra parameter to set gas price for the transcation.
For full documentation, please see [THIS](./Docs/Document.md).
## Notes
* Nothing will be sent to a server. Everything will be worked on the local device and Ethereum Blockchain.
* You dont need to download and sync the nodes because [Infura](https://infura.io/) is doing it for you.
* ```password``` for wallet is equal to the password for the keystore file. Always make sure a ```password``` is long enough for security.
## Contribution
* Make sure you have a [GitHub account](https://github.com/signup/free)
* Create a GitHub pull request for your contribution
* Clearly describe the issue or feature.
* Fork the repository on GitHub
* Create a topic branch from where you want to base your work. ([Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) is welcome)
* Please avoid working directly on the `master` branch.
* Make sure you have added the necessary tests for your changes and make sure all tests pass.
## License
EtherWalletKit is available under the MIT license. See the [LICENSE](./LICENSE) file for more info.
================================================
FILE: Sources/Structure/EtherscanAPIResponse.swift
================================================
struct EtherscanTxAPIResponse: Decodable {
let message: String
let status: String
let result: [GeneralTransactionData]
}
struct EtherscanTokenTxAPIResponse: Decodable {
let message: String
let status: String
let result: [TokenTransactionData]
}
================================================
FILE: Sources/Structure/EthplorerAPIResponse.swift
================================================
struct EthplorerTokenInfoAPIResponse: Decodable {
let address: String
let name: String
let symbol: String
let decimals: String
let totalSupply: String
}
================================================
FILE: Sources/Structure/GasStationAPIResponse.swift
================================================
struct GasStationAPIResponse: Decodable {
let safeLow: Double
let average: Double
let fastest: Double
}
================================================
FILE: Sources/Structure/TransactionData.swift
================================================
struct TransactionData {
let currencyName: String
let currencySymbol: String
let amount: String
let timestamp: String
let hash: String
let from: String
let to: String
let isError: Bool
}
struct TokenTransactionData: Decodable {
let tokenName: String
let tokenSymbol: String
let tokenDecimal: String
let timestamp: String
let hash: String
let from: String
let to: String
var value: String
let gas: String
let gasPrice: String
let contractAddress: String
let cumulativeGasUsed: String
let gasUsed: String
let confirmations: String
enum CodingKeys: String, CodingKey {
case tokenName
case tokenSymbol
case tokenDecimal
case timestamp = "timeStamp"
case hash
case from
case to
case value
case gas
case gasPrice
case contractAddress
case cumulativeGasUsed
case gasUsed
case confirmations
}
}
struct GeneralTransactionData: Decodable {
let timestamp: String
let hash: String
let from: String
let to: String
var value: String
let gas: String
let gasPrice: String
let isError: String
let contractAddress: String
let cumulativeGasUsed: String
let gasUsed: String
let confirmations: String
enum CodingKeys: String, CodingKey {
case timestamp = "timeStamp"
case hash
case from
case to
case value
case gas
case gasPrice
case isError
case contractAddress
case cumulativeGasUsed
case gasUsed
case confirmations
}
}
================================================
FILE: Sources/Wallet/EtherWallet+Account.swift
================================================
import Web3swift
import EthereumAddress
import SwiftKeychainWrapper
public protocol AccountService {
var hasAccount: Bool { get }
var address: String? { get }
var mnemonics: String? { get set }
func privateKey(password: String) throws -> String
func verifyPassword(_ password: String) -> Bool
func generateAccount(password: String) throws
func importAccount(privateKey: String, password: String) throws
func importAccount(mnemonics: String, password: String) throws
}
extension EtherWallet: AccountService {
public var hasAccount: Bool {
return (try? loadKeystore()) != nil
}
public var address: String? {
guard let keystore = try? loadKeystore() else { return nil }
return keystore.getAddress()?.address
}
public var mnemonics: String? {
get {
return KeychainWrapper.standard.string(forKey: mnemonicsKeystoreKey)
}
set {
if let newValue = newValue {
KeychainWrapper.standard.set(newValue, forKey: mnemonicsKeystoreKey)
} else {
KeychainWrapper.standard.removeObject(forKey: mnemonicsKeystoreKey)
}
}
}
public func privateKey(password: String) throws -> String {
let keystore = try loadKeystore()
guard let address = keystore.getAddress()?.address else {
throw WalletError.malformedKeystore
}
guard let ethereumAddress = EthereumAddress(address) else {
throw WalletError.invalidAddress
}
let privateKeyData = try keystore.UNSAFE_getPrivateKeyData(password: password, account: ethereumAddress)
return privateKeyData.toHexString()
}
public func verifyPassword(_ password: String) -> Bool {
return (try? privateKey(password: password)) != nil
}
public func generateAccount(password: String) throws {
guard let mnemonics = try BIP39.generateMnemonics(bitsOfEntropy: 128) else {
throw WalletError.unexpectedResult
}
try importAccount(mnemonics: mnemonics, password: password)
}
public func importAccount(privateKey: String, password: String) throws {
guard let privateKeyData = Data.fromHex(privateKey) else {
throw WalletError.invalidKey
}
guard let keystore = try EthereumKeystoreV3(privateKey: privateKeyData, password: password) else {
throw WalletError.malformedKeystore
}
try saveKeystore(keystore)
self.mnemonics = nil
}
public func importAccount(mnemonics: String, password: String) throws {
guard let keystore = (try? BIP32Keystore(mnemonics: mnemonics, password: password)) ?? nil else {
throw WalletError.invalidMnemonics
}
guard let address = keystore.addresses?.first else {
throw WalletError.malformedKeystore
}
guard let privateKey = try? keystore.UNSAFE_getPrivateKeyData(password: password, account: address).toHexString() else {
throw WalletError.malformedKeystore
}
try importAccount(privateKey: privateKey, password: password)
self.mnemonics = mnemonics
}
private func saveKeystore(_ keystore: EthereumKeystoreV3) throws {
keystoreCache = keystore
guard let userDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else {
throw WalletError.invalidPath
}
guard let keystoreParams = keystore.keystoreParams else {
throw WalletError.malformedKeystore
}
guard let keystoreData = try? JSONEncoder().encode(keystoreParams) else {
throw WalletError.malformedKeystore
}
if !FileManager.default.fileExists(atPath: userDir + keystoreDirectoryName) {
do {
try FileManager.default.createDirectory(atPath: userDir + keystoreDirectoryName, withIntermediateDirectories: true, attributes: nil)
} catch {
throw WalletError.invalidPath
}
}
FileManager.default.createFile(atPath: userDir + keystoreDirectoryName + keystoreFileName, contents: keystoreData, attributes: nil)
setupOptionsFrom()
}
func loadKeystore() throws -> EthereumKeystoreV3 {
if let keystore = keystoreCache {
return keystore
}
guard let userDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else {
throw WalletError.invalidPath
}
guard let keystoreManager = KeystoreManager.managerForPath(userDir + keystoreDirectoryName) else {
throw WalletError.malformedKeystore
}
guard let address = keystoreManager.addresses?.first else {
throw WalletError.malformedKeystore
}
guard let keystore = keystoreManager.walletForAddress(address) as? EthereumKeystoreV3 else {
throw WalletError.malformedKeystore
}
keystoreCache = keystore
return keystore
}
}
================================================
FILE: Sources/Wallet/EtherWallet+Balance.swift
================================================
import Web3swift
import EthereumAddress
import BigInt
public protocol BalanceService {
func etherBalanceSync() throws -> String
func etherBalance(completion: @escaping (String?) -> ())
func tokenBalanceSync(contractAddress: String) throws -> String
func tokenBalance(contractAddress: String, completion: @escaping (String?) -> ())
}
extension EtherWallet: BalanceService {
public func etherBalanceSync() throws -> String {
guard let address = address else { throw WalletError.accountDoesNotExist }
guard let ethereumAddress = EthereumAddress(address) else { throw WalletError.invalidAddress }
guard let balanceInWei = try? web3Instance.eth.getBalance(address: ethereumAddress) else {
throw WalletError.networkFailure
}
guard let balanceInEtherUnitStr = Web3.Utils.formatToEthereumUnits(balanceInWei, toUnits: Web3.Utils.Units.eth, decimals: 8, decimalSeparator: ".") else { throw WalletError.conversionFailure }
return balanceInEtherUnitStr
}
public func etherBalance(completion: @escaping (String?) -> ()) {
DispatchQueue.global().async {
let balance = try? self.etherBalanceSync()
DispatchQueue.main.async {
completion(balance)
}
}
}
public func tokenBalanceSync(contractAddress: String) throws -> String {
let contractEthreumAddress = EthereumAddress(contractAddress)
guard let contract = web3Instance.contract(Web3.Utils.erc20ABI, at: contractEthreumAddress) else { throw
WalletError.invalidAddress
}
guard let address = address else { throw WalletError.accountDoesNotExist }
let parameters = [address as AnyObject]
let contractMethod = contract.method("balanceOf", parameters: parameters, extraData: Data(), transactionOptions: transactionOptions)
guard let balanceInfo = try? contractMethod?.call(transactionOptions: nil), let balance = balanceInfo?["0"] as? BigUInt else {
throw WalletError.networkFailure
}
return "\(balance)"
}
public func tokenBalance(contractAddress: String, completion: @escaping (String?) -> ()) {
DispatchQueue.global().async {
let balance = try? self.tokenBalanceSync(contractAddress: contractAddress)
DispatchQueue.main.async {
completion(balance)
}
}
}
}
================================================
FILE: Sources/Wallet/EtherWallet+History.swift
================================================
import Web3swift
public protocol HistoryService {
}
extension EtherWallet: HistoryService {
}
================================================
FILE: Sources/Wallet/EtherWallet+Info.swift
================================================
import Web3swift
import EthereumAddress
public protocol InfoService {
func decimalsForTokenSync(address: String) throws -> Int
func decimalsForToken(address: String, completion: @escaping (Int?) -> ())
func symbolForTokenSync(address: String) throws -> String
func symbolForToken(address: String, completion: @escaping (String?) -> ())
}
extension EtherWallet: InfoService {
public func decimalsForTokenSync(address: String) throws -> Int {
let contract = try erc20contract(address: address)
let parameters = [AnyObject]()
guard let decimalsInfo = try? contract.method("decimals", parameters: parameters, extraData: Data(), transactionOptions: transactionOptions)?.call(transactionOptions: nil), let decimals = decimalsInfo?["0"] else {
throw WalletError.networkFailure
}
guard let result = decimals as? Int else {
throw WalletError.unexpectedResult
}
return result
}
public func decimalsForToken(address: String, completion: @escaping (Int?) -> ()) {
DispatchQueue.global().async {
let decimals = try? self.decimalsForTokenSync(address: address)
DispatchQueue.main.async {
completion(decimals)
}
}
}
public func symbolForTokenSync(address: String) throws -> String {
let contract = try erc20contract(address: address)
let parameters = [AnyObject]()
guard let symbolInfo = try? contract.method("symbol", parameters: parameters, extraData: Data(), transactionOptions: transactionOptions)?.call(transactionOptions: nil), let symbol = symbolInfo?["0"] as? String else {
throw WalletError.networkFailure
}
if symbol.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
throw WalletError.unexpectedResult
}
return symbol
}
public func symbolForToken(address: String, completion: @escaping (String?) -> ()) {
DispatchQueue.global().async {
let symbol = try? self.symbolForTokenSync(address: address)
DispatchQueue.main.async {
completion(symbol)
}
}
}
private func erc20contract(address: String) throws -> web3.web3contract {
let contractEthreumAddress = EthereumAddress(address)
guard let contract = web3Instance.contract(Web3.Utils.erc20ABI, at: contractEthreumAddress) else { throw WalletError.contractFailure }
return contract
}
}
================================================
FILE: Sources/Wallet/EtherWallet+Transaction.swift
================================================
import Web3swift
import EthereumAddress
import BigInt
public protocol TransactionService {
func sendEtherSync(to address: String, amount: String, password: String) throws -> String
func sendEtherSync(to address: String, amount: String, password: String, gasPrice: String?) throws -> String
func sendEther(to address: String, amount: String, password: String, completion: @escaping (String?) -> ())
func sendEther(to address: String, amount: String, password: String, gasPrice: String?, completion: @escaping (String?) -> ())
func sendTokenSync(to toAddress: String, contractAddress: String, amount: String, password: String, decimal: Int) throws -> String
func sendTokenSync(to toAddress: String, contractAddress: String, amount: String, password: String, decimal: Int, gasPrice: String?) throws -> String
func sendToken(to toAddress: String, contractAddress: String, amount: String, password: String, decimal:Int, completion: @escaping (String?) -> ())
func sendToken(to toAddress: String, contractAddress: String, amount: String, password: String, decimal:Int, gasPrice: String?, completion: @escaping (String?) -> ())
}
extension EtherWallet: TransactionService {
public func sendEtherSync(to address: String, amount: String, password: String) throws -> String {
return try sendEtherSync(to: address, amount: amount, password: password, gasPrice: nil)
}
public func sendEtherSync(to address: String, amount: String, password: String, gasPrice: String?) throws -> String {
guard let toAddress = EthereumAddress(address) else { throw WalletError.invalidAddress }
let keystore = try loadKeystore()
let etherBalance = try etherBalanceSync()
guard let etherBalanceInDouble = Double(etherBalance) else { throw WalletError.conversionFailure }
guard let amountInDouble = Double(amount) else { throw WalletError.conversionFailure }
guard etherBalanceInDouble >= amountInDouble else { throw WalletError.notEnoughBalance }
let keystoreManager = KeystoreManager([keystore])
web3Instance.addKeystoreManager(keystoreManager)
if let gasPrice = gasPrice {
options.gasPrice = BigUInt(gasPrice)
}
options.value = Web3.Utils.parseToBigUInt(amount, units: .eth)
guard let contract = web3Instance.contract(Web3.Utils.coldWalletABI, at: toAddress, abiVersion: 2) else {
throw WalletError.contractFailure
}
contract.transactionOptions = transactionOptions
guard let intermediateSend = contract.method() else { throw WalletError.contractFailure }
guard let sendResult = try? intermediateSend.send(password: password) else { throw WalletError.networkFailure }
return sendResult.hash
}
public func sendEther(to address: String, amount: String, password: String, completion: @escaping (String?) -> ()) {
sendEther(to: address, amount: amount, password: password, gasPrice: nil, completion: completion)
}
public func sendEther(to address: String, amount: String, password: String, gasPrice: String?, completion: @escaping (String?) -> ()) {
DispatchQueue.global().async {
let txHash = try? self.sendEtherSync(to: address, amount: amount, password: password, gasPrice: gasPrice)
DispatchQueue.main.async {
completion(txHash)
}
}
}
public func sendTokenSync(to toAddress: String, contractAddress: String, amount: String, password: String, decimal: Int) throws -> String {
return try sendTokenSync(to: toAddress, contractAddress: contractAddress, amount: amount, password: password, decimal: decimal, gasPrice: nil)
}
public func sendTokenSync(to toAddress: String, contractAddress: String, amount: String, password: String, decimal: Int, gasPrice: String?) throws -> String {
guard let tokenAddress = EthereumAddress(contractAddress) else { throw WalletError.invalidAddress }
guard let fromAddress = address else { throw WalletError.accountDoesNotExist }
guard let fromEthereumAddress = EthereumAddress(fromAddress) else { throw WalletError.invalidAddress }
guard let toEthereumAddress = EthereumAddress(toAddress) else { throw WalletError.invalidAddress }
let keystore = try loadKeystore()
let keystoreManager = KeystoreManager([keystore])
web3Instance.addKeystoreManager(keystoreManager)
var options = Web3Options.defaultOptions()
options.from = fromEthereumAddress
if let gasPrice = gasPrice {
options.gasPrice = BigUInt(gasPrice)
}
options.gasLimit = BigUInt(defaultGasLimitForTokenTransfer)
guard let tokenAmount = Web3.Utils.parseToBigUInt(amount, decimals: decimal) else { throw WalletError.conversionFailure }
let parameters = [toEthereumAddress, tokenAmount] as [AnyObject]
guard let contract = web3Instance.contract(Web3.Utils.erc20ABI, at: tokenAddress, abiVersion: 2) else { throw WalletError.contractFailure }
guard let contractMethod = contract.method("transfer", parameters: parameters, extraData: Data(), transactionOptions: transactionOptions) else { throw WalletError.contractFailure }
var newTransactionOptions = transactionOptions
newTransactionOptions.callOnBlock = .latest
guard let contractCall = try? contractMethod.send(password: password, transactionOptions: newTransactionOptions) else {
throw WalletError.networkFailure
}
return contractCall.hash
}
public func sendToken(to toAddress: String, contractAddress: String, amount: String, password: String, decimal: Int, completion: @escaping (String?) -> ()) {
sendToken(to: toAddress, contractAddress: contractAddress, amount: amount, password: password, decimal: decimal, gasPrice: nil, completion: completion)
}
public func sendToken(to toAddress: String, contractAddress: String, amount: String, password: String, decimal:Int, gasPrice: String?, completion: @escaping (String?) -> ()) {
DispatchQueue.global().async {
let txHash = try? self.sendTokenSync(to: toAddress, contractAddress: contractAddress, amount: amount, password: password, decimal: decimal, gasPrice: gasPrice)
DispatchQueue.main.async {
completion(txHash)
}
}
}
}
================================================
FILE: Sources/Wallet/EtherWallet+Util.swift
================================================
import Web3swift
public protocol UtilService {
}
extension EtherWallet: UtilService {
}
================================================
FILE: Sources/Wallet/EtherWallet.swift
================================================
import Web3swift
import EthereumAddress
import BigInt
public class EtherWallet {
private static let shared = EtherWallet()
public static let account: AccountService = EtherWallet.shared
public static let balance: BalanceService = EtherWallet.shared
public static let info: InfoService = EtherWallet.shared
public static let transaction: TransactionService = EtherWallet.shared
public static let util: UtilService = EtherWallet.shared
private let web3Main = Web3.InfuraMainnetWeb3()
let keystoreDirectoryName = "/keystore"
let keystoreFileName = "/key.json"
let mnemonicsKeystoreKey = "mnemonicsKeystoreKey"
let defaultGasLimitForTokenTransfer = 100000
var options: Web3Options
var transactionOptions: TransactionOptions
var keystoreCache: EthereumKeystoreV3?
var web3Instance: web3 {
return web3Main
}
private init() {
options = Web3Options.defaultOptions()
options.gasLimit = BigUInt(defaultGasLimitForTokenTransfer)
transactionOptions = TransactionOptions.defaultOptions
transactionOptions.gasLimit = .limited(BigUInt(defaultGasLimitForTokenTransfer))
setupOptionsFrom()
}
func setupOptionsFrom() {
if let address = address {
options.from = EthereumAddress(address)
transactionOptions.from = EthereumAddress(address)
} else {
options.from = nil
transactionOptions.from = nil
}
}
}
================================================
FILE: Sources/Wallet/EtherWalletTestnets.swift
================================================
import Web3swift
public class EtherWalletRinkeby: EtherWallet {
private let web3Rinkeby = Web3.InfuraRinkebyWeb3()
override var web3Instance: web3 {
return web3Rinkeby
}
}
public class EtherWalletRopsten: EtherWallet {
private let web3Ropsten = Web3.InfuraRopstenWeb3()
override var web3Instance: web3 {
return web3Ropsten
}
}
================================================
FILE: Sources/Wallet/WalletError.swift
================================================
public enum WalletError: Error {
case accountDoesNotExist
case invalidPath
case invalidKey
case invalidMnemonics
case invalidAddress
case malformedKeystore
case networkFailure
case conversionFailure
case notEnoughBalance
case contractFailure
case unexpectedResult
}
gitextract_ee0jz0ij/
├── .gitignore
├── Docs/
│ └── Document.md
├── EtherWalletKit.podspec
├── EtherWalletKit.xcodeproj/
│ ├── EtherWalletKitTests_Info.plist
│ ├── EtherWalletKit_Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── EtherWalletKit-Package.xcscheme
│ └── xcschememanagement.plist
├── EtherWalletKit.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── EtherWalletKitTest/
│ ├── EtherWalletKitTest.swift
│ └── Info.plist
├── LICENSE
├── Package.swift
├── Podfile
├── README.md
└── Sources/
├── Structure/
│ ├── EtherscanAPIResponse.swift
│ ├── EthplorerAPIResponse.swift
│ ├── GasStationAPIResponse.swift
│ └── TransactionData.swift
└── Wallet/
├── EtherWallet+Account.swift
├── EtherWallet+Balance.swift
├── EtherWallet+History.swift
├── EtherWallet+Info.swift
├── EtherWallet+Transaction.swift
├── EtherWallet+Util.swift
├── EtherWallet.swift
├── EtherWalletTestnets.swift
└── WalletError.swift
Condensed preview — 30 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (85K chars).
[
{
"path": ".gitignore",
"chars": 60,
"preview": ".DS_Store\n/.build\n/Packages\n*.xcuserstate\nxcuserdata/\nPods/\n"
},
{
"path": "Docs/Document.md",
"chars": 1842,
"preview": "## Getting Started\n\n#### 0. Don't forget to import it\n\n``` swift\n\nimport EtherWalletKit\n\n```\n\n#### Mainet or Testnet(Rin"
},
{
"path": "EtherWalletKit.podspec",
"chars": 1751,
"preview": "#\n# Be sure to run `pod lib lint EtherWalletKit.podspec' to ensure this is a\n# valid spec before submitting.\n#\n# Any lin"
},
{
"path": "EtherWalletKit.xcodeproj/EtherWalletKitTests_Info.plist",
"chars": 723,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n <key>CFBundleDevelopmentRegion</key>\n <string>en<"
},
{
"path": "EtherWalletKit.xcodeproj/EtherWalletKit_Info.plist",
"chars": 723,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n <key>CFBundleDevelopmentRegion</key>\n <string>en<"
},
{
"path": "EtherWalletKit.xcodeproj/project.pbxproj",
"chars": 38806,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXAggregateTarget sec"
},
{
"path": "EtherWalletKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 83,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n</Workspace>\n"
},
{
"path": "EtherWalletKit.xcodeproj/xcshareddata/xcschemes/EtherWalletKit-Package.xcscheme",
"chars": 3003,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"9999\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "EtherWalletKit.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist",
"chars": 257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n <key>SchemeUserState</key>\n <dict>\n <key>Ether"
},
{
"path": "EtherWalletKit.xcworkspace/contents.xcworkspacedata",
"chars": 232,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:EtherWalletKit"
},
{
"path": "EtherWalletKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "EtherWalletKitTest/EtherWalletKitTest.swift",
"chars": 1350,
"preview": "import XCTest\n@testable import EtherWalletKit\n\nclass EtherWalletKitTest: XCTestCase {\n private let password = \"PASSWO"
},
{
"path": "EtherWalletKitTest/Info.plist",
"chars": 701,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "Copyright (c) 2018 SteadyAction <steadyaction@gmail.com>\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "Package.swift",
"chars": 1055,
"preview": "// swift-tools-version:4.0\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "Podfile",
"chars": 195,
"preview": "use_frameworks!\n\ntarget 'EtherWalletKit' do\n\tplatform :ios, '10.0'\n\tpod \"web3swift\", '~> 2.0'\n pod 'SwiftKeychainWrap"
},
{
"path": "README.md",
"chars": 4231,
"preview": "\n<p align=\"center\">\n<a href=\"https://github.com/SteadyAction/EtherWalletKit\">\n<img src=\"https://i.imgur.com/Qyva4AF.png\""
},
{
"path": "Sources/Structure/EtherscanAPIResponse.swift",
"chars": 270,
"preview": "struct EtherscanTxAPIResponse: Decodable {\n let message: String\n let status: String\n let result: [GeneralTransa"
},
{
"path": "Sources/Structure/EthplorerAPIResponse.swift",
"chars": 173,
"preview": "struct EthplorerTokenInfoAPIResponse: Decodable {\n let address: String\n let name: String\n let symbol: String\n "
},
{
"path": "Sources/Structure/GasStationAPIResponse.swift",
"chars": 116,
"preview": "struct GasStationAPIResponse: Decodable {\n let safeLow: Double\n let average: Double\n let fastest: Double\n}\n"
},
{
"path": "Sources/Structure/TransactionData.swift",
"chars": 1674,
"preview": "struct TransactionData {\n let currencyName: String\n let currencySymbol: String\n let amount: String\n let time"
},
{
"path": "Sources/Wallet/EtherWallet+Account.swift",
"chars": 5234,
"preview": "import Web3swift\nimport EthereumAddress\nimport SwiftKeychainWrapper\n\npublic protocol AccountService {\n var hasAccount"
},
{
"path": "Sources/Wallet/EtherWallet+Balance.swift",
"chars": 2492,
"preview": "import Web3swift\nimport EthereumAddress\nimport BigInt\n\npublic protocol BalanceService {\n func etherBalanceSync() thro"
},
{
"path": "Sources/Wallet/EtherWallet+History.swift",
"chars": 106,
"preview": "import Web3swift\n\npublic protocol HistoryService {\n \n}\n\nextension EtherWallet: HistoryService {\n \n}\n"
},
{
"path": "Sources/Wallet/EtherWallet+Info.swift",
"chars": 2593,
"preview": "import Web3swift\nimport EthereumAddress\n\npublic protocol InfoService {\n func decimalsForTokenSync(address: String) th"
},
{
"path": "Sources/Wallet/EtherWallet+Transaction.swift",
"chars": 6535,
"preview": "import Web3swift\nimport EthereumAddress\nimport BigInt\n\npublic protocol TransactionService {\n func sendEtherSync(to ad"
},
{
"path": "Sources/Wallet/EtherWallet+Util.swift",
"chars": 100,
"preview": "import Web3swift\n\npublic protocol UtilService {\n \n}\n\nextension EtherWallet: UtilService {\n \n}\n"
},
{
"path": "Sources/Wallet/EtherWallet.swift",
"chars": 1529,
"preview": "import Web3swift\nimport EthereumAddress\nimport BigInt\n\npublic class EtherWallet {\n private static let shared = EtherW"
},
{
"path": "Sources/Wallet/EtherWalletTestnets.swift",
"chars": 379,
"preview": "import Web3swift\n\npublic class EtherWalletRinkeby: EtherWallet {\n private let web3Rinkeby = Web3.InfuraRinkebyWeb3()\n"
},
{
"path": "Sources/Wallet/WalletError.swift",
"chars": 310,
"preview": "public enum WalletError: Error {\n case accountDoesNotExist\n case invalidPath\n case invalidKey\n case invalidM"
}
]
About this extraction
This page contains the full source code of the SteadyAction/EtherWalletKit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 30 files (76.0 KB), approximately 22.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.