near-safe 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
1
  import { MetaTransaction } from "../types";
2
2
  export declare const MULTI_SEND_ABI: string[];
3
3
  export declare function encodeMulti(transactions: readonly MetaTransaction[], multiSendContractAddress?: string): MetaTransaction;
4
+ export declare function isMultisendTx(args: readonly unknown[]): boolean;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MULTI_SEND_ABI = void 0;
4
4
  exports.encodeMulti = encodeMulti;
5
+ exports.isMultisendTx = isMultisendTx;
5
6
  const viem_1 = require("viem");
6
7
  const types_1 = require("../types");
7
8
  exports.MULTI_SEND_ABI = ["function multiSend(bytes memory transactions)"];
@@ -38,3 +39,8 @@ function encodeMulti(transactions, multiSendContractAddress = transactions.some(
38
39
  }),
39
40
  };
40
41
  }
42
+ function isMultisendTx(args) {
43
+ const to = args[0].toLowerCase();
44
+ return (to === MULTISEND_141.toLowerCase() ||
45
+ to === MULTISEND_CALLONLY_141.toLowerCase());
46
+ }
@@ -3,7 +3,7 @@ import { FinalExecutionOutcome } from "near-api-js/lib/providers";
3
3
  import { NearEthAdapter, SignRequestData } from "near-ca";
4
4
  import { Address, Hash, Hex } from "viem";
5
5
  import { SafeContractSuite } from "./lib/safe";
