Get cost of deployment using newly published records
This commit is contained in:
parent
00cfd280c0
commit
aa1f6e461a
@ -21,7 +21,8 @@ NEXT_PUBLIC_REGISTRY_CHAIN_ID=laconic-mainnet
|
|||||||
NEXT_PUBLIC_REGISTRY_RPC_ENDPOINT=https://laconicd-mainnet-1.laconic.com
|
NEXT_PUBLIC_REGISTRY_RPC_ENDPOINT=https://laconicd-mainnet-1.laconic.com
|
||||||
NEXT_PUBLIC_REGISTRY_GQL_ENDPOINT=https://laconicd-mainnet-1.laconic.com/graphql
|
NEXT_PUBLIC_REGISTRY_GQL_ENDPOINT=https://laconicd-mainnet-1.laconic.com/graphql
|
||||||
NEXT_PUBLIC_REGISTRY_GAS_PRICE=0.001
|
NEXT_PUBLIC_REGISTRY_GAS_PRICE=0.001
|
||||||
NEXT_PUBLIC_PRICING_RECORD_LRN=
|
NEXT_PUBLIC_ALNT_COST_LRN=
|
||||||
|
NEXT_PUBLIC_DEPLOYMENT_COST_LRN=
|
||||||
REGISTRY_BOND_ID=
|
REGISTRY_BOND_ID=
|
||||||
REGISTRY_AUTHORITY=
|
REGISTRY_AUTHORITY=
|
||||||
REGISTRY_USER_KEY=
|
REGISTRY_USER_KEY=
|
||||||
|
@ -13,7 +13,7 @@ import { getRegistry, getRegistryConfig } from '@/config';
|
|||||||
import { getRequiredTokenInfo, RequiredTokenInfo } from '@/services/jupiter-price';
|
import { getRequiredTokenInfo, RequiredTokenInfo } from '@/services/jupiter-price';
|
||||||
import { IS_NAT_GOR_TRANSFER_ENABLED, SOLANA_GOR_MINT_ADDRESS } from '@/constants/payments';
|
import { IS_NAT_GOR_TRANSFER_ENABLED, SOLANA_GOR_MINT_ADDRESS } from '@/constants/payments';
|
||||||
import { PaymentMethod } from '@/types';
|
import { PaymentMethod } from '@/types';
|
||||||
import { resolvePricingRecordLrn } from '@/services/registry';
|
import { getCostOfDeployment } from '@/services/registry';
|
||||||
|
|
||||||
assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required');
|
assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required');
|
||||||
assert(!IS_NAT_GOR_TRANSFER_ENABLED || process.env.NEXT_PUBLIC_GORBAGANA_RPC_URL, 'GORBAGANA_RPC_URL is required when NAT GOR transfer is enabled');
|
assert(!IS_NAT_GOR_TRANSFER_ENABLED || process.env.NEXT_PUBLIC_GORBAGANA_RPC_URL, 'GORBAGANA_RPC_URL is required when NAT GOR transfer is enabled');
|
||||||
@ -219,8 +219,7 @@ export async function POST(request: NextRequest) {
|
|||||||
// Verify Solana payment
|
// Verify Solana payment
|
||||||
console.log('Step 0: Verifying Solana token payment...');
|
console.log('Step 0: Verifying Solana token payment...');
|
||||||
let requiredTokenInfo: RequiredTokenInfo;
|
let requiredTokenInfo: RequiredTokenInfo;
|
||||||
const pricingRecordAttributes = await resolvePricingRecordLrn();
|
const targetUsdAmount = await getCostOfDeployment();
|
||||||
const targetUsdAmount = parseInt(pricingRecordAttributes.amount, 10);
|
|
||||||
const mintAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS!;
|
const mintAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS!;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useCallback, useState, useEffect, useMemo } from 'react';
|
import { useCallback, useState, useEffect } from 'react';
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
|
|
||||||
import { Connection } from '@solana/web3.js';
|
import { Connection } from '@solana/web3.js';
|
||||||
@ -11,7 +11,7 @@ import { getRequiredTokenInfo, RequiredTokenInfo } from '@/services/jupiter-pric
|
|||||||
import { PaymentMethod, PaymentModalProps, PaymentRequest } from '@/types';
|
import { PaymentMethod, PaymentModalProps, PaymentRequest } from '@/types';
|
||||||
import { IS_NAT_GOR_TRANSFER_ENABLED, PAYMENT_METHOD_LABELS, SOLANA_GOR_MINT_ADDRESS } from '@/constants/payments';
|
import { IS_NAT_GOR_TRANSFER_ENABLED, PAYMENT_METHOD_LABELS, SOLANA_GOR_MINT_ADDRESS } from '@/constants/payments';
|
||||||
import { usePaymentMethod } from '@/contexts/PaymentMethodContext';
|
import { usePaymentMethod } from '@/contexts/PaymentMethodContext';
|
||||||
import { resolvePricingRecordLrn } from '@/services/registry';
|
import { getCostOfDeployment } from '@/services/registry';
|
||||||
|
|
||||||
assert(!IS_NAT_GOR_TRANSFER_ENABLED || process.env.NEXT_PUBLIC_GORBAGANA_RPC_URL, 'GORBAGANA_RPC_URL is required when NAT GOR transfer is enabled');
|
assert(!IS_NAT_GOR_TRANSFER_ENABLED || process.env.NEXT_PUBLIC_GORBAGANA_RPC_URL, 'GORBAGANA_RPC_URL is required when NAT GOR transfer is enabled');
|
||||||
|
|
||||||
@ -20,11 +20,6 @@ const GORBAGANA_RPC_URL = process.env.NEXT_PUBLIC_GORBAGANA_RPC_URL;
|
|||||||
assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required');
|
assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required');
|
||||||
assert(process.env.NEXT_PUBLIC_PRICING_RECORD_LRN, 'DEPLOYMENT_RECORD_LRN is required');
|
assert(process.env.NEXT_PUBLIC_PRICING_RECORD_LRN, 'DEPLOYMENT_RECORD_LRN is required');
|
||||||
|
|
||||||
interface DeploymentCostInfo {
|
|
||||||
amount: string;
|
|
||||||
currency: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function PaymentModal({
|
export default function PaymentModal({
|
||||||
isOpen,
|
isOpen,
|
||||||
onClose,
|
onClose,
|
||||||
@ -40,30 +35,18 @@ export default function PaymentModal({
|
|||||||
const [tokenAmount, setTokenAmount] = useState<number>(0);
|
const [tokenAmount, setTokenAmount] = useState<number>(0);
|
||||||
const [tokenDecimals, setTokenDecimals] = useState<number>(6); // Default fallback
|
const [tokenDecimals, setTokenDecimals] = useState<number>(6); // Default fallback
|
||||||
const [loadingPrice, setLoadingPrice] = useState(true);
|
const [loadingPrice, setLoadingPrice] = useState(true);
|
||||||
const [deploymentCostInfo, setDeploymentCostInfo] = useState<DeploymentCostInfo>();
|
const [deploymentCost, setDeploymentCost] = useState<number | null>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const getDeploymentCostInfo = async () => {
|
const getDeploymentCostInfo = async () => {
|
||||||
const pricingRecordAttributes = await resolvePricingRecordLrn();
|
const cost = await getCostOfDeployment();
|
||||||
|
|
||||||
setDeploymentCostInfo({
|
setDeploymentCost(cost);
|
||||||
amount: pricingRecordAttributes.amount,
|
|
||||||
currency:pricingRecordAttributes.currency
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getDeploymentCostInfo();
|
getDeploymentCostInfo();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Get configuration from environment variables
|
|
||||||
const deploymentCost = useMemo(() => {
|
|
||||||
if (!deploymentCostInfo) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return parseInt(deploymentCostInfo.amount, 10);
|
|
||||||
}, [deploymentCostInfo])
|
|
||||||
|
|
||||||
const mintAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS!;
|
const mintAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS!;
|
||||||
const tokenSymbol = process.env.NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL;
|
const tokenSymbol = process.env.NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL;
|
||||||
|
|
||||||
|
@ -3,12 +3,13 @@ import assert from 'assert';
|
|||||||
import { getRegistry } from '@/config';
|
import { getRegistry } from '@/config';
|
||||||
import { CreateRecordResponse, PricingRecordAttributes, PaymentMethod } from '../types';
|
import { CreateRecordResponse, PricingRecordAttributes, PaymentMethod } from '../types';
|
||||||
|
|
||||||
assert(process.env.NEXT_PUBLIC_PRICING_RECORD_LRN, 'DEPLOYMENT_RECORD_LRN is required');
|
assert(process.env.NEXT_PUBLIC_DEPLOYMENT_COST_LRN, 'DEPLOYMENT_RECORD_LRN is required');
|
||||||
const PRICING_RECORD_LRN = process.env.NEXT_PUBLIC_PRICING_RECORD_LRN;
|
assert(process.env.NEXT_PUBLIC_ALNT_COST_LRN, 'DEPLOYMENT_RECORD_LRN is required');
|
||||||
|
|
||||||
const SUPPORTED_CURRENCY = "USD";
|
|
||||||
const VALID_PRICING_RECORD_FOR = "webapp-deployment";
|
|
||||||
|
|
||||||
|
const DEPLOYMENT_COST_LRN = process.env.NEXT_PUBLIC_DEPLOYMENT_COST_LRN;
|
||||||
|
const DEPLOYMENT = 'webapp-deployment';
|
||||||
|
const ALNT_COST_LRN = process.env.NEXT_PUBLIC_ALNT_COST_LRN;
|
||||||
|
const ALNT = 'alnt';
|
||||||
|
|
||||||
export const createApplicationDeploymentRequest = async (
|
export const createApplicationDeploymentRequest = async (
|
||||||
url: string,
|
url: string,
|
||||||
@ -60,18 +61,36 @@ export const createApplicationDeploymentRequest = async (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const resolvePricingRecordLrn = async (): Promise<PricingRecordAttributes> => {
|
const resolvePricingRecordLrns = async (lrns: string[]): Promise<PricingRecordAttributes[]> => {
|
||||||
const registry = getRegistry();
|
const registry = getRegistry();
|
||||||
const result = await registry.resolveNames([PRICING_RECORD_LRN]);
|
const result = await registry.resolveNames(lrns);
|
||||||
const pricingRecordAttributes: PricingRecordAttributes = result[0].attributes;
|
const pricingRecordsAttributes: PricingRecordAttributes[] = result.map((record: any) => {
|
||||||
|
return record.attributes
|
||||||
|
});
|
||||||
|
|
||||||
if (pricingRecordAttributes.for !== VALID_PRICING_RECORD_FOR) {
|
return pricingRecordsAttributes;
|
||||||
throw new Error(`Incorrect pricing record type: ${pricingRecordAttributes.type}. Please provide correct pricing record lrn`)
|
};
|
||||||
|
|
||||||
|
export const getCostOfDeployment = async (): Promise<number> => {
|
||||||
|
const resolvedRecords = await resolvePricingRecordLrns([ALNT_COST_LRN, DEPLOYMENT_COST_LRN]);
|
||||||
|
console.log('resolvedRecords:', resolvedRecords);
|
||||||
|
|
||||||
|
// Find the ALNT price record (USD per ALNT)
|
||||||
|
const alntPriceRecord = resolvedRecords.find(record => record.for === ALNT);
|
||||||
|
// Find the deployment cost record (ALNT cost for webapp-deployment)
|
||||||
|
const deploymentCostRecord = resolvedRecords.find(record => record.for === DEPLOYMENT);
|
||||||
|
|
||||||
|
if (!alntPriceRecord || !deploymentCostRecord) {
|
||||||
|
throw new Error('Required pricing records not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pricingRecordAttributes.currency !== SUPPORTED_CURRENCY) {
|
// Convert strings to numbers for calculation
|
||||||
throw new Error(`Unsupported currency found in pricing record: ${pricingRecordAttributes.currency}`)
|
const alntPriceUsd = parseFloat(alntPriceRecord.amount); // USD per ALNT
|
||||||
}
|
const deploymentCostAlnt = parseFloat(deploymentCostRecord.amount); // ALNT required
|
||||||
|
|
||||||
return pricingRecordAttributes;
|
// Calculate deployment cost in USD: (ALNT required) * (USD per ALNT)
|
||||||
|
const deploymentCostUsd = deploymentCostAlnt * alntPriceUsd;
|
||||||
|
|
||||||
|
// Return with 6 decimal precision
|
||||||
|
return parseFloat(deploymentCostUsd.toFixed(6));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user