Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .env.local
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ NEXT_PUBLIC_GHOSTCLOUD_ADDRESS_PREFIX=gc
NEXT_PUBLIC_GHOSTCLOUD_DENOM=token
NEXT_PUBLIC_GHOSTCLOUD_URL_SCHEME=http
NEXT_PUBLIC_GHOSTCLOUD_URL_DOMAIN=localhost:8880
NEXT_PUBLIC_GHOSTCLOUD_CREATE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_UPDATE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_REMOVE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_GAS_PRICE=0.000000025
NEXT_PUBLIC_GHOSTCLOUD_GAS_LIMIT_MULTIPLIER=1.5
5 changes: 2 additions & 3 deletions .env.production.local
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ NEXT_PUBLIC_GHOSTCLOUD_ADDRESS_PREFIX=gc
NEXT_PUBLIC_GHOSTCLOUD_DENOM=token
NEXT_PUBLIC_GHOSTCLOUD_URL_SCHEME=https
NEXT_PUBLIC_GHOSTCLOUD_URL_DOMAIN=ghostcloud.org
NEXT_PUBLIC_GHOSTCLOUD_CREATE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_UPDATE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_REMOVE_FEE=1
NEXT_PUBLIC_GHOSTCLOUD_GAS_PRICE=0.000000025
NEXT_PUBLIC_GHOSTCLOUD_GAS_LIMIT_MULTIPLIER=1.5
16 changes: 10 additions & 6 deletions config/ghostcloud-chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { ChainNamespaceType, CustomChainConfig } from "@web3auth/base"
import { UIConfig } from "@web3auth/ui"
import { GasPrice } from "@cosmjs/stargate"

export const GHOSTCLOUD_ADDRESS_PREFIX =
process.env["NEXT_PUBLIC_GHOSTCLOUD_ADDRESS_PREFIX"] ?? "gc"
Expand All @@ -21,15 +22,18 @@ export const GHOSTCLOUD_URL_DOMAIN =
process.env["NEXT_PUBLIC_GHOSTCLOUD_URL_DOMAIN"] ?? "localhost:8880"
export const GHOSTCLOUD_URL_SCHEME =
process.env["NEXT_PUBLIC_GHOSTCLOUD_URL_SCHEME"] ?? "http"
export const GHOSTCLOUD_CREATE_FEE =
process.env["NEXT_PUBLIC_GHOSTCLOUD_CREATE_FEE"] ?? "1"
export const GHOSTCLOUD_UPDATE_FEE =
process.env["NEXT_PUBLIC_GHOSTCLOUD_UPDATE_FEE"] ?? "1"
export const GHOSTCLOUD_REMOVE_FEE =
process.env["NEXT_PUBLIC_GHOSTCLOUD_REMOVE_FEE"] ?? "1"
export const GHOSTCLOUD_GAS_PRICE_AMOUNT =
process.env["NEXT_PUBLIC_GHOSTCLOUD_GAS_PRICE"] ?? "0.000000025"
export const GHOSTCLOUD_GAS_PRICE_DENOM =
process.env["NEXT_PUBLIC_GHOSTCLOUD_GAS_PRICE_DENOM"] ?? GHOSTCLOUD_DENOM
export const GHOSTCLOUD_GAS_LIMIT_MULTIPLIER =
Number(process.env["NEXT_PUBLIC_GHOSTCLOUD_GAS_LIMIT_MULTIPLIER"]) || 1.5
export const GHOSTCLOUD_LIGHT_LOGO = "/logo192-black.png"
export const GHOSTCLOUD_DARK_LOGO = "/logo192-white.png"
export const GHOSTCLOUD_MODAL_PRIMARY_COLOR = "gray"
export const GHOSTCLOUD_GAS_PRICE = GasPrice.fromString(
GHOSTCLOUD_GAS_PRICE_AMOUNT.concat(GHOSTCLOUD_GAS_PRICE_DENOM),
)