6
- import { EncodedTxData, MetaTransaction, UserOperation, UserOperationReceipt } from "./types";
6
+ import { EncodedTxData, EvmTransactionData, MetaTransaction, UserOperation, UserOperationReceipt } from "./types";
7
7
  export interface NearSafeConfig {
8
8
  accountId: string;
9
9
  mpcContractId: string;
@@ -41,6 +41,11 @@ export declare class NearSafe {
41
41
  sufficientlyFunded(chainId: number, transactions: MetaTransaction[], gasCost: bigint): Promise<boolean>;
42
42
  addOwnerTx(address: Address): MetaTransaction;
43
43
  private bundlerForChainId;
44
+ decodeTxData(data: EvmTransactionData): {
45
+ chainId: number;
46
+ costEstimate: string;
47
+ transactions: MetaTransaction[];
48
+ };
44
49
  /**
45
50
  * Handles routing of signature requests based on the provided method, chain ID, and parameters.
46
51
  *
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NearSafe = void 0;
4
+ const ethers_multisend_1 = require("ethers-multisend");
4
5
  const near_ca_1 = require("near-ca");
5
6
  const viem_1 = require("viem");
6
7
  const bundler_1 = require("./lib/bundler");
@@ -126,6 +127,33 @@ class NearSafe {
126
127
  bundlerForChainId(chainId) {
127
128
  return new bundler_1.Erc4337Bundler(this.safePack.entryPoint.address, this.pimlicoKey, chainId);
128
129
  }
130
+ decodeTxData(data) {
131
+ // TODO: data.data may not always parse to UserOperation. We will have to handle the other cases.
132
+ const userOp = JSON.parse(data.data);
133
+ const { callGasLimit, maxFeePerGas, maxPriorityFeePerGas } = userOp;
134
+ const maxGasPrice = BigInt(maxFeePerGas) + BigInt(maxPriorityFeePerGas);
135
+ const { args } = (0, viem_1.decodeFunctionData)({
136
+ abi: this.safePack.m4337.abi,
137
+ data: userOp.callData,
138
+ });
139
+ // Determine if sungular or double!
140
+ const transactions = (0, multisend_1.isMultisendTx)(args)
141
+ ? (0, ethers_multisend_1.decodeMulti)(args[2])
142
+ : [
143
+ {
144
+ to: args[0],
145
+ value: args[1],
146
+ data: args[2],
147
+ operation: args[3],
148
+ },
149
+ ];
150
+ return {
151
+ chainId: data.chainId,
152
+ // This is an upper bound on the gas fees (could be lower)
153
+ costEstimate: (0, viem_1.formatEther)(BigInt(callGasLimit) * maxGasPrice),
154
+ transactions,
155
+ };
156
+ }
129
157
  /**
130
158
  * Handles routing of signature requests based on the provided method, chain ID, and parameters.
131
159
  *
@@ -1,5 +1,5 @@
1
1
  import { FunctionCallTransaction, SignArgs } from "near-ca";
2
- import { Address, Hash, Hex, ParseAbi, TransactionSerializable } from "viem";
2
+ import { Address, Hex, ParseAbi } from "viem";
3
3
  export type SafeDeployments = {
4
4
  singleton: Deployment;
5
5
  proxyFactory: Deployment;
@@ -101,12 +101,13 @@ export interface MetaTransaction {
101
101
  readonly data: string;
102
102
  readonly operation?: OperationType;
103
103
  }
104
+ export interface EvmTransactionData {
105
+ chainId: number;
106
+ data: string;
107
+ hash: string;
108
+ }
104
109
  export interface EncodedTxData {
105
- evmData: {
106
- chainId: number;
107
- data: string | TransactionSerializable;
108
- hash: Hash;
109
- };
110
+ evmData: EvmTransactionData;
110
111
  nearPayload: FunctionCallTransaction<{
111
112
  request: SignArgs;
112
113
  }>;
@@ -1,3 +1,4 @@
1
1
  import { MetaTransaction } from "../types";
2
2
  export declare const MULTI_SEND_ABI: string[];
3
3
  export declare function encodeMulti(transactions: readonly MetaTransaction[], multiSendContractAddress?: string): MetaTransaction;
4
+ export declare function isMultisendTx(args: readonly unknown[]): boolean;
@@ -34,3 +34,8 @@ export function encodeMulti(transactions, multiSendContractAddress = transaction
34
34
  }),
35
35
  };
36
36
  }
37
+ export function isMultisendTx(args) {
38
+ const to = args[0].toLowerCase();
39
+ return (to === MULTISEND_141.toLowerCase() ||
40
+ to === MULTISEND_CALLONLY_141.toLowerCase());
41
+ }
@@ -3,7 +3,7 @@ import { FinalExecutionOutcome } from "near-api-js/lib/providers";
3
3
  import { NearEthAdapter, SignRequestData } from "near-ca";
4
4
  import { Address, Hash, Hex } from "viem";
5
5
  import { SafeContractSuite } from "./lib/safe";
6
- import { EncodedTxData, MetaTransaction, UserOperation, UserOperationReceipt } from "./types";
6
+ import { EncodedTxData, EvmTransactionData, MetaTransaction, UserOperation, UserOperationReceipt } from "./types";
7
7
  export interface NearSafeConfig {
8
8
  accountId: string;
9
9
  mpcContractId: string;
@@ -41,6 +41,11 @@ export declare class NearSafe {
41
41
  sufficientlyFunded(chainId: number, transactions: MetaTransaction[], gasCost: bigint): Promise<boolean>;
42
42
  addOwnerTx(address: Address): MetaTransaction;
43
43
  private bundlerForChainId;
44
+ decodeTxData(data: EvmTransactionData): {
45
+ chainId: number;
46
+ costEstimate: string;
47
+ transactions: MetaTransaction[];
48
+ };
44
49
  /**
45
50
  * Handles routing of signature requests based on the provided method, chain ID, and parameters.
46
51
  *
@@ -1,7 +1,8 @@
1
+ import { decodeMulti } from "ethers-multisend";
1
2
  import { setupAdapter, signatureFromOutcome, toPayload, } from "near-ca";
2
- import { serializeSignature } from "viem";
3
+ import { decodeFunctionData, formatEther, serializeSignature, } from "viem";
3
4
  import { Erc4337Bundler } from "./lib/bundler";
4
- import { encodeMulti } from "./lib/multisend";
5
+ import { encodeMulti, isMultisendTx } from "./lib/multisend";
5
6
  import { SafeContractSuite } from "./lib/safe";
6
7
  import { decodeSafeMessage } from "./lib/safe-message";
7
8
  import { getClient, isContract, metaTransactionsFromRequest, packSignature, } from "./util";
@@ -129,6 +130,33 @@ export class NearSafe {
129
130
  bundlerForChainId(chainId) {
130
131
  return new Erc4337Bundler(this.safePack.entryPoint.address, this.pimlicoKey, chainId);
131
132
  }
133
+ decodeTxData(data) {
134
+ // TODO: data.data may not always parse to UserOperation. We will have to handle the other cases.
135
+ const userOp = JSON.parse(data.data);
136
+ const { callGasLimit, maxFeePerGas, maxPriorityFeePerGas } = userOp;
137
+ const maxGasPrice = BigInt(maxFeePerGas) + BigInt(maxPriorityFeePerGas);
138
+ const { args } = decodeFunctionData({
139
+ abi: this.safePack.m4337.abi,
140
+ data: userOp.callData,
141
+ });
142
+ // Determine if sungular or double!
143
+ const transactions = isMultisendTx(args)
144
+ ? decodeMulti(args[2])
145
+ : [
146
+ {
147
+ to: args[0],
148
+ value: args[1],
149
+ data: args[2],
150
+ operation: args[3],
151
+ },
152
+ ];
153
+ return {
154
+ chainId: data.chainId,
155
+ // This is an upper bound on the gas fees (could be lower)
156
+ costEstimate: formatEther(BigInt(callGasLimit) * maxGasPrice),
157
+ transactions,
158
+ };
159
+ }
132
160
  /**
133
161
  * Handles routing of signature requests based on the provided method, chain ID, and parameters.
134
162
  *
@@ -1,5 +1,5 @@
1
1
  import { FunctionCallTransaction, SignArgs } from "near-ca";
2
- import { Address, Hash, Hex, ParseAbi, TransactionSerializable } from "viem";
2
+ import { Address, Hex, ParseAbi } from "viem";
3
3
  export type SafeDeployments = {
4
4
  singleton: Deployment;
5
5
  proxyFactory: Deployment;
@@ -101,12 +101,13 @@ export interface MetaTransaction {
101
101
  readonly data: string;
102
102
  readonly operation?: OperationType;
103
103
  }
104
+ export interface EvmTransactionData {
105
+ chainId: number;
106
+ data: string;
107
+ hash: string;
108
+ }
104
109
  export interface EncodedTxData {
105
- evmData: {
106
- chainId: number;
107
- data: string | TransactionSerializable;
108
- hash: Hash;
109
- };
110
+ evmData: EvmTransactionData;
110
111
  nearPayload: FunctionCallTransaction<{
111
112
  request: SignArgs;
112
113
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "near-safe",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "license": "MIT",
5
5
  "description": "An SDK for controlling Ethereum Smart Accounts via ERC4337 from a Near Account.",
6
6
  "author": "bh2smith",
@@ -42,6 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@safe-global/safe-gateway-typescript-sdk": "^3.22.2",
45
+ "ethers-multisend": "^3.1.0",
45
46
  "near-api-js": "^5.0.0",
46
47
  "near-ca": "^0.5.6",
47
48
  "semver": "^7.6.3",
@@ -68,7 +69,6 @@
68
69
  "yargs": "^17.7.2"
69
70
  },
70
71
  "resolutions": {
71
- "glob": "^9.0.0",
72
- "base-x": "^3.0.0"
72
+ "glob": "^11.0.0"
73
73
  }
74
74
  }