Skip to content

Commit

Permalink
Address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
h0ngcha0 committed Oct 23, 2024
1 parent 536b03f commit 1e34951
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 155 deletions.
56 changes: 8 additions & 48 deletions packages/extension/src/inpage/alephiumWindowObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,12 @@ import {
NodeProvider,
SignChainedTxParams,
SignChainedTxResult,
SignDeployContractChainedTxResult,
SignDeployContractTxParams,
SignExecuteScriptChainedTxResult,
SignDeployContractTxResult,
SignExecuteScriptTxParams,
SignExecuteScriptTxResult,
SignMessageParams,
SignMessageResult,
SignTransferChainedTxResult,
SignTransferTxParams,
SignTransferTxResult,
SignUnsignedTxParams,
Expand All @@ -34,6 +31,7 @@ import { TransactionParams } from "../shared/actionQueue/types"
import { sendMessage, waitForMessage } from "./messageActions"
import { getIsPreauthorized, removePreAuthorization } from "./messaging"
import { handleAddTokenRequest } from "./requestMessageHandlers"
import { signedChainedTxParamsToTransactionParams, transactionResultToSignUnsignedTxResult } from "../shared/transactions/transformers"

const VERSION = `${process.env.VERSION}`
const USER_ACTION_TIMEOUT = 10 * 60 * 1000
Expand Down Expand Up @@ -223,32 +221,9 @@ export const alephiumWindowObject: AlephiumWindowObject =
throw Error("Empty transaction params")
}

