{"id":15070143,"url":"https://github.com/eqoty-labs/secretk","last_synced_at":"2025-04-10T17:37:30.722Z","repository":{"id":40890820,"uuid":"473021738","full_name":"eqoty-labs/secretk","owner":"eqoty-labs","description":"A Kotlin Multiplatform (JVM, Android, iOS, tvOS, watchOS, macOS, linux, JS) client for interacting with the Secret Network","archived":false,"fork":false,"pushed_at":"2024-05-02T18:41:55.000Z","size":1327851,"stargazers_count":10,"open_issues_count":6,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T15:11:23.527Z","etag":null,"topics":["android","cosmos","cosmos-sdk","ios","js","kotlin","kotlin-multiplatform","linux","scrt","tvos","watchos","web3"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eqoty-labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-23T03:21:28.000Z","updated_at":"2024-11-28T10:53:06.000Z","dependencies_parsed_at":"2023-12-23T10:40:52.349Z","dependency_job_id":"705656ff-0d91-4eae-a460-5ee700de2d4b","html_url":"https://github.com/eqoty-labs/secretk","commit_stats":{"total_commits":428,"total_committers":3,"mean_commits":"142.66666666666666","dds":"0.014018691588784993","last_synced_commit":"b534eee367d9b874ec125c8c9b8999dbbbb6052d"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eqoty-labs%2Fsecretk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eqoty-labs%2Fsecretk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eqoty-labs%2Fsecretk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eqoty-labs%2Fsecretk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eqoty-labs","download_url":"https://codeload.github.com/eqoty-labs/secretk/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248262036,"owners_count":21074237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","cosmos","cosmos-sdk","ios","js","kotlin","kotlin-multiplatform","linux","scrt","tvos","watchos","web3"],"created_at":"2024-09-25T01:49:14.693Z","updated_at":"2025-04-10T17:37:30.697Z","avatar_url":"https://github.com/eqoty-labs.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# secretk\n\nA Kotlin multiplatform Encryption and REST client for Secret Network utilizing gRPC gateway endpoints.\n\n### Supported Features:\n\n* Contract Queries\n* Simulate Contract Execution To Estimate Gas\n* Contract Execution (MsgExecuteContract)\n* Contract Code Upload (MsgStoreCode)\n* Contract Instantiate (MsgInstantiateContract)\n* Contract Migrate (MsgMigrateContract)\n* Contract Update Admin (MsgUpdateAdmin)\n* Contract Clear Admin (MsgClearAdmin)\n* Bank Send (MsgSend)\n* Web: Delegate signing transactions to Kepler or Metamask browser wallets\n\n### Supported Targets:\n\n* JVM\n* js\n* iOS, tvOS, watchOS\n* macOS\n* linux (x64)\n* windows (x64)\n\n## Setup\n\n### Gradle\n\n```kotlin\ndependencies {\n    implementation(\"io.eqoty.secretk:client:$latest\")\n}\n```\n\n### Swift Package Manager\n\nyou need to declare your dependency in your `Package.swift`:\n\n```swift\n.package(url: \"https://github.com/eqoty-labs/secretk.git\", from: \"latest\"),\n```\n\n## Samples\n\n- [Secret Contract Template](https://github.com/eqoty-labs/secret-template) using secretk for Integration Testing\n- Compose UI [sample project](/sample)\n- Swift [sample project](/sampleSwift)\n\n## Useage\n\n### Kotlin\n\n#### Create SigningCosmWasmClient\n\n```kotlin\nval grpcGatewayEndpoint = \"http://secretnetworkendpoint.com:1337\"\nval mnemonic = \"\"\nval wallet = DirectSigningWallet(mnemonic)\nval client = SigningCosmWasmClient.init(\n    grpcGatewayEndpoint,\n    wallet\n)\n```\n\n#### Query Contract\n\n```kotlin\nval contractAddress = \"secret1lz4m46vpdn8f2aj8yhtnexus40663udv7hhprm\"\nval contractInfoQuery = \"\"\"{\"contract_info\": {}}\"\"\"\nval contractInfo = client.queryContractSmart(contractAddress, contractInfoQuery)\nprintln(\"nft contract info response: $contractInfo\")\n```\n\n#### Simulate Execute + Execute + Query Contract(Generate and use viewing key for query)\n\n```kotlin\n// Entropy: Secure implementation is left to the client, but it is recommended to use base-64 encoded random bytes and not predictable inputs.\nval entropy = \"Another really random thing??\"\nval handleMsg = \"\"\"{ \"create_viewing_key\": {\"entropy\": \"$entropy\"} }\"\"\"\nprintln(\"Creating viewing key\")\nval msgs = listOf(\n    MsgExecuteContract(\n        sender = accAddress,\n        contractAddress = contractAddress,\n        msg = handleMsg,\n        codeHash = \"\" // optional but faster if you include\n    )\n)\nval simulate = client.simulate(msgs)\nval gasLimit = (simulate.gasUsed.toDouble() * 1.1).toInt()\nval response = client.execute(\n    msgs,\n    txOptions = TxOptions(gasLimit = gasLimit)\n)\nprintln(\"viewing key response: ${response.data}\")\nval viewingKey = json.parseToJsonElement(response.data[0])\n    .jsonObject[\"viewing_key\"]!!\n    .jsonObject[\"key\"]!!.jsonPrimitive.content\nprintln(\"Querying Num Tokens\")\nval numTokensQuery =\n    \"\"\"\n    {\n        \"num_tokens\": {\n            \"viewer\": {\n                \"address\": \"$accAddress\",\n                \"viewing_key\": \"$viewingKey\"\n            }\n        }\n    }\n    \"\"\"\n\nval numTokens = client.queryContractSmart(contractAddress, numTokensQuery)\nprintln(\"Num Tokens Response: $numTokens\")\n```\n\n#### Bank Send Tx\n\n```kotlin\nval client = SigningCosmWasmClient.init(\n    grpcGatewayEndpoint,\n    accAddress,\n    wallet\n)\nval toAccount = wallet.addAccount()\nval amountToSend = listOf(Coin(10, \"uscrt\"))\nval msgs = listOf(\n    MsgSend(\n        fromAddress = accAddress,\n        toAddress = toAccount.publicData.address,\n        amount = amountToSend\n    )\n)\nval simulate = client.simulate(msgs)\nval gasLimit = (simulate.gasUsed.toDouble() * 1.1).toInt()\nclient.execute(\n    msgs,\n    txOptions = TxOptions(gasLimit = gasLimit)\n)\nval recipientBalance = client.getBalance(toAccount.publicData.address).balances\nprintln(\"recipientBalance: $recipientBalance\")\n```\n\n### Swift\n\n#### Create SigningCosmWasmClient\n\n```swift\nlet wallet = DirectSigningWallet(mnemonic: mnemonic)\nlet SigningCosmWasmClientCompanion = SigningCosmWasmClient.Companion()\nlet client = try! await SigningCosmWasmClient.Companion.doInit(SigningCosmWasmClientCompanion)(\n    apiUrl: grpcGatewayEndpoint,\n    wallet: wallet,\n    enigmaUtils: nil,\n    broadcastMode: BroadcastMode.block,\n    chainId: nil\n)\n```\n\n#### Query Contract\n\n```swift\nlet contractAddress = \"secret1lz4m46vpdn8f2aj8yhtnexus40663udv7hhprm\"\nlet contractInfoQuery = #\"{\"contract_info\": {}}\"#\nlet contractInfo = try! await client.queryContractSmart(\n    contractAddress: contractAddress,\n    queryMsg: contractInfoQuery,\n    contractCodeHash: nil)\nprint(\"nft contract info response: \\(contractInfo)\")\n```\n\n#### Simulate Execute + Execute + Query Contract(Generate and use viewing key for query)\n\n```swift\n// Entropy: Secure implementation is left to the client, but it is recommended to use base-64 encoded random bytes and not predictable inputs.\nlet msgs = [\n    MsgExecuteContract(\n        sender: accAddress,\n        contractAddress: contractAddress,\n        msg: handleMsg,\n        sentFunds: [],\n        codeHash: nil  // optional but faster if you include\n    )\n]\nlet gasLimit = Int32(50_000)\nlet response = try! await client.execute(\n    msgs: msgs,\n    txOptions: TxOptions(customGasLimit: gasLimit)\n)\nprint(\"viewing key response: \\(response.data)\")\n\nlet decoder = JSONDecoder()\nstruct ViewingKey: Codable {\n    var viewing_key: ViewingKeyValue\n    struct ViewingKeyValue: Codable{\n        var key: String\n    }\n}\nlet viewingKey = try! decoder.decode(ViewingKey.self, from: response.data[0].data(using: .utf8)!)\n\nprint(\"Querying Num Tokens\")\nlet numTokensQuery = #\"\"\"\n    {\n        \"num_tokens\": {\n            \"viewer\": {\n                \"address\": \"\\#(accAddress)\",\n                \"viewing_key\": \"\\#(viewingKey.viewing_key.key)\"\n            }\n        }\n    }\n    \"\"\"#\nlet numTokens = try! await client.queryContractSmart(\n    contractAddress: contractAddress,\n    queryMsg: numTokensQuery,\n    contractCodeHash: nil)\nprint(\"Num Tokens Response: \\(numTokens)\")\n```\n\n### Credits:\n\n#### Based on the work of:\n\n- [secret.js](https://github.com/scrtlabs/SecretNetwork/tree/f01dda32b12e02c6cc2326ea58f8b13bf6e3ff8f/cosmwasm-js/packages/sdk)\n- [Old secret.js](https://github.com/scrtlabs/secret.js)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feqoty-labs%2Fsecretk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feqoty-labs%2Fsecretk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feqoty-labs%2Fsecretk/lists"}