Skip to content

Commit e5283f7

Browse files
authored
Merge pull request #70 from PracticalParticle/work
Work
2 parents 66ac195 + 79011f2 commit e5283f7

12 files changed

Lines changed: 166 additions & 36 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ reports/
1919

2020
### Environment Variables ###
2121
*.env
22+
*.env.deployment
2223

2324
### Test Reports ###
2425
scripts/sanity/reports/
@@ -58,6 +59,8 @@ deployed-addresses.json
5859
# Copied by package/scripts/prepublish-contracts.cjs for @bloxchain/contracts
5960
package/abi/
6061
package/core/
62+
package/standards/
63+
package/components/
6164

6265
# Build output for @bloxchain/sdk
6366
sdk/typescript/dist/

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ Deployed addresses are written to **`deployed-addresses.json`** under the networ
215215

216216
| Contract | Address |
217217
|----------|---------|
218-
| EngineBlox | [`0x5f91de8521fd0f5ca8b709e7f04d5c57dbcba4e1`](https://sepolia.etherscan.io/address/0x5f91de8521fd0f5ca8b709e7f04d5c57dbcba4e1) |
219-
| SecureOwnableDefinitions | [`0xdca4830d74b66093e29bb080d92f837b944b4001`](https://sepolia.etherscan.io/address/0xdca4830d74b66093e29bb080d92f837b944b4001) |
220-
| RuntimeRBACDefinitions | [`0x7b964d1878664a61ed9eec90b8354f7df307ff21`](https://sepolia.etherscan.io/address/0x7b964d1878664a61ed9eec90b8354f7df307ff21) |
221-
| GuardControllerDefinitions | [`0x7a5361a3b2ace07982813f0bfc3a0a684d4ea0fe`](https://sepolia.etherscan.io/address/0x7a5361a3b2ace07982813f0bfc3a0a684d4ea0fe) |
218+
| EngineBlox | [`0x524632c2a77b27a11f536f4e568570dc2aaafe99`](https://sepolia.etherscan.io/address/0x524632c2a77b27a11f536f4e568570dc2aaafe99) |
219+
| SecureOwnableDefinitions | [`0x0b722d1bad16e449482d69a13c42373a9d8ce2cf`](https://sepolia.etherscan.io/address/0x0b722d1bad16e449482d69a13c42373a9d8ce2cf) |
220+
| RuntimeRBACDefinitions | [`0x5c64e07d6193475b7869b33cef00fbae1ec27938`](https://sepolia.etherscan.io/address/0x5c64e07d6193475b7869b33cef00fbae1ec27938) |
221+
| GuardControllerDefinitions | [`0xcd56a07a1285c5a6cc070d17a63b5a31e151de0e`](https://sepolia.etherscan.io/address/0xcd56a07a1285c5a6cc070d17a63b5a31e151de0e) |
222222

223223

224224
## 📖 Usage Examples

contracts/standards/behavior/ICopyable.sol

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,4 @@ interface ICopyable {
3333
address eventForwarder,
3434
bytes calldata initData
3535
) external;
36-
37-
/**
38-
* @dev Initialize or set clone-specific data (e.g. after a minimal proxy is deployed).
39-
* @param initData Custom data for this clone; semantics are defined by the implementer
40-
*/
41-
function setCloneData(bytes calldata initData) external;
4236
}

env.example

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ DEPLOY_ACCOUNTBLOX=false
6666
DEPLOY_SIMPLE_VAULT=false
6767
DEPLOY_SIMPLE_RWA20=false
6868
DEPLOY_ERC20_BLOX=false
69+
DEPLOY_FACTORY_BLOX=false
70+
DEPLOY_WALLET_BLOX=false
6971

7072
# Definition Library Addresses (per network)
7173
# These are the addresses of the deployed definition libraries
@@ -84,6 +86,8 @@ RUNTIME_RBAC_DEFINITIONS_ADDRESS=
8486
# DEPLOY_SIMPLE_VAULT=true/false - Deploy SimpleVault example contract
8587
# DEPLOY_SIMPLE_RWA20=true/false - Deploy SimpleRWA20 example contract
8688
# DEPLOY_ERC20_BLOX=true/false - Deploy ERC20Blox example contract
89+
# DEPLOY_FACTORY_BLOX=true/false - Deploy FactoryBlox (clone factory) example contract
90+
# DEPLOY_WALLET_BLOX=true/false - Deploy BloxchainWallet (Account + ICopyable) example contract
8791
#
8892
# DEPLOYMENT SCENARIOS:
8993
# 🏗️ Full Development: All core flags=true, Example flags=false
@@ -96,6 +100,8 @@ RUNTIME_RBAC_DEFINITIONS_ADDRESS=
96100
# 🏦 SimpleVault: Example vault contract with Bloxchain integration
97101
# 🏦 SimpleRWA20: Example RWA token contract with Bloxchain integration
98102
# 🏦 ERC20Blox: Example ERC20 token with SecureOwnable, RuntimeRBAC, GuardController
103+
# 🏭 FactoryBlox: Clone factory with RBAC and GuardController (cloneBlox, whitelist)
104+
# 👛 BloxchainWallet: Official wallet controller (Account, ICopyable, 1–90 day timelock)
99105
#
100106
# =============================================================================
101107
# TEST MODE USAGE GUIDE
@@ -123,7 +129,7 @@ RUNTIME_RBAC_DEFINITIONS_ADDRESS=
123129
#
124130
# DEPLOYMENT EXAMPLES:
125131
# Deploy only examples:
126-
# DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=true truffle migrate
132+
# DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=true DEPLOY_FACTORY_BLOX=true DEPLOY_WALLET_BLOX=true truffle migrate
127133
#
128134
# Deploy everything (full development):
129135
# All flags=true truffle migrate

foundry.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ libs = ["node_modules", "lib"]
55
test = "test/foundry"
66
cache_path = "cache_forge"
77

8-
# Solidity compiler settings - matching Truffle config for consistency
8+
# Solidity compiler settings
99
solc = "0.8.33"
1010
optimizer = true
11-
optimizer_runs = 200 # Changed from 200 to match Truffle (faster compilation)
11+
optimizer_runs = 200
1212
via_ir = true
1313
evm_version = "osaka"
1414

migrations/3_deploy_example_contracts.cjs

Lines changed: 120 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
// Migration 3: Deploy Example Contracts (SimpleVault, SimpleRWA20, ERC20Blox)
2+
// Migration 3: Deploy Example Contracts (SimpleVault, SimpleRWA20, ERC20Blox, FactoryBlox, BloxchainWallet)
33

44
const SimpleVault = artifacts.require("SimpleVault");
55
const SimpleRWA20 = artifacts.require("SimpleRWA20");
66
const ERC20Blox = artifacts.require("ERC20Blox");
7+
const FactoryBlox = artifacts.require("FactoryBlox");
8+
const BloxchainWallet = artifacts.require("BloxchainWallet");
79

810
// Import the deployed library artifacts to get their addresses
911
const EngineBlox = artifacts.require("EngineBlox");
@@ -15,6 +17,7 @@ const GuardControllerDefinitions = artifacts.require("GuardControllerDefinitions
1517
const SimpleVaultDefinitions = artifacts.require("SimpleVaultDefinitions");
1618
const SimpleRWA20Definitions = artifacts.require("SimpleRWA20Definitions");
1719
const ERC20BloxDefinitions = artifacts.require("ERC20BloxDefinitions");
20+
const FactoryBloxDefinitions = artifacts.require("FactoryBloxDefinitions");
1821
const { saveArtifactNetwork } = require('./helpers/save-artifact-network.cjs');
1922

2023
module.exports = async function(deployer, network, accounts) {
@@ -28,41 +31,53 @@ module.exports = async function(deployer, network, accounts) {
2831
const deploySimpleVault = process.env.DEPLOY_SIMPLE_VAULT === 'true'; // Default: false
2932
const deploySimpleRWA20 = process.env.DEPLOY_SIMPLE_RWA20 === 'true'; // Default: false
3033
const deployERC20Blox = process.env.DEPLOY_ERC20_BLOX === 'true'; // Default: false
31-
34+
const deployFactoryBlox = process.env.DEPLOY_FACTORY_BLOX === 'true'; // Default: false
35+
const deployWalletBlox = process.env.DEPLOY_WALLET_BLOX === 'true'; // Default: false
36+
3237
console.log("\n🎯 Deployment Configuration:");
3338
console.log(` SimpleVault: ${deploySimpleVault ? '✅ YES' : '❌ NO'}`);
3439
console.log(` SimpleRWA20: ${deploySimpleRWA20 ? '✅ YES' : '❌ NO'}`);
3540
console.log(` ERC20Blox: ${deployERC20Blox ? '✅ YES' : '❌ NO'}`);
41+
console.log(` FactoryBlox: ${deployFactoryBlox ? '✅ YES' : '❌ NO'}`);
42+
console.log(` BloxchainWallet: ${deployWalletBlox ? '✅ YES' : '❌ NO'}`);
3643

3744
try {
3845
// Step 1: Deploy Example-Specific Definitions Libraries (only if needed)
3946
let simpleVaultDefinitions = null;
4047
let simpleRWA20Definitions = null;
4148
let erc20BloxDefinitions = null;
42-
43-
if (deploySimpleVault || deploySimpleRWA20 || deployERC20Blox) {
49+
let factoryBloxDefinitions = null;
50+
51+
if (deploySimpleVault || deploySimpleRWA20 || deployERC20Blox || deployFactoryBlox || deployWalletBlox) {
4452
console.log("\n📦 Step 1: Deploying Example-Specific Definitions Libraries...");
45-
53+
4654
if (deploySimpleVault) {
4755
// Deploy SimpleVaultDefinitions
4856
await deployer.deploy(SimpleVaultDefinitions);
4957
simpleVaultDefinitions = await SimpleVaultDefinitions.deployed();
5058
console.log(`✅ SimpleVaultDefinitions deployed at: ${simpleVaultDefinitions.address}`);
5159
}
52-
60+
5361
if (deploySimpleRWA20) {
5462
// Deploy SimpleRWA20Definitions
5563
await deployer.deploy(SimpleRWA20Definitions);
5664
simpleRWA20Definitions = await SimpleRWA20Definitions.deployed();
5765
console.log(`✅ SimpleRWA20Definitions deployed at: ${simpleRWA20Definitions.address}`);
5866
}
59-
67+
6068
if (deployERC20Blox) {
6169
// Deploy ERC20BloxDefinitions
6270
await deployer.deploy(ERC20BloxDefinitions);
6371
erc20BloxDefinitions = await ERC20BloxDefinitions.deployed();
6472
console.log(`✅ ERC20BloxDefinitions deployed at: ${erc20BloxDefinitions.address}`);
6573
}
74+
75+
if (deployFactoryBlox) {
76+
// Deploy FactoryBloxDefinitions
77+
await deployer.deploy(FactoryBloxDefinitions);
78+
factoryBloxDefinitions = await FactoryBloxDefinitions.deployed();
79+
console.log(`✅ FactoryBloxDefinitions deployed at: ${factoryBloxDefinitions.address}`);
80+
}
6681
} else {
6782
console.log("\n📦 Step 1: Skipping Example-Specific Definitions Libraries (no contracts enabled)");
6883
}
@@ -255,11 +270,81 @@ module.exports = async function(deployer, network, accounts) {
255270
console.log("\n📦 Step 5: Skipping ERC20Blox deployment (disabled)");
256271
}
257272

273+
// Step 6: Deploy FactoryBlox (if enabled)
274+
let factoryBlox = null;
275+
if (deployFactoryBlox) {
276+
console.log("\n📦 Step 6: Deploying FactoryBlox...");
277+
await deployer.link(sa, FactoryBlox);
278+
await deployer.link(sod, FactoryBlox);
279+
await deployer.link(drbd, FactoryBlox);
280+
await deployer.link(gcd, FactoryBlox);
281+
await deployer.link(factoryBloxDefinitions, FactoryBlox);
282+
await deployer.deploy(FactoryBlox);
283+
factoryBlox = await FactoryBlox.deployed();
284+
console.log(`✅ FactoryBlox deployed at: ${factoryBlox.address}`);
285+
const web3Factory = factoryBlox.constructor.web3 || global.web3;
286+
await saveArtifactNetwork(FactoryBlox, factoryBlox.address, web3Factory, network);
287+
288+
// Initialize FactoryBlox (5 params)
289+
console.log("🔧 Initializing FactoryBlox...");
290+
try {
291+
await factoryBlox.initialize(
292+
accounts[0], // initialOwner
293+
accounts[1], // broadcaster
294+
accounts[2], // recovery
295+
1, // timeLockPeriodInSeconds (1 second for fast testing)
296+
"0x0000000000000000000000000000000000000000" // eventForwarder (none)
297+
);
298+
console.log("✅ FactoryBlox initialized successfully");
299+
} catch (error) {
300+
console.log("❌ FactoryBlox initialize failed:", error.message);
301+
console.log("⚠️ Contract deployed but not initialized.");
302+
}
303+
} else {
304+
console.log("\n📦 Step 6: Skipping FactoryBlox deployment (disabled)");
305+
}
306+
307+
// Step 7: Deploy BloxchainWallet (if enabled) - Account-based, no definitions library; timeLock 1–90 days
308+
const ONE_DAY_SEC = 86400;
309+
let bloxchainWallet = null;
310+
if (deployWalletBlox) {
311+
console.log("\n📦 Step 7: Deploying BloxchainWallet...");
312+
await deployer.link(sa, BloxchainWallet);
313+
await deployer.link(sod, BloxchainWallet);
314+
await deployer.link(drbd, BloxchainWallet);
315+
await deployer.link(gcd, BloxchainWallet);
316+
await deployer.deploy(BloxchainWallet);
317+
bloxchainWallet = await BloxchainWallet.deployed();
318+
console.log(`✅ BloxchainWallet deployed at: ${bloxchainWallet.address}`);
319+
const web3Wallet = bloxchainWallet.constructor.web3 || global.web3;
320+
await saveArtifactNetwork(BloxchainWallet, bloxchainWallet.address, web3Wallet, network);
321+
322+
// Initialize BloxchainWallet (5 params); timeLock must be between 1 and 90 days
323+
console.log("🔧 Initializing BloxchainWallet...");
324+
try {
325+
await bloxchainWallet.initialize(
326+
accounts[0], // initialOwner
327+
accounts[1], // broadcaster
328+
accounts[2], // recovery
329+
ONE_DAY_SEC, // timeLockPeriodInSeconds (min 1 day per contract)
330+
"0x0000000000000000000000000000000000000000" // eventForwarder (none)
331+
);
332+
console.log("✅ BloxchainWallet initialized successfully");
333+
} catch (error) {
334+
console.log("❌ BloxchainWallet initialize failed:", error.message);
335+
console.log("⚠️ Contract deployed but not initialized.");
336+
}
337+
} else {
338+
console.log("\n📦 Step 7: Skipping BloxchainWallet deployment (disabled)");
339+
}
340+
258341
console.log("\n🎉 Migration 3 completed successfully!");
259342
console.log("📋 Example Contracts Deployed & Initialized:");
260343
if (simpleVault) console.log(` SimpleVault: ${simpleVault.address}`);
261344
if (simpleRWA20) console.log(` SimpleRWA20: ${simpleRWA20.address}`);
262345
if (erc20Blox) console.log(` ERC20Blox: ${erc20Blox.address}`);
346+
if (factoryBlox) console.log(` FactoryBlox: ${factoryBlox.address}`);
347+
if (bloxchainWallet) console.log(` BloxchainWallet: ${bloxchainWallet.address}`);
263348

264349
// Save deployed addresses to file for auto mode fallback
265350
const fs = require('fs');
@@ -293,6 +378,12 @@ module.exports = async function(deployer, network, accounts) {
293378
deployedAt: new Date().toISOString()
294379
};
295380
}
381+
if (factoryBloxDefinitions) {
382+
addresses[network].FactoryBloxDefinitions = {
383+
address: factoryBloxDefinitions.address,
384+
deployedAt: new Date().toISOString()
385+
};
386+
}
296387
if (simpleVault) {
297388
addresses[network].SimpleVault = {
298389
address: simpleVault.address,
@@ -311,7 +402,19 @@ module.exports = async function(deployer, network, accounts) {
311402
deployedAt: new Date().toISOString()
312403
};
313404
}
314-
405+
if (factoryBlox) {
406+
addresses[network].FactoryBlox = {
407+
address: factoryBlox.address,
408+
deployedAt: new Date().toISOString()
409+
};
410+
}
411+
if (bloxchainWallet) {
412+
addresses[network].BloxchainWallet = {
413+
address: bloxchainWallet.address,
414+
deployedAt: new Date().toISOString()
415+
};
416+
}
417+
315418
fs.writeFileSync(addressesFile, JSON.stringify(addresses, null, 2));
316419
console.log(`\n💾 Saved addresses to ${addressesFile}`);
317420

@@ -325,13 +428,16 @@ module.exports = async function(deployer, network, accounts) {
325428
if (simpleVaultDefinitions) console.log(` SimpleVaultDefinitions: ${simpleVaultDefinitions.address}`);
326429
if (simpleRWA20Definitions) console.log(` SimpleRWA20Definitions: ${simpleRWA20Definitions.address}`);
327430
if (erc20BloxDefinitions) console.log(` ERC20BloxDefinitions: ${erc20BloxDefinitions.address}`);
431+
if (factoryBloxDefinitions) console.log(` FactoryBloxDefinitions: ${factoryBloxDefinitions.address}`);
328432
console.log("🛡️ Guardian Contracts (Deployed & Initialized):");
329433
console.log(` GuardianAccountAbstraction: 0xf759A0e8F2fFBb5F5a9DD50f1106668FBE29bC93`);
330434
console.log(` GuardianAccountAbstractionWithRoles: 0xA5682DF1987D214Fe4dfC3a262179eBDc205b525`);
331435
console.log("🏦 Example Contracts (Deployed & Initialized):");
332436
if (simpleVault) console.log(` SimpleVault: ${simpleVault.address}`);
333437
if (simpleRWA20) console.log(` SimpleRWA20: ${simpleRWA20.address}`);
334438
if (erc20Blox) console.log(` ERC20Blox: ${erc20Blox.address}`);
439+
if (factoryBlox) console.log(` FactoryBlox: ${factoryBlox.address}`);
440+
if (bloxchainWallet) console.log(` BloxchainWallet: ${bloxchainWallet.address}`);
335441
console.log("\n✅ All contracts deployed and initialized successfully!");
336442
console.log("🎯 Ready for comprehensive analyzer testing with fully functional contracts!");
337443
console.log("🔧 Initialization Parameters:");
@@ -344,10 +450,12 @@ module.exports = async function(deployer, network, accounts) {
344450
console.log(` Token Symbol: SRWA`);
345451

346452
console.log("\n💡 Usage Examples:");
347-
console.log(" Deploy only SimpleVault: DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=false truffle migrate");
348-
console.log(" Deploy only SimpleRWA20: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=false truffle migrate");
349-
console.log(" Deploy only ERC20Blox: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=true truffle migrate");
350-
console.log(" Deploy all example contracts: DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=true truffle migrate");
453+
console.log(" Deploy only SimpleVault: DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=false DEPLOY_FACTORY_BLOX=false DEPLOY_WALLET_BLOX=false truffle migrate");
454+
console.log(" Deploy only SimpleRWA20: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=false DEPLOY_FACTORY_BLOX=false DEPLOY_WALLET_BLOX=false truffle migrate");
455+
console.log(" Deploy only ERC20Blox: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=true DEPLOY_FACTORY_BLOX=false DEPLOY_WALLET_BLOX=false truffle migrate");
456+
console.log(" Deploy only FactoryBlox: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=false DEPLOY_FACTORY_BLOX=true DEPLOY_WALLET_BLOX=false truffle migrate");
457+
console.log(" Deploy only BloxchainWallet: DEPLOY_SIMPLE_VAULT=false DEPLOY_SIMPLE_RWA20=false DEPLOY_ERC20_BLOX=false DEPLOY_FACTORY_BLOX=false DEPLOY_WALLET_BLOX=true truffle migrate");
458+
console.log(" Deploy all example contracts: DEPLOY_SIMPLE_VAULT=true DEPLOY_SIMPLE_RWA20=true DEPLOY_ERC20_BLOX=true DEPLOY_FACTORY_BLOX=true DEPLOY_WALLET_BLOX=true truffle migrate");
351459
console.log(" Deploy none (default): truffle migrate");
352460

353461
} catch (error) {

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Bloxchain",
3-
"version": "1.0.0-alpha.7",
3+
"version": "1.0.0-alpha.8",
44
"description": "Library engine for building enterprise grade decentralized permissioned applications",
55
"type": "module",
66
"main": "truffle-config.cjs",
@@ -41,14 +41,14 @@
4141
"test:packages": "node scripts/test-packages.cjs",
4242
"extract-abi": "node scripts/extract-abi.cjs",
4343
"release:sync-versions": "node scripts/sync-versions.cjs",
44-
"release:sync-versions:tag:alpha": "node scripts/sync-versions.cjs --tag alpha.7",
44+
"release:sync-versions:tag:alpha": "node scripts/sync-versions.cjs --tag alpha.8",
4545
"build:sdk": "cd sdk/typescript && npm run build",
4646
"build:sdk:clean": "cd sdk/typescript && npm run clean && npm run build",
4747
"prepublish:sdk": "npm run release:sync-versions && npm run extract-abi && npm run build:sdk",
4848
"prepublish:contracts": "npm run release:sync-versions",
4949
"generate:contracts-lock": "cd package && npm install --package-lock-only",
50-
"publish:contracts": "npm run prepublish:contracts && cd package && npm publish --tag alpha.7",
51-
"publish:sdk": "npm run prepublish:sdk && cd sdk/typescript && npm publish --tag alpha.7",
50+
"publish:contracts": "npm run prepublish:contracts && cd package && npm publish --tag alpha.8",
51+
"publish:sdk": "npm run prepublish:sdk && cd sdk/typescript && npm publish --tag alpha.8",
5252
"docgen": "npm run compile:hardhat && cd docgen && npm run docgen",
5353
"docgen:install": "cd docgen && npm install",
5454
"format": "prettier --config .prettierrc --write \"contracts/**/*.sol\"",

package/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@bloxchain/contracts",
3-
"version": "1.0.0-alpha.7",
3+
"version": "1.0.0-alpha.8",
44
"description": "Library engine for building enterprise grade decentralized permissioned applications",
55
"files": [
66
"core",

scripts/deploy-foundation-libraries.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ async function main() {
3636
if (!hasViem && !hasEthers) {
3737
throw new Error(
3838
"Deployment requires either Hardhat viem (conn.viem) or ethers (conn.ethers with getSigners). " +
39-
"Ensure the Hardhat toolbox is configured and the network is connected."
39+
"Ensure the Hardhat toolbox is configured and the network is connected. " +
40+
"Install the Viem toolbox with: npm install --save-dev @nomicfoundation/hardhat-toolbox-viem"
4041
);
4142
}
4243

0 commit comments

Comments
 (0)