@arcsign/hardhat-plugin 1.0.0
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 +245 -0
- package/dist/ArcSignClient.d.ts +148 -0
- package/dist/ArcSignClient.d.ts.map +1 -0
- package/dist/ArcSignClient.js +220 -0
- package/dist/ArcSignClient.js.map +1 -0
- package/dist/ArcSignProvider.d.ts +82 -0
- package/dist/ArcSignProvider.d.ts.map +1 -0
- package/dist/ArcSignProvider.js +126 -0
- package/dist/ArcSignProvider.js.map +1 -0
- package/dist/ArcSignSigner.d.ts +56 -0
- package/dist/ArcSignSigner.d.ts.map +1 -0
- package/dist/ArcSignSigner.js +201 -0
- package/dist/ArcSignSigner.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +187 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +29 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +108 -0
- package/dist/utils.js.map +1 -0
- package/package.json +54 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @arcsign/hardhat-plugin
|
|
4
|
+
*
|
|
5
|
+
* Hardhat plugin for secure transaction signing with ArcSign wallet.
|
|
6
|
+
* Eliminates the need for private keys in .env files.
|
|
7
|
+
*
|
|
8
|
+
* Usage in hardhat.config.ts:
|
|
9
|
+
*
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import "@arcsign/hardhat-plugin";
|
|
12
|
+
*
|
|
13
|
+
* export default {
|
|
14
|
+
* networks: {
|
|
15
|
+
* mainnet: {
|
|
16
|
+
* url: process.env.RPC_URL,
|
|
17
|
+
* accounts: [], // Empty - ArcSign provides signers
|
|
18
|
+
* arcsign: true, // Enable ArcSign for this network
|
|
19
|
+
* },
|
|
20
|
+
* },
|
|
21
|
+
* };
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.getChainIdForNetwork = exports.isTestnet = exports.getExplorerForChainId = exports.ArcSignClient = exports.ArcSignSigner = exports.ArcSignProvider = void 0;
|
|
26
|
+
const config_1 = require("hardhat/config");
|
|
27
|
+
const ArcSignProvider_1 = require("./ArcSignProvider");
|
|
28
|
+
const ArcSignClient_1 = require("./ArcSignClient");
|
|
29
|
+
const utils_1 = require("./utils");
|
|
30
|
+
// Type guard to check if network uses ArcSign
|
|
31
|
+
function isArcSignEnabled(config) {
|
|
32
|
+
return typeof config === "object" && config !== null && config.arcsign === true;
|
|
33
|
+
}
|
|
34
|
+
// Default WebSocket configuration
|
|
35
|
+
const DEFAULT_WS_URL = "ws://127.0.0.1:9527";
|
|
36
|
+
// Extend config to handle arcsign networks
|
|
37
|
+
(0, config_1.extendConfig)((config, userConfig) => {
|
|
38
|
+
// Process each network config
|
|
39
|
+
for (const networkName of Object.keys(userConfig.networks || {})) {
|
|
40
|
+
const networkConfig = userConfig.networks?.[networkName];
|
|
41
|
+
if (isArcSignEnabled(networkConfig)) {
|
|
42
|
+
// Mark this network as using ArcSign
|
|
43
|
+
// The actual signer will be created at runtime
|
|
44
|
+
console.log(`[ArcSign] Network "${networkName}" will use ArcSign wallet for signing`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Extend the Hardhat Runtime Environment
|
|
49
|
+
(0, config_1.extendEnvironment)((hre) => {
|
|
50
|
+
// Create ArcSign provider and client
|
|
51
|
+
const arcsignProvider = new ArcSignProvider_1.ArcSignProvider(DEFAULT_WS_URL);
|
|
52
|
+
const arcsignClient = new ArcSignClient_1.ArcSignClient(DEFAULT_WS_URL);
|
|
53
|
+
// Add arcsign namespace to hre
|
|
54
|
+
hre.arcsign = {
|
|
55
|
+
provider: arcsignProvider,
|
|
56
|
+
client: arcsignClient,
|
|
57
|
+
isConnected: () => arcsignProvider.isConnected(),
|
|
58
|
+
getAccounts: () => arcsignProvider.getAccounts(),
|
|
59
|
+
getExplorerApiKey: async (explorer) => {
|
|
60
|
+
try {
|
|
61
|
+
if (!arcsignClient.isConnected()) {
|
|
62
|
+
await arcsignClient.connect();
|
|
63
|
+
}
|
|
64
|
+
return await arcsignClient.getExplorerApiKey(explorer);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`[ArcSign] Failed to get API key for ${explorer}:`, err);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
// Override getSigners for networks using ArcSign
|
|
73
|
+
// This requires @nomicfoundation/hardhat-ethers to be installed
|
|
74
|
+
const hreAny = hre;
|
|
75
|
+
if (hreAny.ethers && typeof hreAny.ethers.getSigners === "function") {
|
|
76
|
+
const originalGetSigners = hreAny.ethers.getSigners.bind(hreAny.ethers);
|
|
77
|
+
hreAny.ethers.getSigners = async () => {
|
|
78
|
+
const networkConfig = hre.network.config;
|
|
79
|
+
if (isArcSignEnabled(networkConfig)) {
|
|
80
|
+
// Connect to ArcSign if not already connected
|
|
81
|
+
if (!(await arcsignProvider.isConnected())) {
|
|
82
|
+
await arcsignProvider.connect();
|
|
83
|
+
}
|
|
84
|
+
// Get signers from ArcSign
|
|
85
|
+
const signers = await arcsignProvider.getSigners(hreAny.ethers.provider);
|
|
86
|
+
return signers;
|
|
87
|
+
}
|
|
88
|
+
// Fall back to default behavior
|
|
89
|
+
return originalGetSigners();
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Override the verify task to auto-inject API keys from ArcSign
|
|
94
|
+
(0, config_1.task)("verify", async (taskArgs, hre, runSuper) => {
|
|
95
|
+
// Get the current network's chain ID
|
|
96
|
+
const chainId = hre.network.config.chainId;
|
|
97
|
+
if (chainId) {
|
|
98
|
+
const explorer = (0, utils_1.getExplorerForChainId)(chainId);
|
|
99
|
+
if (explorer) {
|
|
100
|
+
console.log(`[ArcSign] Checking for ${explorer} API key...`);
|
|
101
|
+
try {
|
|
102
|
+
const apiKey = await hre.arcsign.getExplorerApiKey(explorer);
|
|
103
|
+
if (apiKey) {
|
|
104
|
+
console.log(`[ArcSign] Found ${explorer} API key, injecting into config...`);
|
|
105
|
+
// Inject the API key into the config
|
|
106
|
+
// This works with both @nomiclabs/hardhat-etherscan and @nomicfoundation/hardhat-verify
|
|
107
|
+
const config = hre.config;
|
|
108
|
+
if (!config.etherscan) {
|
|
109
|
+
config.etherscan = { apiKey: {} };
|
|
110
|
+
}
|
|
111
|
+
const etherscanConfig = config.etherscan;
|
|
112
|
+
// Handle both single string and object format for apiKey
|
|
113
|
+
if (typeof etherscanConfig.apiKey === "string" && etherscanConfig.apiKey.length > 0) {
|
|
114
|
+
// If it's already a non-empty string, keep it (user configured)
|
|
115
|
+
console.log(`[ArcSign] API key already configured, using existing...`);
|
|
116
|
+
}
|
|
117
|
+
else if (!etherscanConfig.apiKey || etherscanConfig.apiKey === "") {
|
|
118
|
+
// Set as single API key if none exists or is empty
|
|
119
|
+
etherscanConfig.apiKey = apiKey;
|
|
120
|
+
console.log(`[ArcSign] Injected API key successfully`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// It's an object, set for the specific network
|
|
124
|
+
const networkKey = getEtherscanNetworkKey(chainId);
|
|
125
|
+
if (networkKey) {
|
|
126
|
+
etherscanConfig.apiKey[networkKey] = apiKey;
|
|
127
|
+
console.log(`[ArcSign] Injected API key for ${networkKey}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log(`[ArcSign] No ${explorer} API key found in ArcSign settings`);
|
|
133
|
+
console.log(`[ArcSign] You can configure it in Developer Mode > Settings`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
// Not a critical error, continue with verification
|
|
138
|
+
console.log(`[ArcSign] Could not fetch API key (is Dashboard running?)`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Continue with the original verify task
|
|
143
|
+
return runSuper(taskArgs);
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Get the etherscan config network key for a chain ID
|
|
147
|
+
*/
|
|
148
|
+
function getEtherscanNetworkKey(chainId) {
|
|
149
|
+
const mapping = {
|
|
150
|
+
// Ethereum
|
|
151
|
+
1: "mainnet",
|
|
152
|
+
11155111: "sepolia",
|
|
153
|
+
5: "goerli",
|
|
154
|
+
// BSC
|
|
155
|
+
56: "bsc",
|
|
156
|
+
97: "bscTestnet",
|
|
157
|
+
// Polygon
|
|
158
|
+
137: "polygon",
|
|
159
|
+
80001: "polygonMumbai",
|
|
160
|
+
80002: "polygonAmoy",
|
|
161
|
+
// Arbitrum
|
|
162
|
+
42161: "arbitrumOne",
|
|
163
|
+
421614: "arbitrumSepolia",
|
|
164
|
+
// Optimism
|
|
165
|
+
10: "optimisticEthereum",
|
|
166
|
+
11155420: "optimisticSepolia",
|
|
167
|
+
// Base
|
|
168
|
+
8453: "base",
|
|
169
|
+
84532: "baseSepolia",
|
|
170
|
+
// Avalanche
|
|
171
|
+
43114: "avalanche",
|
|
172
|
+
43113: "avalancheFujiTestnet",
|
|
173
|
+
};
|
|
174
|
+
return mapping[chainId] || null;
|
|
175
|
+
}
|
|
176
|
+
// Export types and classes
|
|
177
|
+
var ArcSignProvider_2 = require("./ArcSignProvider");
|
|
178
|
+
Object.defineProperty(exports, "ArcSignProvider", { enumerable: true, get: function () { return ArcSignProvider_2.ArcSignProvider; } });
|
|
179
|
+
var ArcSignSigner_1 = require("./ArcSignSigner");
|
|
180
|
+
Object.defineProperty(exports, "ArcSignSigner", { enumerable: true, get: function () { return ArcSignSigner_1.ArcSignSigner; } });
|
|
181
|
+
var ArcSignClient_2 = require("./ArcSignClient");
|
|
182
|
+
Object.defineProperty(exports, "ArcSignClient", { enumerable: true, get: function () { return ArcSignClient_2.ArcSignClient; } });
|
|
183
|
+
var utils_2 = require("./utils");
|
|
184
|
+
Object.defineProperty(exports, "getExplorerForChainId", { enumerable: true, get: function () { return utils_2.getExplorerForChainId; } });
|
|
185
|
+
Object.defineProperty(exports, "isTestnet", { enumerable: true, get: function () { return utils_2.isTestnet; } });
|
|
186
|
+
Object.defineProperty(exports, "getChainIdForNetwork", { enumerable: true, get: function () { return utils_2.getChainIdForNetwork; } });
|
|
187
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for ArcSign Hardhat Plugin
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Explorer name type
|
|
6
|
+
*/
|
|
7
|
+
export type ExplorerName = "etherscan" | "bscscan" | "polygonscan" | "arbiscan" | "optimism" | "basescan" | "snowtrace";
|
|
8
|
+
/**
|
|
9
|
+
* Get explorer name for a given chain ID
|
|
10
|
+
*
|
|
11
|
+
* @param chainId - The blockchain chain ID
|
|
12
|
+
* @returns Explorer name or null if not supported
|
|
13
|
+
*/
|
|
14
|
+
export declare function getExplorerForChainId(chainId: number): ExplorerName | null;
|
|
15
|
+
/**
|
|
16
|
+
* Get chain ID for network name (common network names)
|
|
17
|
+
*
|
|
18
|
+
* @param networkName - Network name (e.g., "mainnet", "sepolia", "bscTestnet")
|
|
19
|
+
* @returns Chain ID or null if not recognized
|
|
20
|
+
*/
|
|
21
|
+
export declare function getChainIdForNetwork(networkName: string): number | null;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a chain ID is a testnet
|
|
24
|
+
*
|
|
25
|
+
* @param chainId - The blockchain chain ID
|
|
26
|
+
* @returns True if testnet, false otherwise
|
|
27
|
+
*/
|
|
28
|
+
export declare function isTestnet(chainId: number): boolean;
|
|
29
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,aAAa,GACb,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,CAAC;AAqChB;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0CvE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAclD"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for ArcSign Hardhat Plugin
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getExplorerForChainId = getExplorerForChainId;
|
|
7
|
+
exports.getChainIdForNetwork = getChainIdForNetwork;
|
|
8
|
+
exports.isTestnet = isTestnet;
|
|
9
|
+
/**
|
|
10
|
+
* Chain ID to explorer name mapping
|
|
11
|
+
*/
|
|
12
|
+
const CHAIN_ID_TO_EXPLORER = {
|
|
13
|
+
// Etherscan (Ethereum)
|
|
14
|
+
1: "etherscan", // Ethereum Mainnet
|
|
15
|
+
11155111: "etherscan", // Sepolia
|
|
16
|
+
5: "etherscan", // Goerli (deprecated)
|
|
17
|
+
// BSCScan
|
|
18
|
+
56: "bscscan", // BSC Mainnet
|
|
19
|
+
97: "bscscan", // BSC Testnet
|
|
20
|
+
// Polygonscan
|
|
21
|
+
137: "polygonscan", // Polygon Mainnet
|
|
22
|
+
80001: "polygonscan", // Mumbai (deprecated)
|
|
23
|
+
80002: "polygonscan", // Amoy
|
|
24
|
+
// Arbiscan
|
|
25
|
+
42161: "arbiscan", // Arbitrum One
|
|
26
|
+
421614: "arbiscan", // Arbitrum Sepolia
|
|
27
|
+
// Optimism Etherscan
|
|
28
|
+
10: "optimism", // Optimism Mainnet
|
|
29
|
+
11155420: "optimism", // Optimism Sepolia
|
|
30
|
+
// Basescan
|
|
31
|
+
8453: "basescan", // Base Mainnet
|
|
32
|
+
84532: "basescan", // Base Sepolia
|
|
33
|
+
// Snowtrace (Avalanche)
|
|
34
|
+
43114: "snowtrace", // Avalanche C-Chain
|
|
35
|
+
43113: "snowtrace", // Avalanche Fuji
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Get explorer name for a given chain ID
|
|
39
|
+
*
|
|
40
|
+
* @param chainId - The blockchain chain ID
|
|
41
|
+
* @returns Explorer name or null if not supported
|
|
42
|
+
*/
|
|
43
|
+
function getExplorerForChainId(chainId) {
|
|
44
|
+
return CHAIN_ID_TO_EXPLORER[chainId] || null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get chain ID for network name (common network names)
|
|
48
|
+
*
|
|
49
|
+
* @param networkName - Network name (e.g., "mainnet", "sepolia", "bscTestnet")
|
|
50
|
+
* @returns Chain ID or null if not recognized
|
|
51
|
+
*/
|
|
52
|
+
function getChainIdForNetwork(networkName) {
|
|
53
|
+
const NETWORK_TO_CHAIN_ID = {
|
|
54
|
+
// Ethereum
|
|
55
|
+
mainnet: 1,
|
|
56
|
+
ethereum: 1,
|
|
57
|
+
sepolia: 11155111,
|
|
58
|
+
goerli: 5,
|
|
59
|
+
// BSC
|
|
60
|
+
bsc: 56,
|
|
61
|
+
bscMainnet: 56,
|
|
62
|
+
bscTestnet: 97,
|
|
63
|
+
// Polygon
|
|
64
|
+
polygon: 137,
|
|
65
|
+
polygonMainnet: 137,
|
|
66
|
+
mumbai: 80001,
|
|
67
|
+
polygonAmoy: 80002,
|
|
68
|
+
// Arbitrum
|
|
69
|
+
arbitrum: 42161,
|
|
70
|
+
arbitrumOne: 42161,
|
|
71
|
+
arbitrumSepolia: 421614,
|
|
72
|
+
// Optimism
|
|
73
|
+
optimism: 10,
|
|
74
|
+
optimismMainnet: 10,
|
|
75
|
+
optimismSepolia: 11155420,
|
|
76
|
+
// Base
|
|
77
|
+
base: 8453,
|
|
78
|
+
baseMainnet: 8453,
|
|
79
|
+
baseSepolia: 84532,
|
|
80
|
+
// Avalanche
|
|
81
|
+
avalanche: 43114,
|
|
82
|
+
avalancheMainnet: 43114,
|
|
83
|
+
avalancheFuji: 43113,
|
|
84
|
+
fuji: 43113,
|
|
85
|
+
};
|
|
86
|
+
return NETWORK_TO_CHAIN_ID[networkName] || null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a chain ID is a testnet
|
|
90
|
+
*
|
|
91
|
+
* @param chainId - The blockchain chain ID
|
|
92
|
+
* @returns True if testnet, false otherwise
|
|
93
|
+
*/
|
|
94
|
+
function isTestnet(chainId) {
|
|
95
|
+
const TESTNET_CHAIN_IDS = [
|
|
96
|
+
5, // Goerli
|
|
97
|
+
11155111, // Sepolia
|
|
98
|
+
97, // BSC Testnet
|
|
99
|
+
80001, // Mumbai
|
|
100
|
+
80002, // Amoy
|
|
101
|
+
421614, // Arbitrum Sepolia
|
|
102
|
+
11155420, // Optimism Sepolia
|
|
103
|
+
84532, // Base Sepolia
|
|
104
|
+
43113, // Avalanche Fuji
|
|
105
|
+
];
|
|
106
|
+
return TESTNET_CHAIN_IDS.includes(chainId);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAuDH,sDAEC;AAQD,oDA0CC;AAQD,8BAcC;AAnHD;;GAEG;AACH,MAAM,oBAAoB,GAAiC;IACzD,uBAAuB;IACvB,CAAC,EAAE,WAAW,EAAE,mBAAmB;IACnC,QAAQ,EAAE,WAAW,EAAE,UAAU;IACjC,CAAC,EAAE,WAAW,EAAE,sBAAsB;IAEtC,UAAU;IACV,EAAE,EAAE,SAAS,EAAE,cAAc;IAC7B,EAAE,EAAE,SAAS,EAAE,cAAc;IAE7B,cAAc;IACd,GAAG,EAAE,aAAa,EAAE,kBAAkB;IACtC,KAAK,EAAE,aAAa,EAAE,sBAAsB;IAC5C,KAAK,EAAE,aAAa,EAAE,OAAO;IAE7B,WAAW;IACX,KAAK,EAAE,UAAU,EAAE,eAAe;IAClC,MAAM,EAAE,UAAU,EAAE,mBAAmB;IAEvC,qBAAqB;IACrB,EAAE,EAAE,UAAU,EAAE,mBAAmB;IACnC,QAAQ,EAAE,UAAU,EAAE,mBAAmB;IAEzC,WAAW;IACX,IAAI,EAAE,UAAU,EAAE,eAAe;IACjC,KAAK,EAAE,UAAU,EAAE,eAAe;IAElC,wBAAwB;IACxB,KAAK,EAAE,WAAW,EAAE,oBAAoB;IACxC,KAAK,EAAE,WAAW,EAAE,iBAAiB;CACtC,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,OAAO,oBAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,WAAmB;IACtD,MAAM,mBAAmB,GAA2B;QAClD,WAAW;QACX,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,CAAC;QAET,MAAM;QACN,GAAG,EAAE,EAAE;QACP,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QAEd,UAAU;QACV,OAAO,EAAE,GAAG;QACZ,cAAc,EAAE,GAAG;QACnB,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,KAAK;QAElB,WAAW;QACX,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,MAAM;QAEvB,WAAW;QACX,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,QAAQ;QAEzB,OAAO;QACP,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAElB,YAAY;QACZ,SAAS,EAAE,KAAK;QAChB,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,KAAK;QACpB,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,OAAO,mBAAmB,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,MAAM,iBAAiB,GAAG;QACxB,CAAC,EAAE,SAAS;QACZ,QAAQ,EAAE,UAAU;QACpB,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,mBAAmB;QAC3B,QAAQ,EAAE,mBAAmB;QAC7B,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,iBAAiB;KACzB,CAAC;IAEF,OAAO,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arcsign/hardhat-plugin",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Hardhat plugin for secure transaction signing with ArcSign wallet - No more private keys in .env files",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/**/*"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"clean": "rm -rf dist",
|
|
13
|
+
"prepare": "npm run build",
|
|
14
|
+
"test": "mocha --exit --recursive 'test/**/*.test.ts'",
|
|
15
|
+
"lint": "eslint 'src/**/*.ts'"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"hardhat",
|
|
19
|
+
"hardhat-plugin",
|
|
20
|
+
"ethereum",
|
|
21
|
+
"wallet",
|
|
22
|
+
"signer",
|
|
23
|
+
"arcsign",
|
|
24
|
+
"hardware-wallet",
|
|
25
|
+
"cold-wallet",
|
|
26
|
+
"smart-contracts",
|
|
27
|
+
"security"
|
|
28
|
+
],
|
|
29
|
+
"author": "ArcSign Team",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/ArcSign/arcsign.git",
|
|
34
|
+
"directory": "packages/hardhat-plugin"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"registry": "https://registry.npmjs.org/",
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"ethers": "^6.0.0",
|
|
42
|
+
"hardhat": "^2.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"ws": "^8.14.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^20.0.0",
|
|
49
|
+
"@types/ws": "^8.5.0",
|
|
50
|
+
"typescript": "^5.0.0",
|
|
51
|
+
"hardhat": "^2.19.0",
|
|
52
|
+
"ethers": "^6.9.0"
|
|
53
|
+
}
|
|
54
|
+
}
|