|
| 1 | +import { formatJsonRpcError, formatJsonRpcResult } from "@json-rpc-tools/utils"; |
| 2 | +import { type TezosToolkit } from "@taquito/taquito"; |
| 3 | +import { |
| 4 | + type Account, |
| 5 | + type ImplicitAccount, |
| 6 | + type SecretKeyAccount, |
| 7 | + estimate, |
| 8 | + executeOperations, |
| 9 | + toAccountOperations, |
| 10 | +} from "@umami/core"; |
| 11 | +import { |
| 12 | + TEZOS_SIGNING_METHODS, |
| 13 | +} from "@umami/state"; |
| 14 | +import { type Network } from "@umami/tezos"; |
| 15 | +import { type SignClientTypes } from "@walletconnect/types"; |
| 16 | +import { getSdkError } from "@walletconnect/utils"; |
| 17 | + |
| 18 | +export async function approveTezosRequest( |
| 19 | + requestEvent: SignClientTypes.EventArguments["session_request"], |
| 20 | + tezosToolkit: TezosToolkit, |
| 21 | + signer: Account, |
| 22 | + network: Network |
| 23 | +) { |
| 24 | + const { params, id } = requestEvent; |
| 25 | + const { request } = params; |
| 26 | + |
| 27 | + console.log("approveTezosRequest", request); |
| 28 | + |
| 29 | + switch (request.method) { |
| 30 | + case TEZOS_SIGNING_METHODS.TEZOS_GET_ACCOUNTS: { |
| 31 | + console.log("TEZOS_GET_ACCOUNTS"); |
| 32 | + return formatJsonRpcResult(id, [{ |
| 33 | + algo: (signer as SecretKeyAccount).curve, |
| 34 | + address: signer.address.pkh, |
| 35 | + pubkey: (signer as SecretKeyAccount).pk, |
| 36 | + }]); |
| 37 | + } |
| 38 | + |
| 39 | + case TEZOS_SIGNING_METHODS.TEZOS_SEND: { |
| 40 | + console.log("TEZOS_SEND"); |
| 41 | + try { |
| 42 | + const operation = toAccountOperations(request.params.operations, signer as ImplicitAccount); |
| 43 | + const estimatedOperations = await estimate(operation, network); |
| 44 | + console.log("TEZOS_SEND: executing operation", estimatedOperations); |
| 45 | + const { opHash } = await executeOperations(estimatedOperations, tezosToolkit); |
| 46 | + console.log("TEZOS_SEND: executed operation", request.params.method, operation, opHash); |
| 47 | + return formatJsonRpcResult(id, { hash: opHash }); |
| 48 | + } catch (error) { |
| 49 | + if (error instanceof Error) { |
| 50 | + console.error("Tezos_send operation failed with error: ", error.message); |
| 51 | + return formatJsonRpcError(id, error.message); |
| 52 | + } else { |
| 53 | + console.error("Tezos_send operation failed with unknown error: ", error); |
| 54 | + return formatJsonRpcError(id, "TEZOS_SEND failed with unknown error."); |
| 55 | + } |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + case TEZOS_SIGNING_METHODS.TEZOS_SIGN: { |
| 60 | + const result = await tezosToolkit.signer.sign(request.params.payload); |
| 61 | + console.log("TEZOS_SIGN", result.prefixSig); |
| 62 | + return formatJsonRpcResult(id, { signature: result.prefixSig }); |
| 63 | + } |
| 64 | + |
| 65 | + default: |
| 66 | + throw new Error(getSdkError("INVALID_METHOD").message); |
| 67 | + } |
| 68 | +} |
| 69 | + |
| 70 | +export function rejectTezosRequest(request: SignClientTypes.EventArguments["session_request"]) { |
| 71 | + const { id } = request; |
| 72 | + |
| 73 | + return formatJsonRpcError(id, getSdkError("USER_REJECTED_METHODS").message); |
| 74 | +} |
0 commit comments