Skip to content

Commit

Permalink
changing get signer implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
cworsnop-figure committed May 11, 2022
1 parent f46f8ec commit dcc3b0d
Show file tree
Hide file tree
Showing 12 changed files with 64 additions and 46 deletions.
4 changes: 4 additions & 0 deletions buildSrc/src/main/kotlin/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ object Versions {
const val ProvenanceProto = "1.8.0"
const val Reflections = "0.9.10"
const val NexusPublishing = "1.1.0"
const val BouncyCastle = "1.70"
}

object Plugins { // please keep this sorted in sections
Expand Down Expand Up @@ -188,6 +189,9 @@ object Dependencies {
}

val Reflections = DependencySpec("org.reflections:reflections", Versions.Reflections)

val BouncyCastleProvider = DependencySpec("org.bouncycastle:bcprov-jdk15on", Versions.BouncyCastle)
val BouncyCastle = DependencySpec("org.bouncycastle:bcpkix-jdk15on", Versions.BouncyCastle)
}

data class PluginSpec(
Expand Down
2 changes: 2 additions & 0 deletions service/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ dependencies {
Dependencies.Grpc.Protobuf,
Dependencies.Grpc.Stub,
Dependencies.Reflections,
Dependencies.BouncyCastle,
Dependencies.BouncyCastleProvider,

).forEach { dep ->
dep.implementation(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ import cosmos.tx.v1beta1.TxOuterClass
import io.provenance.api.models.p8e.ProvenanceConfig
import io.provenance.api.models.p8e.TxResponse
import io.provenance.client.grpc.Signer
import io.provenance.hdwallet.wallet.Account
import io.provenance.metadata.v1.ScopeResponse
import io.provenance.onboarding.domain.usecase.common.model.TxBody
import io.provenance.onboarding.frameworks.provenance.ProvenanceTx
import java.util.UUID

interface Provenance {
fun onboard(chainId: String, nodeEndpoint: String, account: Account, storeTxBody: TxBody): TxResponse
fun onboard(chainId: String, nodeEndpoint: String, signer: Signer, storeTxBody: TxBody): TxResponse
fun executeTransaction(config: ProvenanceConfig, tx: TxOuterClass.TxBody, signer: Signer): Abci.TxResponse
fun buildContractTx(config: ProvenanceConfig, tx: ProvenanceTx): TxOuterClass.TxBody?
fun getScope(config: ProvenanceConfig, scopeUuid: UUID): ScopeResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import io.provenance.onboarding.domain.provenance.Provenance
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.cee.common.client.CreateClient
import io.provenance.onboarding.domain.usecase.cee.common.client.model.CreateClientRequest
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.frameworks.provenance.utility.ProvenanceUtils
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.scope.contract.proto.Envelopes
import io.provenance.scope.sdk.FragmentResult
import org.springframework.stereotype.Component
Expand All @@ -17,18 +16,16 @@ import org.springframework.stereotype.Component
class ApproveContractExecution(
private val createClient: CreateClient,
private val provenance: Provenance,
private val getAccount: GetAccount,
private val getSigner: GetSigner,
) : AbstractUseCase<ApproveContractRequest, Unit>() {
override suspend fun execute(args: ApproveContractRequest) {
val utils = ProvenanceUtils()
val client = createClient.execute(CreateClientRequest(args.account, args.client))
val envelope = Envelopes.Envelope.newBuilder().mergeFrom(args.envelope).build()

when (val result = client.execute(envelope)) {
is FragmentResult -> {
val approvalTxHash = client.approveScopeUpdate(result.envelopeState, args.expiration).let {
val account = getAccount.execute(args.account)
val signer = utils.getSigner(account)
val signer = getSigner.execute(args.account)
val txBody = TxOuterClass.TxBody.newBuilder().addAllMessages(it.map { msg -> Any.pack(msg, "") }).build()
val broadcast = provenance.executeTransaction(args.provenanceConfig, txBody, signer)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.cee.common.client.CreateClient
import io.provenance.onboarding.domain.usecase.cee.common.client.model.CreateClientRequest
import io.provenance.onboarding.domain.usecase.common.originator.GetOriginator
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.onboarding.frameworks.provenance.SingleTx
import io.provenance.onboarding.frameworks.provenance.utility.ProvenanceUtils
import io.provenance.scope.contract.annotations.Input
import io.provenance.scope.contract.spec.P8eContract
import io.provenance.scope.sdk.FragmentResult
Expand All @@ -32,16 +31,14 @@ private val log = KotlinLogging.logger { }
class ExecuteContract(
private val contractService: ContractService,
private val provenanceService: Provenance,
private val getAccount: GetAccount,
private val getSigner: GetSigner,
private val contractParser: ContractParser,
private val createClient: CreateClient,
private val getOriginator: GetOriginator,
) : AbstractUseCase<ExecuteContractRequest, Any>() {

override suspend fun execute(args: ExecuteContractRequest): ContractExecutionResponse {
val utils = ProvenanceUtils()
val account = getAccount.execute(args.config.account)
val signer = utils.getSigner(account)
val signer = getSigner.execute(args.config.account)
val client = createClient.execute(CreateClientRequest(args.config.account, args.config.client, args.participants))
val contract = contractService.getContract(args.config.contract.contractName)
val records = getRecords(args.records, contract)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ import io.provenance.api.models.cee.SubmitContractExecutionResultRequest
import io.provenance.api.models.p8e.TxResponse
import io.provenance.onboarding.domain.provenance.Provenance
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.onboarding.frameworks.provenance.SingleTx
import io.provenance.onboarding.frameworks.provenance.utility.ProvenanceUtils
import io.provenance.scope.contract.proto.Envelopes
import io.provenance.scope.sdk.SignedResult
import io.provenance.scope.sdk.extensions.mergeInto
Expand All @@ -15,12 +14,10 @@ import org.springframework.stereotype.Component
@Component
class SubmitContractExecutionResult(
private val provenanceService: Provenance,
private val getAccount: GetAccount,
private val getSigner: GetSigner,
) : AbstractUseCase<SubmitContractExecutionResultRequest, TxResponse>() {
override suspend fun execute(args: SubmitContractExecutionResultRequest): TxResponse {
val utils = ProvenanceUtils()
val account = getAccount.execute(args.account)
val signer = utils.getSigner(account)
val signer = getSigner.execute(args.account)

val envelope = Envelopes.Envelope.newBuilder().mergeFrom(args.envelope).build()
val state = Envelopes.EnvelopeState.newBuilder().mergeFrom(args.state).build()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
package io.provenance.onboarding.domain.usecase.provenance.account

import io.provenance.api.models.account.AccountInfo
import io.provenance.core.KeyType
import io.provenance.hdwallet.wallet.Account
import io.provenance.client.grpc.Signer
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.common.originator.GetOriginator
import io.provenance.onboarding.frameworks.provenance.utility.ProvenanceUtils
import org.springframework.stereotype.Component
import java.lang.IllegalStateException
import java.security.PrivateKey
import java.security.PublicKey

@Component
class GetAccount(
class GetSigner(
private val getOriginator: GetOriginator
) : AbstractUseCase<AccountInfo, Account>() {
override suspend fun execute(args: AccountInfo): Account {
) : AbstractUseCase<AccountInfo, Signer>() {
override suspend fun execute(args: AccountInfo): Signer {
val utils = ProvenanceUtils()

val originator = getOriginator.execute(args.originatorUuid)

return originator.keys[KeyType.MNEMONIC]?.let { mnemonic ->
utils.getAccount(mnemonic.toString(), args.isTestNet, args.keyRingIndex, args.keyIndex)
} ?: throw IllegalStateException("Account does not exist: ${args.originatorUuid}.")
return originator.signingPublicKey().let { public ->
originator.signingPrivateKey().let { private ->
utils.getSigner(public as PublicKey, private as PrivateKey, !args.isTestNet)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package io.provenance.onboarding.domain.usecase.provenance.tx
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.common.model.ScopeConfig
import io.provenance.onboarding.domain.usecase.common.model.TxBody
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.onboarding.domain.usecase.provenance.tx.model.CreateTxRequest
import io.provenance.onboarding.frameworks.objectStore.AudienceKeyManager
import io.provenance.onboarding.frameworks.objectStore.DefaultAudience
Expand All @@ -14,12 +14,12 @@ import org.springframework.stereotype.Component
@Component
class CreateTx(
private val audienceKeyManager: AudienceKeyManager,
private val getAccount: GetAccount
private val getSigner: GetSigner
) : AbstractUseCase<CreateTxRequest, TxBody>() {
override suspend fun execute(args: CreateTxRequest): TxBody {
val utils = ProvenanceUtils()

val account = getAccount.execute(args.account)
val account = getSigner.execute(args.account)
val additionalAudiences = args.permissions?.audiences?.map { it.getAddress(!args.account.isTestNet) }?.toMutableSet() ?: mutableSetOf()

if (args.permissions?.permissionDart == true) {
Expand All @@ -37,7 +37,7 @@ class CreateTx(
args.scopeSpecId,
),
args.contractInput,
account.address.value,
account.address(),
additionalAudiences
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@ package io.provenance.onboarding.domain.usecase.provenance.tx
import io.provenance.api.models.p8e.TxResponse
import io.provenance.onboarding.domain.provenance.Provenance
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.onboarding.domain.usecase.provenance.tx.model.CreateTxOnboardAssetRequest
import org.springframework.stereotype.Component

@Component
class CreateTxOnboardAsset(
private val provenance: Provenance,
private val createOnboardTx: CreateTx,
private val getAccount: GetAccount,
private val getSigner: GetSigner,
) : AbstractUseCase<CreateTxOnboardAssetRequest, TxResponse>() {
override suspend fun execute(args: CreateTxOnboardAssetRequest): TxResponse {
val account = getAccount.execute(args.txRequest.account)
val signer = getSigner.execute(args.txRequest.account)
val tx = createOnboardTx.execute(args.txRequest)

return provenance.onboard(args.chainId, args.nodeEndpoint, account, tx)
return provenance.onboard(args.chainId, args.nodeEndpoint, signer, tx)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ package io.provenance.onboarding.domain.usecase.provenance.tx
import io.provenance.api.models.p8e.TxResponse
import io.provenance.onboarding.domain.provenance.Provenance
import io.provenance.onboarding.domain.usecase.AbstractUseCase
import io.provenance.onboarding.domain.usecase.provenance.account.GetAccount
import io.provenance.onboarding.domain.usecase.provenance.account.GetSigner
import io.provenance.onboarding.domain.usecase.provenance.tx.model.ExecuteTxRequest
import org.springframework.stereotype.Component

@Component
class ExecuteTx(
private val provenance: Provenance,
private val getAccount: GetAccount,
private val getSigner: GetSigner,
) : AbstractUseCase<ExecuteTxRequest, TxResponse>() {
override suspend fun execute(args: ExecuteTxRequest): TxResponse {
val account = getAccount.execute(args.account)
return provenance.onboard(args.chainId, args.nodeEndpoint, account, args.tx)
val signer = getSigner.execute(args.account)
return provenance.onboard(args.chainId, args.nodeEndpoint, signer, args.tx)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import io.provenance.client.grpc.BaseReqSigner
import io.provenance.client.grpc.GasEstimationMethod
import io.provenance.client.grpc.PbClient
import io.provenance.client.grpc.Signer
import io.provenance.hdwallet.wallet.Account
import io.provenance.metadata.v1.ScopeRequest
import io.provenance.metadata.v1.ScopeResponse
import io.provenance.onboarding.domain.provenance.Provenance
Expand All @@ -21,7 +20,6 @@ import io.provenance.onboarding.frameworks.provenance.extensions.getBaseAccount
import io.provenance.onboarding.frameworks.provenance.extensions.getCurrentHeight
import io.provenance.onboarding.frameworks.provenance.extensions.getErrorResult
import io.provenance.onboarding.frameworks.provenance.extensions.isError
import io.provenance.onboarding.frameworks.provenance.utility.ProvenanceUtils
import io.provenance.scope.sdk.SignedResult
import mu.KotlinLogging
import org.springframework.stereotype.Component
Expand Down Expand Up @@ -91,9 +89,8 @@ class ProvenanceService : Provenance {
return result.txResponse
}

override fun onboard(chainId: String, nodeEndpoint: String, account: Account, storeTxBody: TxBody): TxResponse {
override fun onboard(chainId: String, nodeEndpoint: String, signer: Signer, storeTxBody: TxBody): TxResponse {
val pbClient = PbClient(chainId, URI(nodeEndpoint), GasEstimationMethod.MSG_FEE_CALCULATION)
val utility = ProvenanceUtils()

val txBody = TxOuterClass.TxBody.newBuilder().also {
storeTxBody.base64.forEach { tx ->
Expand All @@ -103,7 +100,7 @@ class ProvenanceService : Provenance {

val response = pbClient.estimateAndBroadcastTx(
txBody = txBody,
signers = listOf(BaseReqSigner(utility.getSigner(account))),
signers = listOf(BaseReqSigner(signer)),
mode = ServiceOuterClass.BroadcastMode.BROADCAST_MODE_SYNC,
gasAdjustment = 1.5
).txResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import cosmos.crypto.secp256k1.Keys
import cosmos.tx.v1beta1.TxOuterClass
import io.provenance.client.grpc.Signer
import io.provenance.hdwallet.bip39.MnemonicWords
import io.provenance.hdwallet.common.hashing.sha256
import io.provenance.hdwallet.ec.extensions.toECPrivateKey
import io.provenance.hdwallet.hrp.Hrp
import io.provenance.hdwallet.signer.BCECSigner
import io.provenance.hdwallet.wallet.Account
import io.provenance.hdwallet.wallet.Wallet
import io.provenance.metadata.v1.DefinitionType
Expand All @@ -30,8 +33,12 @@ import io.provenance.onboarding.frameworks.provenance.extensions.toAny
import io.provenance.onboarding.frameworks.provenance.extensions.toBase64String
import io.provenance.onboarding.frameworks.provenance.extensions.toJson
import io.provenance.onboarding.frameworks.provenance.extensions.toTxBody
import io.provenance.scope.encryption.util.getAddress
import io.provenance.scope.util.MetadataAddress
import io.provenance.scope.util.toByteString
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey
import java.security.PrivateKey
import java.security.PublicKey
import java.util.UUID

class ProvenanceUtils {
Expand Down Expand Up @@ -260,6 +267,22 @@ class ProvenanceUtils {
}
}

fun getSigner(publicKey: PublicKey, privateKey: PrivateKey, isMainnet: Boolean): Signer {
return object : Signer {
override fun address(): String = publicKey.getAddress(isMainnet)

override fun pubKey(): Keys.PubKey =
Keys.PubKey.newBuilder()
.setKey((publicKey as BCECPublicKey).q.getEncoded(true).toByteString())
.build()

override fun sign(data: ByteArray): ByteArray =
BCECSigner().sign(privateKey.toECPrivateKey(), data.sha256())
.encodeAsBTC()
.toByteArray()
}
}

fun getAccount(keyMnemonic: String, isTestNet: Boolean, keyRingIndex: Int, keyIndex: Int) =
Wallet.fromMnemonic(
hrp = Hrp.ProvenanceBlockchain.testnet,
Expand Down

0 comments on commit dcc3b0d

Please sign in to comment.