UNPKG

@openzeppelin/upgrades

Version:

JavaScript library for the OpenZeppelin smart contract platform

92 lines 4.92 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const web3_utils_1 = require("web3-utils"); const ZWeb3_1 = __importDefault(require("../artifacts/ZWeb3")); const Contracts_1 = __importDefault(require("../artifacts/Contracts")); const Addresses_1 = require("../utils/Addresses"); const Transactions_1 = __importDefault(require("../utils/Transactions")); const Constants_1 = require("../utils/Constants"); class Proxy { constructor(contract, txParams = {}) { this.address = Addresses_1.toAddress(contract); this.contract = contract; this.txParams = txParams; } static at(contractOrAddress, txParams = {}) { const ProxyContract = Contracts_1.default.getFromLib('AdminUpgradeabilityProxy'); const contract = ProxyContract.at(Addresses_1.toAddress(contractOrAddress)); return new this(contract, txParams); } static deploy(implementation, admin, initData, txParams = {}) { return __awaiter(this, void 0, void 0, function* () { const ProxyContract = Contracts_1.default.getFromLib('AdminUpgradeabilityProxy'); const contractParams = [Addresses_1.toAddress(implementation), Addresses_1.toAddress(admin), initData || Buffer.from('')]; const contract = yield Transactions_1.default.deployContract(ProxyContract, contractParams, txParams); return new this(contract, txParams); }); } upgradeTo(address, migrateData) { return __awaiter(this, void 0, void 0, function* () { yield this.checkAdmin(); return migrateData ? Transactions_1.default.sendTransaction(this.contract.methods.upgradeToAndCall, [Addresses_1.toAddress(address), migrateData], this.txParams) : Transactions_1.default.sendTransaction(this.contract.methods.upgradeTo, [Addresses_1.toAddress(address)], this.txParams); }); } changeAdmin(newAdmin) { return __awaiter(this, void 0, void 0, function* () { yield this.checkAdmin(); return Transactions_1.default.sendTransaction(this.contract.methods.changeAdmin, [newAdmin], this.txParams); }); } implementation() { return __awaiter(this, void 0, void 0, function* () { const hashedLabel = web3_utils_1.toHex(web3_utils_1.toBN(web3_utils_1.sha3(Constants_1.IMPLEMENTATION_LABEL)).sub(web3_utils_1.toBN(1))); let storage = yield this.getStorageAt(hashedLabel); // TODO-v3: Remove deprecated 'zos' support if (storage === '0x0') { storage = yield this.getStorageAt(web3_utils_1.sha3(Constants_1.DEPRECATED_IMPLEMENTATION_LABEL)); } return Addresses_1.uint256ToAddress(storage); }); } admin() { return __awaiter(this, void 0, void 0, function* () { const hashedLabel = web3_utils_1.toHex(web3_utils_1.toBN(web3_utils_1.sha3(Constants_1.ADMIN_LABEL)).sub(web3_utils_1.toBN(1))); let storage = yield this.getStorageAt(hashedLabel); // TODO-v3: Remove deprecated 'zos' support if (storage === '0x0') { storage = yield this.getStorageAt(web3_utils_1.sha3(Constants_1.DEPRECATED_ADMIN_LABEL)); } return Addresses_1.uint256ToAddress(storage); }); } getStorageAt(position) { return __awaiter(this, void 0, void 0, function* () { return ZWeb3_1.default.eth.getStorageAt(this.address, position); }); } checkAdmin() { return __awaiter(this, void 0, void 0, function* () { const currentAdmin = yield this.admin(); const { from } = this.txParams; // TODO: If no `from` is set, load which is the default account and use it to compare against the current admin if (from && currentAdmin !== from) throw new Error(`Cannot modify proxy from non-admin account: current admin is ${currentAdmin} and sender is ${from}`); }); } } exports.default = Proxy; //# sourceMappingURL=Proxy.js.map