export const GHOSTCLOUD_CHAIN_CONFIG = {
chainNamespace: GHOSTCLOUD_CHAIN_NAMESPACE,
Expand Down
98 changes: 66 additions & 32 deletions lib/ghostcloud.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import {
getSigningGhostcloudClient,
ghostcloud,
cosmos,
cosmosAminoConverters,
cosmosProtoRegistry,
ghostcloud,
ghostcloudAminoConverters,
ghostcloudProtoRegistry,
} from "@liftedinit/gcjs"
import {
GHOSTCLOUD_ADDRESS_PREFIX,
GHOSTCLOUD_CREATE_FEE,
GHOSTCLOUD_DENOM,
GHOSTCLOUD_REMOVE_FEE,
GHOSTCLOUD_GAS_LIMIT_MULTIPLIER,
GHOSTCLOUD_GAS_PRICE,
GHOSTCLOUD_RPC_TARGET,
GHOSTCLOUD_UPDATE_FEE,
} from "../config/ghostcloud-chain"
import useWeb3AuthStore from "../store/web3-auth"
import {
DirectSecp256k1Wallet,
OfflineDirectSigner,
GeneratedType,
Registry,
} from "@cosmjs/proto-signing"
import { DeploymentData } from "../components/create-deployment"
import { fileToArrayBuffer } from "../helpers/files"
Expand All @@ -26,20 +30,49 @@ import {
} from "react-query"
import { QueryMetasResponse } from "@liftedinit/gcjs/dist/codegen/ghostcloud/ghostcloud/query"
import { useDisplayError } from "../helpers/errors"
import { Coin } from "@cosmjs/stargate"

// Create a client for sending transactions to Ghostcloud RPC endpoint
// The transaction signer is the given private key
async function createGhostcloudRpcClient(pk: Buffer) {
import {
AminoTypes,
calculateFee,
Coin,
GasPrice,
SigningStargateClient,
} from "@cosmjs/stargate"

async function createSigner(pk: Buffer) {
const getSignerFromKey = async (): Promise<OfflineDirectSigner> => {
return DirectSecp256k1Wallet.fromKey(pk, GHOSTCLOUD_ADDRESS_PREFIX)
}
const signer: OfflineDirectSigner = await getSignerFromKey()
return await getSignerFromKey()
}
async function createStargateSigningClient(pk: Buffer) {
const signer = await createSigner(pk)
const protoRegistry: ReadonlyArray<[string, GeneratedType]> = [
...cosmosProtoRegistry,
...ghostcloudProtoRegistry,
]

const aminoConverters = {
...cosmosAminoConverters,
...ghostcloudAminoConverters,
}

return await getSigningGhostcloudClient({
rpcEndpoint: GHOSTCLOUD_RPC_TARGET,
signer: signer,
})
const registry = new Registry(protoRegistry)
const aminoTypes = new AminoTypes(aminoConverters)
return await SigningStargateClient.connectWithSigner(
GHOSTCLOUD_RPC_TARGET,
signer,
{
registry: registry,
aminoTypes: aminoTypes,
gasPrice: GHOSTCLOUD_GAS_PRICE,
},
)
}

// Create a client for sending transactions to Ghostcloud RPC endpoint
// The transaction signer is the given private key
async function createGhostcloudRpcClient(pk: Buffer) {
return await createStargateSigningClient(pk)
}

// Create a deployment message from the given deployment data
Expand Down Expand Up @@ -85,17 +118,17 @@ export const useCreateDeployment = () => {
Buffer.from(await store.getPrivateKey(), "hex"),
)
const msg = await createDeploymentMsg(data, creator)
// TODO: Fix fees
const gasEstimation = await client.simulate(creator, [msg], "")
const fee = calculateFee(
Math.round(gasEstimation * GHOSTCLOUD_GAS_LIMIT_MULTIPLIER),
GHOSTCLOUD_GAS_PRICE,
)
const response = await client.signAndBroadcast(
creator,
[msg],
{
amount: [{ denom: GHOSTCLOUD_DENOM, amount: GHOSTCLOUD_CREATE_FEE }],
gas: "100000000",
},
fee,
data.memo,
)

if (response.code) {
throw new Error(
`Deployment creation failed with error code: ${response.code}. Raw log: ${response.rawLog}`,
Expand Down Expand Up @@ -155,14 +188,15 @@ export const useUpdateDeployment = () => {
Buffer.from(await store.getPrivateKey(), "hex"),
)
const msg = await updateDeploymentMsg(data, creator)
// TODO: Fix fees
const gasEstimation = await client.simulate(creator, [msg], "")
const fee = calculateFee(
Math.round(gasEstimation * GHOSTCLOUD_GAS_LIMIT_MULTIPLIER),
GHOSTCLOUD_GAS_PRICE,
)
const response = await client.signAndBroadcast(
creator,
[msg],
{
amount: [{ denom: GHOSTCLOUD_DENOM, amount: GHOSTCLOUD_UPDATE_FEE }],
gas: "100000000",
},
fee,
data.memo,
)

Expand Down Expand Up @@ -205,12 +239,12 @@ export const useRemoveDeployment = () => {
Buffer.from(await store.getPrivateKey(), "hex"),
)
const msg = await removeDeploymentMsg(name, creator)

// TODO: Fix fees
const response = await client.signAndBroadcast(creator, [msg], {
amount: [{ denom: GHOSTCLOUD_DENOM, amount: GHOSTCLOUD_REMOVE_FEE }],
gas: "100000000",
})
const gasEstimation = await client.simulate(creator, [msg], "")
const fee = calculateFee(
Math.round(gasEstimation * GHOSTCLOUD_GAS_LIMIT_MULTIPLIER),
GHOSTCLOUD_GAS_PRICE,
)
const response = await client.signAndBroadcast(creator, [msg], fee)

if (response.code) {
throw new Error(
Expand Down