@safe-global/protocol-kit 0.1.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -16
- package/dist/src/Safe.d.ts +13 -52
- package/dist/src/Safe.js +180 -57
- package/dist/src/Safe.js.map +1 -1
- package/dist/src/adapters/ethers/EthersAdapter.d.ts +8 -8
- package/dist/src/adapters/ethers/EthersAdapter.js +23 -31
- package/dist/src/adapters/ethers/EthersAdapter.js.map +1 -1
- package/dist/src/adapters/ethers/contracts/CreateCall/CreateCallEthersContract.d.ts +1 -1
- package/dist/src/adapters/ethers/contracts/CreateCall/CreateCallEthersContract.js +1 -1
- package/dist/src/adapters/ethers/contracts/GnosisSafe/GnosisSafeContractEthers.d.ts +1 -1
- package/dist/src/adapters/ethers/contracts/GnosisSafe/GnosisSafeContractEthers.js +1 -1
- package/dist/src/adapters/ethers/contracts/GnosisSafeProxyFactory/GnosisSafeProxyFactoryEthersContract.d.ts +1 -1
- package/dist/src/adapters/ethers/contracts/GnosisSafeProxyFactory/GnosisSafeProxyFactoryEthersContract.js +1 -1
- package/dist/src/adapters/ethers/contracts/SignMessageLib/SignMessageLibEthersContract.d.ts +1 -1
- package/dist/src/adapters/ethers/contracts/SignMessageLib/SignMessageLibEthersContract.js +1 -1
- package/dist/src/adapters/ethers/utils/index.d.ts +8 -0
- package/dist/src/adapters/ethers/utils/index.js +15 -1
- package/dist/src/adapters/ethers/utils/index.js.map +1 -1
- package/dist/src/adapters/web3/Web3Adapter.d.ts +8 -8
- package/dist/src/adapters/web3/Web3Adapter.js +17 -9
- package/dist/src/adapters/web3/Web3Adapter.js.map +1 -1
- package/dist/src/adapters/web3/contracts/CreateCall/CreateCallWeb3Contract.d.ts +1 -1
- package/dist/src/adapters/web3/contracts/CreateCall/CreateCallWeb3Contract.js +1 -6
- package/dist/src/adapters/web3/contracts/CreateCall/CreateCallWeb3Contract.js.map +1 -1
- package/dist/src/adapters/web3/contracts/GnosisSafe/GnosisSafeContractWeb3.d.ts +1 -1
- package/dist/src/adapters/web3/contracts/GnosisSafe/GnosisSafeContractWeb3.js +1 -6
- package/dist/src/adapters/web3/contracts/GnosisSafe/GnosisSafeContractWeb3.js.map +1 -1
- package/dist/src/adapters/web3/contracts/GnosisSafeProxyFactory/GnosisSafeProxyFactoryWeb3Contract.d.ts +1 -1
- package/dist/src/adapters/web3/contracts/GnosisSafeProxyFactory/GnosisSafeProxyFactoryWeb3Contract.js +1 -6
- package/dist/src/adapters/web3/contracts/GnosisSafeProxyFactory/GnosisSafeProxyFactoryWeb3Contract.js.map +1 -1
- package/dist/src/adapters/web3/contracts/SignMessageLib/SignMessageLibWeb3Contract.d.ts +1 -1
- package/dist/src/adapters/web3/contracts/SignMessageLib/SignMessageLibWeb3Contract.js +1 -6
- package/dist/src/adapters/web3/contracts/SignMessageLib/SignMessageLibWeb3Contract.js.map +1 -1
- package/dist/src/contracts/safeDeploymentContracts.d.ts +8 -9
- package/dist/src/contracts/safeDeploymentContracts.js +15 -15
- package/dist/src/contracts/safeDeploymentContracts.js.map +1 -1
- package/dist/src/contracts/utils.d.ts +21 -0
- package/dist/src/contracts/utils.js +105 -0
- package/dist/src/contracts/utils.js.map +1 -0
- package/dist/src/index.d.ts +8 -6
- package/dist/src/index.js +27 -20
- package/dist/src/index.js.map +1 -1
- package/dist/src/managers/contractManager.d.ts +4 -5
- package/dist/src/managers/contractManager.js +27 -22
- package/dist/src/managers/contractManager.js.map +1 -1
- package/dist/src/managers/fallbackHandlerManager.d.ts +1 -1
- package/dist/src/managers/fallbackHandlerManager.js +9 -0
- package/dist/src/managers/fallbackHandlerManager.js.map +1 -1
- package/dist/src/managers/guardManager.d.ts +1 -1
- package/dist/src/managers/guardManager.js +9 -0
- package/dist/src/managers/guardManager.js.map +1 -1
- package/dist/src/managers/moduleManager.d.ts +1 -1
- package/dist/src/managers/moduleManager.js +12 -0
- package/dist/src/managers/moduleManager.js.map +1 -1
- package/dist/src/managers/ownerManager.d.ts +1 -1
- package/dist/src/managers/ownerManager.js +21 -0
- package/dist/src/managers/ownerManager.js.map +1 -1
- package/dist/src/safeFactory/index.d.ts +5 -23
- package/dist/src/safeFactory/index.js +23 -63
- package/dist/src/safeFactory/index.js.map +1 -1
- package/dist/src/types/index.d.ts +114 -0
- package/dist/src/utils/eip-3770/config.js +11 -0
- package/dist/src/utils/eip-3770/config.js.map +1 -1
- package/dist/src/utils/index.d.ts +2 -1
- package/dist/src/utils/index.js +2 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/safeVersions.d.ts +2 -1
- package/dist/src/utils/safeVersions.js +3 -1
- package/dist/src/utils/safeVersions.js.map +1 -1
- package/dist/src/utils/signatures/SafeSignature.d.ts +1 -2
- package/dist/src/utils/signatures/SafeSignature.js +3 -2
- package/dist/src/utils/signatures/SafeSignature.js.map +1 -1
- package/dist/src/utils/signatures/index.d.ts +2 -12
- package/dist/src/utils/signatures/index.js +15 -90
- package/dist/src/utils/signatures/index.js.map +1 -1
- package/dist/src/utils/signatures/utils.d.ts +11 -0
- package/dist/src/utils/signatures/utils.js +91 -0
- package/dist/src/utils/signatures/utils.js.map +1 -0
- package/dist/src/utils/transactions/gas.d.ts +1 -1
- package/dist/src/utils/transactions/gas.js +10 -10
- package/dist/src/utils/transactions/gas.js.map +1 -1
- package/dist/src/utils/transactions/utils.d.ts +3 -2
- package/dist/src/utils/transactions/utils.js +27 -14
- package/dist/src/utils/transactions/utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +2 -0
- package/dist/src/utils/types.js +8 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/dist/src/safeFactory/utils.d.ts +0 -3
- package/dist/src/safeFactory/utils.js +0 -19
- package/dist/src/safeFactory/utils.js.map +0 -1
package/dist/src/utils/index.js
CHANGED
|
@@ -14,9 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./address"), exports);
|
|
17
18
|
__exportStar(require("./eip-3770"), exports);
|
|
18
19
|
__exportStar(require("./eip-712"), exports);
|
|
19
20
|
__exportStar(require("./safeVersions"), exports);
|
|
20
|
-
__exportStar(require("./
|
|
21
|
+
__exportStar(require("./signatures"), exports);
|
|
21
22
|
__exportStar(require("./transactions"), exports);
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,4CAAyB;AACzB,iDAA8B;AAC9B
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,6CAA0B;AAC1B,4CAAyB;AACzB,iDAA8B;AAC9B,+CAA4B;AAC5B,iDAA8B"}
|
|
@@ -2,6 +2,7 @@ export declare enum SAFE_FEATURES {
|
|
|
2
2
|
SAFE_TX_GAS_OPTIONAL = "SAFE_TX_GAS_OPTIONAL",
|
|
3
3
|
SAFE_TX_GUARDS = "SAFE_TX_GUARDS",
|
|
4
4
|
SAFE_FALLBACK_HANDLER = "SAFE_FALLBACK_HANDLER",
|
|
5
|
-
ETH_SIGN = "ETH_SIGN"
|
|
5
|
+
ETH_SIGN = "ETH_SIGN",
|
|
6
|
+
ACCOUNT_ABSTRACTION = "ACCOUNT_ABSTRACTION"
|
|
6
7
|
}
|
|
7
8
|
export declare const hasSafeFeature: (feature: SAFE_FEATURES, version: string) => boolean;
|
|
@@ -11,12 +11,14 @@ var SAFE_FEATURES;
|
|
|
11
11
|
SAFE_FEATURES["SAFE_TX_GUARDS"] = "SAFE_TX_GUARDS";
|
|
12
12
|
SAFE_FEATURES["SAFE_FALLBACK_HANDLER"] = "SAFE_FALLBACK_HANDLER";
|
|
13
13
|
SAFE_FEATURES["ETH_SIGN"] = "ETH_SIGN";
|
|
14
|
+
SAFE_FEATURES["ACCOUNT_ABSTRACTION"] = "ACCOUNT_ABSTRACTION";
|
|
14
15
|
})(SAFE_FEATURES = exports.SAFE_FEATURES || (exports.SAFE_FEATURES = {}));
|
|
15
16
|
const SAFE_FEATURES_BY_VERSION = {
|
|
16
17
|
[SAFE_FEATURES.SAFE_TX_GAS_OPTIONAL]: '>=1.3.0',
|
|
17
18
|
[SAFE_FEATURES.SAFE_TX_GUARDS]: '>=1.3.0',
|
|
18
19
|
[SAFE_FEATURES.SAFE_FALLBACK_HANDLER]: '>=1.1.1',
|
|
19
|
-
[SAFE_FEATURES.ETH_SIGN]: '>=1.1.0'
|
|
20
|
+
[SAFE_FEATURES.ETH_SIGN]: '>=1.1.0',
|
|
21
|
+
[SAFE_FEATURES.ACCOUNT_ABSTRACTION]: '>=1.3.0'
|
|
20
22
|
};
|
|
21
23
|
const hasSafeFeature = (feature, version) => {
|
|
22
24
|
if (!(feature in SAFE_FEATURES_BY_VERSION)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safeVersions.js","sourceRoot":"","sources":["../../../src/utils/safeVersions.ts"],"names":[],"mappings":";;;;;;AAAA,2EAAwD;AAExD,IAAY,
|
|
1
|
+
{"version":3,"file":"safeVersions.js","sourceRoot":"","sources":["../../../src/utils/safeVersions.ts"],"names":[],"mappings":";;;;;;AAAA,2EAAwD;AAExD,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8DAA6C,CAAA;IAC7C,kDAAiC,CAAA;IACjC,gEAA+C,CAAA;IAC/C,sCAAqB,CAAA;IACrB,4DAA2C,CAAA;AAC7C,CAAC,EANW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAMxB;AAED,MAAM,wBAAwB,GAAkC;IAC9D,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE,SAAS;IAC/C,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,SAAS;IACzC,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,SAAS;IAChD,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,SAAS;IACnC,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,SAAS;CAC/C,CAAA;AAEM,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,OAAe,EAAW,EAAE;IACjF,IAAI,CAAC,CAAC,OAAO,IAAI,wBAAwB,CAAC,EAAE;QAC1C,OAAO,KAAK,CAAA;KACb;IAED,OAAO,IAAA,mBAAe,EAAC,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAA;AACpE,CAAC,CAAA;AANY,QAAA,cAAc,kBAM1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SafeSignature } from '@safe-global/safe-core-sdk-types';
|
|
2
|
-
declare class
|
|
2
|
+
export declare class EthSafeSignature implements SafeSignature {
|
|
3
3
|
signer: string;
|
|
4
4
|
data: string;
|
|
5
5
|
/**
|
|
@@ -23,4 +23,3 @@ declare class EthSignSignature implements SafeSignature {
|
|
|
23
23
|
*/
|
|
24
24
|
dynamicPart(): string;
|
|
25
25
|
}
|
|
26
|
-
export default EthSignSignature;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
exports.EthSafeSignature = void 0;
|
|
4
|
+
class EthSafeSignature {
|
|
4
5
|
/**
|
|
5
6
|
* Creates an instance of a Safe signature.
|
|
6
7
|
*
|
|
@@ -29,5 +30,5 @@ class EthSignSignature {
|
|
|
29
30
|
return '';
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
exports.
|
|
33
|
+
exports.EthSafeSignature = EthSafeSignature;
|
|
33
34
|
//# sourceMappingURL=SafeSignature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeSignature.js","sourceRoot":"","sources":["../../../../src/utils/signatures/SafeSignature.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SafeSignature.js","sourceRoot":"","sources":["../../../../src/utils/signatures/SafeSignature.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAI3B;;;;;;OAMG;IACH,YAAY,MAAc,EAAE,SAAiB;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,UAAU,EAAC,2BAA2B;QACpC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,OAAO,EAAE,CAAA;IACX,CAAC;CACF;AAjCD,4CAiCC"}
|
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export declare function generatePreValidatedSignature(ownerAddress: string): SafeSignature;
|
|
4
|
-
export declare function isTxHashSignedWithPrefix(txHash: string, signature: string, ownerAddress: string): boolean;
|
|
5
|
-
type AdjustVOverload = {
|
|
6
|
-
(signingMethod: 'eth_signTypedData', signature: string): string;
|
|
7
|
-
(signingMethod: 'eth_sign', signature: string, safeTxHash: string, sender: string): string;
|
|
8
|
-
};
|
|
9
|
-
export declare const adjustVInSignature: AdjustVOverload;
|
|
10
|
-
export declare function generateSignature(ethAdapter: EthAdapter, hash: string): Promise<EthSignSignature>;
|
|
11
|
-
export declare function generateEIP712Signature(ethAdapter: EthAdapter, safeTransactionEIP712Args: SafeTransactionEIP712Args, methodVersion?: 'v3' | 'v4'): Promise<EthSignSignature>;
|
|
12
|
-
export {};
|
|
1
|
+
export * from './SafeSignature';
|
|
2
|
+
export * from './utils';
|
|
@@ -1,94 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
8
|
-
const address_1 = require("../address");
|
|
9
|
-
const SafeSignature_1 = __importDefault(require("./SafeSignature"));
|
|
10
|
-
function generatePreValidatedSignature(ownerAddress) {
|
|
11
|
-
const signature = '0x000000000000000000000000' +
|
|
12
|
-
ownerAddress.slice(2) +
|
|
13
|
-
'0000000000000000000000000000000000000000000000000000000000000000' +
|
|
14
|
-
'01';
|
|
15
|
-
return new SafeSignature_1.default(ownerAddress, signature);
|
|
16
|
-
}
|
|
17
|
-
exports.generatePreValidatedSignature = generatePreValidatedSignature;
|
|
18
|
-
function isTxHashSignedWithPrefix(txHash, signature, ownerAddress) {
|
|
19
|
-
let hasPrefix;
|
|
20
|
-
try {
|
|
21
|
-
const rsvSig = {
|
|
22
|
-
r: Buffer.from(signature.slice(2, 66), 'hex'),
|
|
23
|
-
s: Buffer.from(signature.slice(66, 130), 'hex'),
|
|
24
|
-
v: parseInt(signature.slice(130, 132), 16)
|
|
25
|
-
};
|
|
26
|
-
const recoveredData = (0, ethereumjs_util_1.ecrecover)(Buffer.from(txHash.slice(2), 'hex'), rsvSig.v, rsvSig.r, rsvSig.s);
|
|
27
|
-
const recoveredAddress = (0, ethereumjs_util_1.bufferToHex)((0, ethereumjs_util_1.pubToAddress)(recoveredData));
|
|
28
|
-
hasPrefix = !(0, address_1.sameString)(recoveredAddress, ownerAddress);
|
|
29
|
-
}
|
|
30
|
-
catch (e) {
|
|
31
|
-
hasPrefix = true;
|
|
32
|
-
}
|
|
33
|
-
return hasPrefix;
|
|
34
|
-
}
|
|
35
|
-
exports.isTxHashSignedWithPrefix = isTxHashSignedWithPrefix;
|
|
36
|
-
const adjustVInSignature = (signingMethod, signature, safeTxHash, signerAddress) => {
|
|
37
|
-
const ETHEREUM_V_VALUES = [0, 1, 27, 28];
|
|
38
|
-
const MIN_VALID_V_VALUE_FOR_SAFE_ECDSA = 27;
|
|
39
|
-
let signatureV = parseInt(signature.slice(-2), 16);
|
|
40
|
-
if (!ETHEREUM_V_VALUES.includes(signatureV)) {
|
|
41
|
-
throw new Error('Invalid signature');
|
|
42
|
-
}
|
|
43
|
-
if (signingMethod === 'eth_sign') {
|
|
44
|
-
/*
|
|
45
|
-
The Safe's expected V value for ECDSA signature is:
|
|
46
|
-
- 27 or 28
|
|
47
|
-
- 31 or 32 if the message was signed with a EIP-191 prefix. Should be calculated as ECDSA V value + 4
|
|
48
|
-
Some wallets do that, some wallets don't, V > 30 is used by contracts to differentiate between
|
|
49
|
-
prefixed and non-prefixed messages. The only way to know if the message was signed with a
|
|
50
|
-
prefix is to check if the signer address is the same as the recovered address.
|
|
51
|
-
|
|
52
|
-
More info:
|
|
53
|
-
https://docs.safe.global/learn/signatures
|
|
54
|
-
*/
|
|
55
|
-
if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {
|
|
56
|
-
signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;
|
|
57
|
-
}
|
|
58
|
-
const adjustedSignature = signature.slice(0, -2) + signatureV.toString(16);
|
|
59
|
-
const signatureHasPrefix = isTxHashSignedWithPrefix(safeTxHash, adjustedSignature, signerAddress);
|
|
60
|
-
if (signatureHasPrefix) {
|
|
61
|
-
signatureV += 4;
|
|
62
|
-
}
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
63
7
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return signature;
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
72
15
|
};
|
|
73
|
-
exports
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!signerAddress) {
|
|
77
|
-
throw new Error('EthAdapter must be initialized with a signer to use this method');
|
|
78
|
-
}
|
|
79
|
-
let signature = await ethAdapter.signMessage(hash);
|
|
80
|
-
signature = (0, exports.adjustVInSignature)('eth_sign', signature, hash, signerAddress);
|
|
81
|
-
return new SafeSignature_1.default(signerAddress, signature);
|
|
82
|
-
}
|
|
83
|
-
exports.generateSignature = generateSignature;
|
|
84
|
-
async function generateEIP712Signature(ethAdapter, safeTransactionEIP712Args, methodVersion) {
|
|
85
|
-
const signerAddress = await ethAdapter.getSignerAddress();
|
|
86
|
-
if (!signerAddress) {
|
|
87
|
-
throw new Error('EthAdapter must be initialized with a signer to use this method');
|
|
88
|
-
}
|
|
89
|
-
let signature = await ethAdapter.signTypedData(safeTransactionEIP712Args, methodVersion);
|
|
90
|
-
signature = (0, exports.adjustVInSignature)('eth_signTypedData', signature);
|
|
91
|
-
return new SafeSignature_1.default(signerAddress, signature);
|
|
92
|
-
}
|
|
93
|
-
exports.generateEIP712Signature = generateEIP712Signature;
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./SafeSignature"), exports);
|
|
18
|
+
__exportStar(require("./utils"), exports);
|
|
94
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/signatures/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/signatures/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B;AAC/B,0CAAuB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EthAdapter, SafeSignature, SafeTransactionEIP712Args } from '@safe-global/safe-core-sdk-types';
|
|
2
|
+
export declare function generatePreValidatedSignature(ownerAddress: string): SafeSignature;
|
|
3
|
+
export declare function isTxHashSignedWithPrefix(txHash: string, signature: string, ownerAddress: string): boolean;
|
|
4
|
+
type AdjustVOverload = {
|
|
5
|
+
(signingMethod: 'eth_signTypedData', signature: string): string;
|
|
6
|
+
(signingMethod: 'eth_sign', signature: string, safeTxHash: string, sender: string): string;
|
|
7
|
+
};
|
|
8
|
+
export declare const adjustVInSignature: AdjustVOverload;
|
|
9
|
+
export declare function generateSignature(ethAdapter: EthAdapter, hash: string): Promise<SafeSignature>;
|
|
10
|
+
export declare function generateEIP712Signature(ethAdapter: EthAdapter, safeTransactionEIP712Args: SafeTransactionEIP712Args, methodVersion?: 'v3' | 'v4'): Promise<SafeSignature>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEIP712Signature = exports.generateSignature = exports.adjustVInSignature = exports.isTxHashSignedWithPrefix = exports.generatePreValidatedSignature = void 0;
|
|
4
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
5
|
+
const address_1 = require("../address");
|
|
6
|
+
const SafeSignature_1 = require("./SafeSignature");
|
|
7
|
+
function generatePreValidatedSignature(ownerAddress) {
|
|
8
|
+
const signature = '0x000000000000000000000000' +
|
|
9
|
+
ownerAddress.slice(2) +
|
|
10
|
+
'0000000000000000000000000000000000000000000000000000000000000000' +
|
|
11
|
+
'01';
|
|
12
|
+
return new SafeSignature_1.EthSafeSignature(ownerAddress, signature);
|
|
13
|
+
}
|
|
14
|
+
exports.generatePreValidatedSignature = generatePreValidatedSignature;
|
|
15
|
+
function isTxHashSignedWithPrefix(txHash, signature, ownerAddress) {
|
|
16
|
+
let hasPrefix;
|
|
17
|
+
try {
|
|
18
|
+
const rsvSig = {
|
|
19
|
+
r: Buffer.from(signature.slice(2, 66), 'hex'),
|
|
20
|
+
s: Buffer.from(signature.slice(66, 130), 'hex'),
|
|
21
|
+
v: parseInt(signature.slice(130, 132), 16)
|
|
22
|
+
};
|
|
23
|
+
const recoveredData = (0, ethereumjs_util_1.ecrecover)(Buffer.from(txHash.slice(2), 'hex'), rsvSig.v, rsvSig.r, rsvSig.s);
|
|
24
|
+
const recoveredAddress = (0, ethereumjs_util_1.bufferToHex)((0, ethereumjs_util_1.pubToAddress)(recoveredData));
|
|
25
|
+
hasPrefix = !(0, address_1.sameString)(recoveredAddress, ownerAddress);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
hasPrefix = true;
|
|
29
|
+
}
|
|
30
|
+
return hasPrefix;
|
|
31
|
+
}
|
|
32
|
+
exports.isTxHashSignedWithPrefix = isTxHashSignedWithPrefix;
|
|
33
|
+
const adjustVInSignature = (signingMethod, signature, safeTxHash, signerAddress) => {
|
|
34
|
+
const ETHEREUM_V_VALUES = [0, 1, 27, 28];
|
|
35
|
+
const MIN_VALID_V_VALUE_FOR_SAFE_ECDSA = 27;
|
|
36
|
+
let signatureV = parseInt(signature.slice(-2), 16);
|
|
37
|
+
if (!ETHEREUM_V_VALUES.includes(signatureV)) {
|
|
38
|
+
throw new Error('Invalid signature');
|
|
39
|
+
}
|
|
40
|
+
if (signingMethod === 'eth_sign') {
|
|
41
|
+
/*
|
|
42
|
+
The Safe's expected V value for ECDSA signature is:
|
|
43
|
+
- 27 or 28
|
|
44
|
+
- 31 or 32 if the message was signed with a EIP-191 prefix. Should be calculated as ECDSA V value + 4
|
|
45
|
+
Some wallets do that, some wallets don't, V > 30 is used by contracts to differentiate between
|
|
46
|
+
prefixed and non-prefixed messages. The only way to know if the message was signed with a
|
|
47
|
+
prefix is to check if the signer address is the same as the recovered address.
|
|
48
|
+
|
|
49
|
+
More info:
|
|
50
|
+
https://docs.safe.global/learn/signatures
|
|
51
|
+
*/
|
|
52
|
+
if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {
|
|
53
|
+
signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;
|
|
54
|
+
}
|
|
55
|
+
const adjustedSignature = signature.slice(0, -2) + signatureV.toString(16);
|
|
56
|
+
const signatureHasPrefix = isTxHashSignedWithPrefix(safeTxHash, adjustedSignature, signerAddress);
|
|
57
|
+
if (signatureHasPrefix) {
|
|
58
|
+
signatureV += 4;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (signingMethod === 'eth_signTypedData') {
|
|
62
|
+
// Metamask with ledger returns V=0/1 here too, we need to adjust it to be ethereum's valid value (27 or 28)
|
|
63
|
+
if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {
|
|
64
|
+
signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
signature = signature.slice(0, -2) + signatureV.toString(16);
|
|
68
|
+
return signature;
|
|
69
|
+
};
|
|
70
|
+
exports.adjustVInSignature = adjustVInSignature;
|
|
71
|
+
async function generateSignature(ethAdapter, hash) {
|
|
72
|
+
const signerAddress = await ethAdapter.getSignerAddress();
|
|
73
|
+
if (!signerAddress) {
|
|
74
|
+
throw new Error('EthAdapter must be initialized with a signer to use this method');
|
|
75
|
+
}
|
|
76
|
+
let signature = await ethAdapter.signMessage(hash);
|
|
77
|
+
signature = (0, exports.adjustVInSignature)('eth_sign', signature, hash, signerAddress);
|
|
78
|
+
return new SafeSignature_1.EthSafeSignature(signerAddress, signature);
|
|
79
|
+
}
|
|
80
|
+
exports.generateSignature = generateSignature;
|
|
81
|
+
async function generateEIP712Signature(ethAdapter, safeTransactionEIP712Args, methodVersion) {
|
|
82
|
+
const signerAddress = await ethAdapter.getSignerAddress();
|
|
83
|
+
if (!signerAddress) {
|
|
84
|
+
throw new Error('EthAdapter must be initialized with a signer to use this method');
|
|
85
|
+
}
|
|
86
|
+
let signature = await ethAdapter.signTypedData(safeTransactionEIP712Args, methodVersion);
|
|
87
|
+
signature = (0, exports.adjustVInSignature)('eth_signTypedData', signature);
|
|
88
|
+
return new SafeSignature_1.EthSafeSignature(signerAddress, signature);
|
|
89
|
+
}
|
|
90
|
+
exports.generateEIP712Signature = generateEIP712Signature;
|
|
91
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/signatures/utils.ts"],"names":[],"mappings":";;;AAKA,qDAAsE;AACtE,wCAAuC;AACvC,mDAAkD;AAElD,SAAgB,6BAA6B,CAAC,YAAoB;IAChE,MAAM,SAAS,GACb,4BAA4B;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACrB,kEAAkE;QAClE,IAAI,CAAA;IAEN,OAAO,IAAI,gCAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;AACtD,CAAC;AARD,sEAQC;AAED,SAAgB,wBAAwB,CACtC,MAAc,EACd,SAAiB,EACjB,YAAoB;IAEpB,IAAI,SAAS,CAAA;IACb,IAAI;QACF,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC;YAC7C,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;YAC/C,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SAC3C,CAAA;QACD,MAAM,aAAa,GAAG,IAAA,2BAAS,EAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EACnC,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,CACT,CAAA;QACD,MAAM,gBAAgB,GAAG,IAAA,6BAAW,EAAC,IAAA,8BAAY,EAAC,aAAa,CAAC,CAAC,CAAA;QACjE,SAAS,GAAG,CAAC,IAAA,oBAAU,EAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;KACxD;IAAC,OAAO,CAAC,EAAE;QACV,SAAS,GAAG,IAAI,CAAA;KACjB;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAxBD,4DAwBC;AAOM,MAAM,kBAAkB,GAAoB,CACjD,aAA+C,EAC/C,SAAiB,EACjB,UAAmB,EACnB,aAAsB,EACd,EAAE;IACV,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACxC,MAAM,gCAAgC,GAAG,EAAE,CAAA;IAC3C,IAAI,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAClD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;KACrC;IACD,IAAI,aAAa,KAAK,UAAU,EAAE;QAChC;;;;;;;;;;UAUE;QACF,IAAI,UAAU,GAAG,gCAAgC,EAAE;YACjD,UAAU,IAAI,gCAAgC,CAAA;SAC/C;QACD,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC1E,MAAM,kBAAkB,GAAG,wBAAwB,CACjD,UAAoB,EACpB,iBAAiB,EACjB,aAAuB,CACxB,CAAA;QACD,IAAI,kBAAkB,EAAE;YACtB,UAAU,IAAI,CAAC,CAAA;SAChB;KACF;IACD,IAAI,aAAa,KAAK,mBAAmB,EAAE;QACzC,4GAA4G;QAC5G,IAAI,UAAU,GAAG,gCAAgC,EAAE;YACjD,UAAU,IAAI,gCAAgC,CAAA;SAC/C;KACF;IACD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5D,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AA7CY,QAAA,kBAAkB,sBA6C9B;AAEM,KAAK,UAAU,iBAAiB,CACrC,UAAsB,EACtB,IAAY;IAEZ,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAA;IACzD,IAAI,CAAC,aAAa,EAAE;QAClB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;KACnF;IACD,IAAI,SAAS,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAClD,SAAS,GAAG,IAAA,0BAAkB,EAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAA;IAC1E,OAAO,IAAI,gCAAgB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;AACvD,CAAC;AAXD,8CAWC;AAEM,KAAK,UAAU,uBAAuB,CAC3C,UAAsB,EACtB,yBAAoD,EACpD,aAA2B;IAE3B,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAA;IACzD,IAAI,CAAC,aAAa,EAAE;QAClB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;KACnF;IACD,IAAI,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAA;IACxF,SAAS,GAAG,IAAA,0BAAkB,EAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;IAC9D,OAAO,IAAI,gCAAgB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;AACvD,CAAC;AAZD,0DAYC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { EthAdapter, GnosisSafeContract, OperationType } from '@safe-global/safe-core-sdk-types';
|
|
2
|
-
export declare function estimateTxGas(safeContract: GnosisSafeContract, ethAdapter: EthAdapter, to: string, valueInWei: string, data: string, operation: OperationType): Promise<
|
|
2
|
+
export declare function estimateTxGas(safeContract: GnosisSafeContract, ethAdapter: EthAdapter, to: string, valueInWei: string, data: string, operation: OperationType): Promise<string>;
|
|
@@ -16,7 +16,7 @@ function estimateDataGasCosts(data) {
|
|
|
16
16
|
return data.match(/.{2}/g).reduce(reducer, 0);
|
|
17
17
|
}
|
|
18
18
|
async function estimateTxGas(safeContract, ethAdapter, to, valueInWei, data, operation) {
|
|
19
|
-
let txGasEstimation = 0;
|
|
19
|
+
let txGasEstimation = bignumber_1.BigNumber.from(0);
|
|
20
20
|
const safeAddress = safeContract.getAddress();
|
|
21
21
|
const estimateData = safeContract.encode('requiredTxGas', [
|
|
22
22
|
to,
|
|
@@ -25,15 +25,15 @@ async function estimateTxGas(safeContract, ethAdapter, to, valueInWei, data, ope
|
|
|
25
25
|
operation
|
|
26
26
|
]);
|
|
27
27
|
try {
|
|
28
|
-
const estimateResponse =
|
|
28
|
+
const estimateResponse = await ethAdapter.estimateGas({
|
|
29
29
|
to: safeAddress,
|
|
30
30
|
from: safeAddress,
|
|
31
31
|
data: estimateData
|
|
32
|
-
})
|
|
33
|
-
txGasEstimation = bignumber_1.BigNumber.from('0x' + estimateResponse.substring(138)).
|
|
32
|
+
});
|
|
33
|
+
txGasEstimation = bignumber_1.BigNumber.from('0x' + estimateResponse.substring(138)).add(10000);
|
|
34
34
|
}
|
|
35
35
|
catch (error) { }
|
|
36
|
-
if (txGasEstimation
|
|
36
|
+
if (txGasEstimation.gt(0)) {
|
|
37
37
|
const dataGasEstimation = estimateDataGasCosts(estimateData);
|
|
38
38
|
let additionalGas = 10000;
|
|
39
39
|
for (let i = 0; i < 10; i++) {
|
|
@@ -42,18 +42,18 @@ async function estimateTxGas(safeContract, ethAdapter, to, valueInWei, data, ope
|
|
|
42
42
|
to: safeAddress,
|
|
43
43
|
from: safeAddress,
|
|
44
44
|
data: estimateData,
|
|
45
|
-
gasPrice: 0,
|
|
46
|
-
gasLimit: txGasEstimation
|
|
45
|
+
gasPrice: '0',
|
|
46
|
+
gasLimit: txGasEstimation.add(dataGasEstimation).add(additionalGas).toString()
|
|
47
47
|
});
|
|
48
48
|
if (estimateResponse !== '0x') {
|
|
49
49
|
break;
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
catch (error) { }
|
|
53
|
-
txGasEstimation
|
|
53
|
+
txGasEstimation = txGasEstimation.add(additionalGas);
|
|
54
54
|
additionalGas *= 2;
|
|
55
55
|
}
|
|
56
|
-
return txGasEstimation
|
|
56
|
+
return txGasEstimation.add(additionalGas).toString();
|
|
57
57
|
}
|
|
58
58
|
try {
|
|
59
59
|
const estimateGas = await ethAdapter.estimateGas({
|
|
@@ -66,7 +66,7 @@ async function estimateTxGas(safeContract, ethAdapter, to, valueInWei, data, ope
|
|
|
66
66
|
}
|
|
67
67
|
catch (error) {
|
|
68
68
|
if (operation === safe_core_sdk_types_1.OperationType.DelegateCall) {
|
|
69
|
-
return 0;
|
|
69
|
+
return '0';
|
|
70
70
|
}
|
|
71
71
|
return Promise.reject(error);
|
|
72
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../src/utils/transactions/gas.ts"],"names":[],"mappings":";;;AAAA,wDAAoD;AACpD,0EAAgG;AAEhG,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,CAAC,WAAmB,EAAE,YAAoB,EAAE,EAAE;QAC5D,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,OAAO,WAAW,GAAG,CAAC,CAAA;SACvB;QACD,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,OAAO,WAAW,GAAG,CAAC,CAAA;SACvB;QACD,OAAO,WAAW,GAAG,EAAE,CAAA;IACzB,CAAC,CAAA;IACD,OAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,YAAgC,EAChC,UAAsB,EACtB,EAAU,EACV,UAAkB,EAClB,IAAY,EACZ,SAAwB;IAExB,IAAI,eAAe,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../../src/utils/transactions/gas.ts"],"names":[],"mappings":";;;AAAA,wDAAoD;AACpD,0EAAgG;AAEhG,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,CAAC,WAAmB,EAAE,YAAoB,EAAE,EAAE;QAC5D,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,OAAO,WAAW,GAAG,CAAC,CAAA;SACvB;QACD,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,OAAO,WAAW,GAAG,CAAC,CAAA;SACvB;QACD,OAAO,WAAW,GAAG,EAAE,CAAA;IACzB,CAAC,CAAA;IACD,OAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,YAAgC,EAChC,UAAsB,EACtB,EAAU,EACV,UAAkB,EAClB,IAAY,EACZ,SAAwB;IAExB,IAAI,eAAe,GAAG,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,CAAA;IAE7C,MAAM,YAAY,GAAW,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE;QAChE,EAAE;QACF,UAAU;QACV,IAAI;QACJ,SAAS;KACV,CAAC,CAAA;IACF,IAAI;QACF,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC;YACpD,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,YAAY;SACnB,CAAC,CAAA;QACF,eAAe,GAAG,qBAAS,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;KACpF;IAAC,OAAO,KAAK,EAAE,GAAE;IAElB,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACzB,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;oBAC7C,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,GAAG;oBACb,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;iBAC/E,CAAC,CAAA;gBACF,IAAI,gBAAgB,KAAK,IAAI,EAAE;oBAC7B,MAAK;iBACN;aACF;YAAC,OAAO,KAAK,EAAE,GAAE;YAClB,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YACpD,aAAa,IAAI,CAAC,CAAA;SACnB;QACD,OAAO,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAA;KACrD;IAED,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC;YAC/C,EAAE;YACF,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,UAAU;YACjB,IAAI;SACL,CAAC,CAAA;QACF,OAAO,WAAW,CAAA;KACnB;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,SAAS,KAAK,mCAAa,CAAC,YAAY,EAAE;YAC5C,OAAO,GAAG,CAAA;SACX;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;KAC7B;AACH,CAAC;AA9DD,sCA8DC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StandardizeSafeTransactionDataProps } from '../../types';
|
|
2
|
+
import { MetaTransactionData, SafeMultisigTransactionResponse, SafeTransaction, SafeTransactionData, SafeTransactionDataPartial } from '@safe-global/safe-core-sdk-types';
|
|
2
3
|
export declare function standardizeMetaTransactionData(tx: SafeTransactionDataPartial): MetaTransactionData;
|
|
3
|
-
export declare function standardizeSafeTransactionData(safeContract
|
|
4
|
+
export declare function standardizeSafeTransactionData({ safeContract, predictedSafe, ethAdapter, tx }: StandardizeSafeTransactionDataProps): Promise<SafeTransactionData>;
|
|
4
5
|
export declare function encodeMultiSendData(txs: MetaTransactionData[]): string;
|
|
5
6
|
export declare function decodeMultiSendData(encodedData: string): MetaTransactionData[];
|
|
6
7
|
export declare function isMetaTransactionArray(safeTransactions: SafeTransactionDataPartial | MetaTransactionData[]): safeTransactions is MetaTransactionData[];
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSafeMultisigTransactionResponse = exports.isMetaTransactionArray = exports.decodeMultiSendData = exports.encodeMultiSendData = exports.standardizeSafeTransactionData = exports.standardizeMetaTransactionData = void 0;
|
|
4
|
+
const abi_1 = require("@ethersproject/abi");
|
|
4
5
|
const bytes_1 = require("@ethersproject/bytes");
|
|
5
6
|
const solidity_1 = require("@ethersproject/solidity");
|
|
6
|
-
const abi_1 = require("@ethersproject/abi");
|
|
7
|
-
const web3_utils_1 = require("web3-utils");
|
|
8
|
-
const safe_core_sdk_types_1 = require("@safe-global/safe-core-sdk-types");
|
|
9
7
|
const utils_1 = require("../../utils");
|
|
10
8
|
const constants_1 = require("../../utils/constants");
|
|
9
|
+
const safe_core_sdk_types_1 = require("@safe-global/safe-core-sdk-types");
|
|
10
|
+
const web3_utils_1 = require("web3-utils");
|
|
11
11
|
const gas_1 = require("./gas");
|
|
12
12
|
function standardizeMetaTransactionData(tx) {
|
|
13
13
|
var _a;
|
|
@@ -18,34 +18,47 @@ function standardizeMetaTransactionData(tx) {
|
|
|
18
18
|
return standardizedTxs;
|
|
19
19
|
}
|
|
20
20
|
exports.standardizeMetaTransactionData = standardizeMetaTransactionData;
|
|
21
|
-
async function standardizeSafeTransactionData(safeContract, ethAdapter, tx) {
|
|
22
|
-
var _a, _b, _c, _d;
|
|
21
|
+
async function standardizeSafeTransactionData({ safeContract, predictedSafe, ethAdapter, tx }) {
|
|
22
|
+
var _a, _b, _c, _d, _e;
|
|
23
23
|
const standardizedTxs = {
|
|
24
24
|
to: tx.to,
|
|
25
25
|
value: tx.value,
|
|
26
26
|
data: tx.data,
|
|
27
27
|
operation: (_a = tx.operation) !== null && _a !== void 0 ? _a : safe_core_sdk_types_1.OperationType.Call,
|
|
28
|
-
baseGas: (_b = tx.baseGas) !== null && _b !== void 0 ? _b : 0,
|
|
29
|
-
gasPrice: (_c = tx.gasPrice) !== null && _c !== void 0 ? _c : 0,
|
|
28
|
+
baseGas: (_b = tx.baseGas) !== null && _b !== void 0 ? _b : '0',
|
|
29
|
+
gasPrice: (_c = tx.gasPrice) !== null && _c !== void 0 ? _c : '0',
|
|
30
30
|
gasToken: tx.gasToken || constants_1.ZERO_ADDRESS,
|
|
31
31
|
refundReceiver: tx.refundReceiver || constants_1.ZERO_ADDRESS,
|
|
32
|
-
nonce: (_d = tx.nonce) !== null && _d !== void 0 ? _d : (await safeContract.getNonce())
|
|
32
|
+
nonce: (_d = tx.nonce) !== null && _d !== void 0 ? _d : (safeContract ? await safeContract.getNonce() : 0)
|
|
33
33
|
};
|
|
34
|
-
let safeTxGas;
|
|
35
34
|
if (typeof tx.safeTxGas !== 'undefined') {
|
|
36
35
|
return {
|
|
37
36
|
...standardizedTxs,
|
|
38
37
|
safeTxGas: tx.safeTxGas
|
|
39
38
|
};
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
if ((0
|
|
43
|
-
|
|
44
|
-
safeTxGas = 0;
|
|
40
|
+
let safeVersion;
|
|
41
|
+
if ((_e = predictedSafe === null || predictedSafe === void 0 ? void 0 : predictedSafe.safeDeploymentConfig) === null || _e === void 0 ? void 0 : _e.safeVersion) {
|
|
42
|
+
safeVersion = predictedSafe === null || predictedSafe === void 0 ? void 0 : predictedSafe.safeDeploymentConfig.safeVersion;
|
|
45
43
|
}
|
|
46
44
|
else {
|
|
47
|
-
|
|
45
|
+
if (!safeContract) {
|
|
46
|
+
throw new Error('Safe is not deployed');
|
|
47
|
+
}
|
|
48
|
+
safeVersion = await safeContract.getVersion();
|
|
49
|
+
}
|
|
50
|
+
const hasSafeTxGasOptional = (0, utils_1.hasSafeFeature)(utils_1.SAFE_FEATURES.SAFE_TX_GAS_OPTIONAL, safeVersion);
|
|
51
|
+
if ((hasSafeTxGasOptional && standardizedTxs.gasPrice === '0') ||
|
|
52
|
+
(hasSafeTxGasOptional && predictedSafe)) {
|
|
53
|
+
return {
|
|
54
|
+
...standardizedTxs,
|
|
55
|
+
safeTxGas: '0'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (!safeContract) {
|
|
59
|
+
throw new Error('Safe is not deployed');
|
|
48
60
|
}
|
|
61
|
+
const safeTxGas = await (0, gas_1.estimateTxGas)(safeContract, ethAdapter, standardizedTxs.to, standardizedTxs.value, standardizedTxs.data, standardizedTxs.operation);
|
|
49
62
|
return {
|
|
50
63
|
...standardizedTxs,
|
|
51
64
|
safeTxGas
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/transactions/utils.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,sDAA8D;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/transactions/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSafeConfigWithPredictedSafe = void 0;
|
|
4
|
+
function isSafeConfigWithPredictedSafe(config) {
|
|
5
|
+
return config.predictedSafe !== undefined;
|
|
6
|
+
}
|
|
7
|
+
exports.isSafeConfigWithPredictedSafe = isSafeConfigWithPredictedSafe;
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":";;;AAEA,SAAgB,6BAA6B,CAC3C,MAAkB;IAElB,OAAQ,MAAiD,CAAC,aAAa,KAAK,SAAS,CAAA;AACvF,CAAC;AAJD,sEAIC"}
|