const transactionParamz: TransactionParams[] = params.map(param => {
const paramsType = param.type
const salt = Date.now().toString()
switch (paramsType) {
case 'Transfer':
return {
type: 'TRANSFER',
params: { networkId: this.connectedNetworkId, ...param },
salt
}
case 'DeployContract':
return {
type: 'DEPLOY_CONTRACT',
params: { networkId: this.connectedNetworkId, ...param },
salt
}
case 'ExecuteScript':
return {
type: 'EXECUTE_SCRIPT',
params: { networkId: this.connectedNetworkId, ...param },
salt
}
default:
throw new Error(`Unsupported transaction type: ${paramsType}`);
}
})
const transactionParamz: TransactionParams[] = params.map(param =>
signedChainedTxParamsToTransactionParams(param, this.#connectedNetworkId!)
)

sendMessage({ type: "ALPH_EXECUTE_TRANSACTION", data: transactionParamz })

Expand All @@ -259,7 +234,7 @@ export const alephiumWindowObject: AlephiumWindowObject =

sendMessage({ type: "ALPH_OPEN_UI" })

const result = await Promise.race([
const txMessage = await Promise.race([
waitForMessage(
"ALPH_TRANSACTION_SUBMITTED",
USER_ACTION_TIMEOUT_LONGER,
Expand All @@ -281,26 +256,11 @@ export const alephiumWindowObject: AlephiumWindowObject =
}),
])

if ("error" in result) {
throw Error(result.error)
if ("error" in txMessage) {
throw Error(txMessage.error)
}

const signedChainedTxResult = result.result.map(txResult => {
const txResultType = txResult.type
switch (txResultType) {
case 'TRANSFER':
return { type: 'Transfer', ...txResult.result } as SignTransferChainedTxResult;
case 'DEPLOY_CONTRACT':
return { type: 'DeployContract', ...txResult.result } as SignDeployContractChainedTxResult;
case 'EXECUTE_SCRIPT':
return { type: 'ExecuteScript', ...txResult.result } as SignExecuteScriptChainedTxResult;
default:
throw new Error(`Unsupported transaction type: ${txResultType}`);
}
}
)

return signedChainedTxResult;
return txMessage.result.map(res => transactionResultToSignUnsignedTxResult(res))
}

signUnsignedTx = async (
Expand Down
80 changes: 8 additions & 72 deletions packages/extension/src/shared/transactions/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { ALPH_TOKEN_ID, DEFAULT_GAS_PRICE, DUST_AMOUNT, ExplorerProvider, NodeProvider, ONE_ALPH, SignChainedTxParams, SignChainedTxResult, SignDeployContractChainedTxParams, SignExecuteScriptChainedTxParams, SignTransferChainedTxParams, TransactionBuilder } from "@alephium/web3"
import { ALPH_TOKEN_ID, DEFAULT_GAS_PRICE, DUST_AMOUNT, ExplorerProvider, MINIMAL_CONTRACT_DEPOSIT, NodeProvider, SignTransferChainedTxParams, TransactionBuilder } from "@alephium/web3"
import { lowerCase, upperFirst } from "lodash-es"
import { Call } from "starknet"
import { ReviewTransactionResult, TransactionParams } from "../actionQueue/types"
import { WalletAccount } from "../wallet.model"
import { AlephiumExplorerTransaction } from "../explorer/type"
import { mapAlephiumTransactionToTransaction } from "./transformers"
import { mapAlephiumTransactionToTransaction, signedChainedTxResultToReviewTransactionResult, transactionParamsToSignChainedTxParams } from "./transformers"
import { getNetwork } from "../network"
import { BaseTokenWithBalance } from "../token/type"
import { BigNumber } from "ethers"
Expand Down Expand Up @@ -134,73 +134,6 @@ function buildGetTransactionsFn(metadataTransactions: Transaction[]) {
}
}

export function transactionParamsToSignChainedTxParams(
transactionParams: TransactionParams
): SignChainedTxParams {
switch (transactionParams.type) {
case "TRANSFER":
return {
type: 'Transfer',
...transactionParams.params
} as SignTransferChainedTxParams
case "DEPLOY_CONTRACT":
return {
type: 'DeployContract',
...transactionParams.params
} as SignDeployContractChainedTxParams
case "EXECUTE_SCRIPT":
return {
type: 'ExecuteScript',
...transactionParams.params
} as SignExecuteScriptChainedTxParams
default:
throw new Error(`Unsupported transaction type: ${transactionParams.type}`);
}
}

export function signedChainedTxParamsToTransactionParams(
signedChainedTxParams: SignChainedTxParams,
networkId: string
): TransactionParams {
const paramsType = signedChainedTxParams.type
const salt = Date.now().toString()
switch (paramsType) {
case 'Transfer':
return {
type: 'TRANSFER',
params: { networkId, ...signedChainedTxParams },
salt
}
case 'DeployContract':
return {
type: 'DEPLOY_CONTRACT',
params: { networkId, ...signedChainedTxParams },
salt
}
case 'ExecuteScript':
return {
type: 'EXECUTE_SCRIPT',
params: { networkId, ...signedChainedTxParams },
salt
}
default:
throw new Error(`Unsupported transaction type: ${paramsType}`);
}
}

export function signedChainedTxResultToReviewTransactionResult(
signedChainedTxParams: SignChainedTxParams,
signedChainedTxResult: Omit<SignChainedTxResult, 'signature'>,
networkId: string
): ReviewTransactionResult {
const txParams = signedChainedTxParamsToTransactionParams(signedChainedTxParams, networkId)
return {
type: txParams.type,
params: txParams.params,
result: signedChainedTxResult
} as ReviewTransactionResult
}

export async function tryBuildChainedTransactions(
nodeUrl: string,
walletAccounts: WalletAccount[],
Expand Down Expand Up @@ -374,7 +307,7 @@ export async function checkBalances(
transactionParams: TransactionParams
): Promise<Map<string, BigNumber> | undefined> {
const expectedBalances: Map<string, BigNumber> = new Map()
const gasFee = BigInt(5000000) * DEFAULT_GAS_PRICE // Maximal gas fee per tx

switch (transactionParams.type) {
case 'TRANSFER':
transactionParams.params.destinations.forEach((destination) => {
Expand All @@ -388,7 +321,7 @@ export async function checkBalances(
addTokenToBalances(expectedBalances, ALPH_TOKEN_ID,
transactionParams.params.initialAttoAlphAmount !== undefined
? BigNumber.from(transactionParams.params.initialAttoAlphAmount)
: BigNumber.from(ONE_ALPH)
: BigNumber.from(MINIMAL_CONTRACT_DEPOSIT)
)
if (transactionParams.params.initialTokenAmounts !== undefined) {
transactionParams.params.initialTokenAmounts.forEach((token) => addTokenToBalances(expectedBalances, token.id, BigNumber.from(token.amount)))
Expand All @@ -401,10 +334,14 @@ export async function checkBalances(
if (transactionParams.params.tokens !== undefined) {
transactionParams.params.tokens.forEach((token) => addTokenToBalances(expectedBalances, token.id, BigNumber.from(token.amount)))
}

break
case 'UNSIGNED_TX':
return
}

const maxGasAmountPerTx = 5000000
const gasFee = BigInt(transactionParams.params.gasAmount ?? maxGasAmountPerTx) * BigInt(transactionParams.params.gasPrice ?? DEFAULT_GAS_PRICE)
addTokenToBalances(expectedBalances, ALPH_TOKEN_ID, BigNumber.from(gasFee))

const zero = BigNumber.from(0)
Expand All @@ -424,4 +361,3 @@ export async function checkBalances(
}
return undefined
}

87 changes: 85 additions & 2 deletions packages/extension/src/shared/transactions/transformers.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Transaction } from "../../shared/transactions"
import { WalletAccount } from "../../shared/wallet.model"
import { explorer } from '@alephium/web3'
import { ReviewTransactionResult } from "../../shared/actionQueue/types";
import { explorer, SignChainedTxParams, SignChainedTxResult, SignDeployContractChainedTxParams, SignDeployContractChainedTxResult, SignExecuteScriptChainedTxParams, SignExecuteScriptChainedTxResult, SignTransferChainedTxParams, SignTransferChainedTxResult, SignUnsignedTxResult } from '@alephium/web3'
import { ReviewTransactionResult, TransactionParams, TransactionResult } from "../../shared/actionQueue/types";

export const mapAlephiumTransactionToTransaction = (
transaction: explorer.Transaction,
Expand All @@ -17,3 +17,86 @@ export const mapAlephiumTransactionToTransaction = (
status: "ACCEPTED_ON_CHAIN",
timestamp: transaction.timestamp,
})

export function signedChainedTxParamsToTransactionParams(
signedChainedTxParams: SignChainedTxParams,
networkId: string
): TransactionParams {
const paramsType = signedChainedTxParams.type
const salt = Date.now().toString()
switch (paramsType) {
case 'Transfer':
return {
type: 'TRANSFER',
params: { networkId, ...signedChainedTxParams },
salt
}
case 'DeployContract':
return {
type: 'DEPLOY_CONTRACT',
params: { networkId, ...signedChainedTxParams },
salt
}
case 'ExecuteScript':
return {
type: 'EXECUTE_SCRIPT',
params: { networkId, ...signedChainedTxParams },
salt
}
default:
throw new Error(`Unsupported transaction type: ${paramsType}`);
}
}

export function transactionParamsToSignChainedTxParams(
transactionParams: TransactionParams
): SignChainedTxParams {
switch (transactionParams.type) {
case "TRANSFER":
return {
type: 'Transfer',
...transactionParams.params
} as SignTransferChainedTxParams
case "DEPLOY_CONTRACT":
return {
type: 'DeployContract',
...transactionParams.params
} as SignDeployContractChainedTxParams
case "EXECUTE_SCRIPT":
return {
type: 'ExecuteScript',
...transactionParams.params
} as SignExecuteScriptChainedTxParams
default:
throw new Error(`Unsupported transaction type: ${transactionParams.type}`);
}
}

export function signedChainedTxResultToReviewTransactionResult(
signedChainedTxParams: SignChainedTxParams,
signedChainedTxResult: Omit<SignChainedTxResult, 'signature'>,
networkId: string
): ReviewTransactionResult {
const txParams = signedChainedTxParamsToTransactionParams(signedChainedTxParams, networkId)
return {
type: txParams.type,
params: txParams.params,
result: signedChainedTxResult
} as ReviewTransactionResult
}

export function transactionResultToSignUnsignedTxResult(
txResult: TransactionResult
): SignChainedTxResult {
const txResultType = txResult.type
switch (txResultType) {
case 'TRANSFER':
return { type: 'Transfer', ...txResult.result } as SignTransferChainedTxResult;
case 'DEPLOY_CONTRACT':
return { type: 'DeployContract', ...txResult.result } as SignDeployContractChainedTxResult;
case 'EXECUTE_SCRIPT':
return { type: 'ExecuteScript', ...txResult.result } as SignExecuteScriptChainedTxResult;
default:
throw new Error(`Unsupported transaction type: ${txResultType}`);
}
}
Loading

0 comments on commit 1e34951

Please sign in to comment.