@openzeppelin/upgrades-core 1.32.0-alpha.0 → 1.32.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/artifacts/@openzeppelin/contracts-v5/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
- package/artifacts/@openzeppelin/contracts-v5/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
- package/artifacts/@openzeppelin/contracts-v5/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +2 -2
- package/artifacts/build-info-v5.json +30 -30
- package/dist/impl-store.d.ts.map +1 -1
- package/dist/impl-store.js +24 -14
- package/dist/impl-store.js.map +1 -1
- package/dist/impl-store.test.js +73 -4
- package/dist/impl-store.test.js.map +1 -1
- package/package.json +3 -3
- package/src/impl-store.test.ts +128 -4
- package/src/impl-store.ts +27 -16
package/dist/impl-store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impl-store.d.ts","sourceRoot":"","sources":["../src/impl-store.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,cAAc,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,YAAY,CAAC;AACpE,OAAO,EACL,UAAU,EAEV,gBAAgB,EAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAQ/B,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACrB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CACpC;
|
|
1
|
+
{"version":3,"file":"impl-store.d.ts","sourceRoot":"","sources":["../src/impl-store.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,cAAc,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,YAAY,CAAC;AACpE,OAAO,EACL,UAAU,EAEV,gBAAgB,EAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAQ/B,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACrB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CACpC;AAmFD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,QAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,EACrC,IAAI,CAAC,EAAE,UAAU,EACjB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAAC,CAAC,SAAS,cAAc,EACvE,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,UAAU,EACjB,KAAK,CAAC,EAAE,OAAO,EACf,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAC1F,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,CASzB;AAsBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;;;EAU7E;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,EACjC,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC,CAEjB"}
|
package/dist/impl-store.js
CHANGED
|
@@ -36,13 +36,11 @@ async function fetchOrDeployGeneric(lens, provider, deploy, opts, merge, getRemo
|
|
|
36
36
|
const updated = await (0, deployment_1.resumeOrDeploy)(provider, stored, deploy, lens.type, opts, deployment, merge, getRemoteDeployment);
|
|
37
37
|
if (updated !== stored) {
|
|
38
38
|
if (merge && deployment.merge) {
|
|
39
|
-
|
|
40
|
-
// but the above updated and stored objects are different instances representing the same entry
|
|
41
|
-
await checkForAddressClash(provider, data, updated, false);
|
|
39
|
+
await checkForAddressClash(provider, data, updated, true);
|
|
42
40
|
deployment.merge(updated);
|
|
43
41
|
}
|
|
44
42
|
else {
|
|
45
|
-
await checkForAddressClash(provider, data, updated,
|
|
43
|
+
await checkForAddressClash(provider, data, updated, false);
|
|
46
44
|
deployment.set(updated);
|
|
47
45
|
}
|
|
48
46
|
await manifest.write(data);
|
|
@@ -118,7 +116,12 @@ const implLens = (versionWithoutMetadata) => lens(`implementation ${versionWitho
|
|
|
118
116
|
const existing = data.impls[versionWithoutMetadata];
|
|
119
117
|
if (existing !== undefined && value !== undefined) {
|
|
120
118
|
const { address, allAddresses } = mergeAddresses(existing, value);
|
|
121
|
-
data.impls[versionWithoutMetadata] = {
|
|
119
|
+
data.impls[versionWithoutMetadata] = {
|
|
120
|
+
...existing,
|
|
121
|
+
address,
|
|
122
|
+
allAddresses,
|
|
123
|
+
remoteDeploymentId: value.remoteDeploymentId,
|
|
124
|
+
};
|
|
122
125
|
}
|
|
123
126
|
else {
|
|
124
127
|
data.impls[versionWithoutMetadata] = value;
|
|
@@ -151,24 +154,31 @@ const adminLens = lens('proxy admin', 'proxy admin', data => ({
|
|
|
151
154
|
function lens(description, type, fn) {
|
|
152
155
|
return Object.assign(fn, { description, type });
|
|
153
156
|
}
|
|
154
|
-
async function checkForAddressClash(provider, data, updated,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
157
|
+
async function checkForAddressClash(provider, data, updated, merge) {
|
|
158
|
+
let clash;
|
|
159
|
+
const findClash = () => lookupDeployment(data, updated.address, !merge);
|
|
160
|
+
if (await (0, provider_1.isDevelopmentNetwork)(provider)) {
|
|
161
|
+
// Look for clashes so that we can delete deployments from older runs.
|
|
162
|
+
// `merge` only checks primary addresses for clashes, since the address could already exist in an allAddresses field
|
|
163
|
+
// but the updated and stored objects are different instances representing the same entry.
|
|
164
|
+
clash = findClash();
|
|
165
|
+
if (clash !== undefined) {
|
|
158
166
|
(0, debug_1.default)('deleting a previous deployment at address', updated.address);
|
|
159
167
|
clash.set(undefined);
|
|
160
168
|
}
|
|
161
|
-
|
|
169
|
+
}
|
|
170
|
+
else if (!merge) {
|
|
171
|
+
clash = findClash();
|
|
172
|
+
if (clash !== undefined) {
|
|
162
173
|
const existing = clash.get();
|
|
163
174
|
// it's a clash if there is no deployment id or if deployment ids don't match
|
|
164
175
|
if (existing !== undefined &&
|
|
165
176
|
(existing.remoteDeploymentId === undefined || existing.remoteDeploymentId !== updated.remoteDeploymentId)) {
|
|
166
|
-
throw new Error(`The
|
|
167
|
-
JSON.stringify(updated, null, 2)
|
|
168
|
-
`\n\n`);
|
|
177
|
+
throw new Error(`The deployment clashes with an existing one at ${updated.address}.\n\n` +
|
|
178
|
+
`Deployments: ${JSON.stringify({ existing, updated }, null, 2)}\n\n`);
|
|
169
179
|
}
|
|
170
180
|
}
|
|
171
|
-
}
|
|
181
|
+
} // else, merge indicates that the user is force-importing or redeploying an implementation, so we simply allow merging the entries
|
|
172
182
|
}
|
|
173
183
|
function lookupDeployment(data, address, checkAllAddresses) {
|
|
174
184
|
if (data.admin?.address === address) {
|
package/dist/impl-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impl-store.js","sourceRoot":"","sources":["../src/impl-store.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAkC;AAClC,yCAAoE;AACpE,yCAAoE;AACpE,6CAOsB;AAEtB,oDAA4B;AAe5B;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,oBAAoB,CACjC,IAAqB,EACrB,QAA0B,EAC1B,MAAwB,EACxB,IAAiB,EACjB,KAAe,EACf,mBAA2F;IAE3F,MAAM,QAAQ,GAAG,MAAM,mBAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAErD,IAAI;QACF,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YACrD,IAAA,eAAK,EAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;gBAC9B,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAC;aACH;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAc,EAClC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,CAAC,IAAI,EACT,IAAI,EACJ,UAAU,EACV,KAAK,EACL,mBAAmB,CACpB,CAAC;YACF,IAAI,OAAO,KAAK,MAAM,EAAE;gBACtB,IAAI,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE;oBAC7B,
|
|
1
|
+
{"version":3,"file":"impl-store.js","sourceRoot":"","sources":["../src/impl-store.ts"],"names":[],"mappings":"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"}
|
package/dist/impl-store.test.js
CHANGED
|
@@ -54,28 +54,28 @@ const version2 = (0, version_1.getVersion)('02', '02');
|
|
|
54
54
|
(0, ava_1.default)('merge addresses', async (t) => {
|
|
55
55
|
const depl1 = { address: '0x1' };
|
|
56
56
|
const depl2 = { address: '0x2' };
|
|
57
|
-
const { address, allAddresses } =
|
|
57
|
+
const { address, allAddresses } = (0, impl_store_1.mergeAddresses)(depl1, depl2);
|
|
58
58
|
t.is(address, '0x1');
|
|
59
59
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x2']), allAddresses.toString());
|
|
60
60
|
});
|
|
61
61
|
(0, ava_1.default)('merge multiple existing addresses', async (t) => {
|
|
62
62
|
const depl1 = { address: '0x1', allAddresses: ['0x1a', '0x1b'] };
|
|
63
63
|
const depl2 = { address: '0x2' };
|
|
64
|
-
const { address, allAddresses } =
|
|
64
|
+
const { address, allAddresses } = (0, impl_store_1.mergeAddresses)(depl1, depl2);
|
|
65
65
|
t.is(address, '0x1');
|
|
66
66
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x1a', '0x1b', '0x2']), allAddresses.toString());
|
|
67
67
|
});
|
|
68
68
|
(0, ava_1.default)('merge all addresses', async (t) => {
|
|
69
69
|
const depl1 = { address: '0x1', allAddresses: ['0x1a', '0x1b'] };
|
|
70
70
|
const depl2 = { address: '0x2', allAddresses: ['0x2a', '0x2b'] };
|
|
71
|
-
const { address, allAddresses } =
|
|
71
|
+
const { address, allAddresses } = (0, impl_store_1.mergeAddresses)(depl1, depl2);
|
|
72
72
|
t.is(address, '0x1');
|
|
73
73
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x1a', '0x1b', '0x2', '0x2a', '0x2b']), allAddresses.toString());
|
|
74
74
|
});
|
|
75
75
|
function unorderedEqual(arr1, arr2) {
|
|
76
76
|
return arr1.every(i => arr2.includes(i)) && arr2.every(i => arr1.includes(i));
|
|
77
77
|
}
|
|
78
|
-
(0, ava_1.default)('
|
|
78
|
+
(0, ava_1.default)('defender - replace tx hash for deployment', async (t) => {
|
|
79
79
|
const provider = (0, stub_provider_1.stubProvider)();
|
|
80
80
|
// create a pending deployment with id
|
|
81
81
|
const fakeDeploy = await provider.deployPending();
|
|
@@ -104,4 +104,73 @@ function unorderedEqual(arr1, arr2) {
|
|
|
104
104
|
t.is(deployment.address, fakeDeploy.address);
|
|
105
105
|
t.is(deployment.txHash, '0x2');
|
|
106
106
|
});
|
|
107
|
+
(0, ava_1.default)('defender - address clash', async (t) => {
|
|
108
|
+
const provider = (0, stub_provider_1.stubProvider)();
|
|
109
|
+
// create a pending deployment with id
|
|
110
|
+
const fakeDeploy = await provider.deployPending();
|
|
111
|
+
provider.removeContract(fakeDeploy.address);
|
|
112
|
+
async function deployment1() {
|
|
113
|
+
return {
|
|
114
|
+
...fakeDeploy,
|
|
115
|
+
txHash: '0x1',
|
|
116
|
+
remoteDeploymentId: 'abc',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const mockPendingDeployment = sinon_1.default.stub().returns({
|
|
120
|
+
status: 'submitted',
|
|
121
|
+
txHash: '0x1',
|
|
122
|
+
});
|
|
123
|
+
// let it timeout
|
|
124
|
+
await t.throwsAsync((0, impl_store_1.fetchOrDeployGetDeployment)(version1, provider, deployment1, { timeout: 1, pollingInterval: 0 }, undefined, mockPendingDeployment));
|
|
125
|
+
// simulate a new deployment with the same address, but different tx hash and deployment id
|
|
126
|
+
async function deployment2() {
|
|
127
|
+
return {
|
|
128
|
+
...fakeDeploy,
|
|
129
|
+
txHash: '0x2',
|
|
130
|
+
remoteDeploymentId: 'def',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// deploy with a different version hash
|
|
134
|
+
const error = await t.throwsAsync((0, impl_store_1.fetchOrDeployGetDeployment)(version2, provider, deployment2, { timeout: 1, pollingInterval: 0 }, undefined, mockPendingDeployment));
|
|
135
|
+
t.true(error?.message.startsWith(`The deployment clashes with an existing one at ${fakeDeploy.address}`), error?.message);
|
|
136
|
+
});
|
|
137
|
+
(0, ava_1.default)('defender - merge avoids address clash, replaces deployment id', async (t) => {
|
|
138
|
+
const provider = (0, stub_provider_1.stubProvider)();
|
|
139
|
+
const MERGE = true;
|
|
140
|
+
// create a pending deployment with id
|
|
141
|
+
const fakeDeploy = await provider.deployPending();
|
|
142
|
+
provider.removeContract(fakeDeploy.address);
|
|
143
|
+
async function deployment1() {
|
|
144
|
+
return {
|
|
145
|
+
...fakeDeploy,
|
|
146
|
+
txHash: '0x1',
|
|
147
|
+
remoteDeploymentId: 'abc',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const getDeploymentResponse1 = sinon_1.default.stub().returns({
|
|
151
|
+
status: 'submitted',
|
|
152
|
+
txHash: '0x1',
|
|
153
|
+
});
|
|
154
|
+
// let it timeout
|
|
155
|
+
await t.throwsAsync((0, impl_store_1.fetchOrDeployGetDeployment)(version1, provider, deployment1, { timeout: 1, pollingInterval: 0 }, MERGE, getDeploymentResponse1));
|
|
156
|
+
// simulate a failed previous deployment
|
|
157
|
+
const getDeploymentResponse2 = sinon_1.default.stub().returns({
|
|
158
|
+
status: 'failed',
|
|
159
|
+
txHash: '0x1',
|
|
160
|
+
});
|
|
161
|
+
// redeploy with a new deployment id
|
|
162
|
+
async function deployment2() {
|
|
163
|
+
return {
|
|
164
|
+
...fakeDeploy,
|
|
165
|
+
txHash: '0x2',
|
|
166
|
+
remoteDeploymentId: 'def',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// make the contract code exist
|
|
170
|
+
provider.addContract(fakeDeploy.address);
|
|
171
|
+
const deployment = await (0, impl_store_1.fetchOrDeployGetDeployment)(version1, provider, deployment2, { timeout: 1, pollingInterval: 0 }, MERGE, getDeploymentResponse2);
|
|
172
|
+
t.is(deployment.address, fakeDeploy.address);
|
|
173
|
+
t.is(deployment.txHash, '0x2');
|
|
174
|
+
t.is(deployment.remoteDeploymentId, 'def');
|
|
175
|
+
});
|
|
107
176
|
//# sourceMappingURL=impl-store.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impl-store.test.js","sourceRoot":"","sources":["../src/impl-store.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AAEvB,2BAAoC;AACpC,mCAAgC;AAChC,gDAAwB;AACxB,4CAAoB;AACpB,kDAA0B;AAE1B,6CAAyF;AACzF,uCAAuC;AACvC,mDAA+C;
|
|
1
|
+
{"version":3,"file":"impl-store.test.js","sourceRoot":"","sources":["../src/impl-store.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openzeppelin/upgrades-core",
|
|
3
|
-
"version": "1.32.0
|
|
3
|
+
"version": "1.32.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@ava/typescript": "^4.0.0",
|
|
47
47
|
"@nomicfoundation/hardhat-ethers": "^3.0.5",
|
|
48
|
-
"@openzeppelin/contracts": "5.0.
|
|
48
|
+
"@openzeppelin/contracts": "5.0.1",
|
|
49
49
|
"@openzeppelin/upgrades-core-legacy": "npm:@openzeppelin/upgrades-core@1.31.3",
|
|
50
50
|
"@types/cbor": "^5.0.0",
|
|
51
51
|
"@types/debug": "^4.1.5",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"proper-lockfile": "^4.1.1",
|
|
72
72
|
"solidity-ast": "^0.4.51"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "3b113ee12d1bb47cd3cf736f1c70b1302289e8d2"
|
|
75
75
|
}
|
package/src/impl-store.test.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { fetchOrDeploy, fetchOrDeployGetDeployment, mergeAddresses } from './imp
|
|
|
10
10
|
import { getVersion } from './version';
|
|
11
11
|
import { stubProvider } from './stub-provider';
|
|
12
12
|
import { ImplDeployment } from './manifest';
|
|
13
|
+
import { RemoteDeploymentId } from './deployment';
|
|
13
14
|
|
|
14
15
|
test.before(async () => {
|
|
15
16
|
process.chdir(await fs.mkdtemp(path.join(os.tmpdir(), 'upgrades-core-test-')));
|
|
@@ -61,7 +62,7 @@ test('merge addresses', async t => {
|
|
|
61
62
|
const depl1 = { address: '0x1' } as ImplDeployment;
|
|
62
63
|
const depl2 = { address: '0x2' } as ImplDeployment;
|
|
63
64
|
|
|
64
|
-
const { address, allAddresses } =
|
|
65
|
+
const { address, allAddresses } = mergeAddresses(depl1, depl2);
|
|
65
66
|
t.is(address, '0x1');
|
|
66
67
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x2']), allAddresses.toString());
|
|
67
68
|
});
|
|
@@ -70,7 +71,7 @@ test('merge multiple existing addresses', async t => {
|
|
|
70
71
|
const depl1 = { address: '0x1', allAddresses: ['0x1a', '0x1b'] } as ImplDeployment;
|
|
71
72
|
const depl2 = { address: '0x2' } as ImplDeployment;
|
|
72
73
|
|
|
73
|
-
const { address, allAddresses } =
|
|
74
|
+
const { address, allAddresses } = mergeAddresses(depl1, depl2);
|
|
74
75
|
t.is(address, '0x1');
|
|
75
76
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x1a', '0x1b', '0x2']), allAddresses.toString());
|
|
76
77
|
});
|
|
@@ -79,7 +80,7 @@ test('merge all addresses', async t => {
|
|
|
79
80
|
const depl1 = { address: '0x1', allAddresses: ['0x1a', '0x1b'] } as ImplDeployment;
|
|
80
81
|
const depl2 = { address: '0x2', allAddresses: ['0x2a', '0x2b'] } as ImplDeployment;
|
|
81
82
|
|
|
82
|
-
const { address, allAddresses } =
|
|
83
|
+
const { address, allAddresses } = mergeAddresses(depl1, depl2);
|
|
83
84
|
t.is(address, '0x1');
|
|
84
85
|
t.true(unorderedEqual(allAddresses, ['0x1', '0x1a', '0x1b', '0x2', '0x2a', '0x2b']), allAddresses.toString());
|
|
85
86
|
});
|
|
@@ -88,7 +89,7 @@ function unorderedEqual(arr1: string[], arr2: string[]) {
|
|
|
88
89
|
return arr1.every(i => arr2.includes(i)) && arr2.every(i => arr1.includes(i));
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
test('
|
|
92
|
+
test('defender - replace tx hash for deployment', async t => {
|
|
92
93
|
const provider = stubProvider();
|
|
93
94
|
|
|
94
95
|
// create a pending deployment with id
|
|
@@ -137,3 +138,126 @@ test('platform - replace tx hash for deployment', async t => {
|
|
|
137
138
|
t.is(deployment.address, fakeDeploy.address);
|
|
138
139
|
t.is(deployment.txHash, '0x2');
|
|
139
140
|
});
|
|
141
|
+
|
|
142
|
+
test('defender - address clash', async t => {
|
|
143
|
+
const provider = stubProvider();
|
|
144
|
+
|
|
145
|
+
// create a pending deployment with id
|
|
146
|
+
const fakeDeploy = await provider.deployPending();
|
|
147
|
+
provider.removeContract(fakeDeploy.address);
|
|
148
|
+
|
|
149
|
+
async function deployment1() {
|
|
150
|
+
return {
|
|
151
|
+
...fakeDeploy,
|
|
152
|
+
txHash: '0x1',
|
|
153
|
+
remoteDeploymentId: 'abc',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const mockPendingDeployment = sinon.stub().returns({
|
|
158
|
+
status: 'submitted',
|
|
159
|
+
txHash: '0x1',
|
|
160
|
+
});
|
|
161
|
+
// let it timeout
|
|
162
|
+
await t.throwsAsync(
|
|
163
|
+
fetchOrDeployGetDeployment(
|
|
164
|
+
version1,
|
|
165
|
+
provider,
|
|
166
|
+
deployment1,
|
|
167
|
+
{ timeout: 1, pollingInterval: 0 },
|
|
168
|
+
undefined,
|
|
169
|
+
mockPendingDeployment,
|
|
170
|
+
),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// simulate a new deployment with the same address, but different tx hash and deployment id
|
|
174
|
+
async function deployment2() {
|
|
175
|
+
return {
|
|
176
|
+
...fakeDeploy,
|
|
177
|
+
txHash: '0x2',
|
|
178
|
+
remoteDeploymentId: 'def',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// deploy with a different version hash
|
|
183
|
+
const error = await t.throwsAsync(
|
|
184
|
+
fetchOrDeployGetDeployment(
|
|
185
|
+
version2,
|
|
186
|
+
provider,
|
|
187
|
+
deployment2,
|
|
188
|
+
{ timeout: 1, pollingInterval: 0 },
|
|
189
|
+
undefined,
|
|
190
|
+
mockPendingDeployment,
|
|
191
|
+
),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
t.true(
|
|
195
|
+
error?.message.startsWith(`The deployment clashes with an existing one at ${fakeDeploy.address}`),
|
|
196
|
+
error?.message,
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('defender - merge avoids address clash, replaces deployment id', async t => {
|
|
201
|
+
const provider = stubProvider();
|
|
202
|
+
|
|
203
|
+
const MERGE = true;
|
|
204
|
+
|
|
205
|
+
// create a pending deployment with id
|
|
206
|
+
const fakeDeploy = await provider.deployPending();
|
|
207
|
+
provider.removeContract(fakeDeploy.address);
|
|
208
|
+
|
|
209
|
+
async function deployment1() {
|
|
210
|
+
return {
|
|
211
|
+
...fakeDeploy,
|
|
212
|
+
txHash: '0x1',
|
|
213
|
+
remoteDeploymentId: 'abc',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const getDeploymentResponse1 = sinon.stub().returns({
|
|
218
|
+
status: 'submitted',
|
|
219
|
+
txHash: '0x1',
|
|
220
|
+
});
|
|
221
|
+
// let it timeout
|
|
222
|
+
await t.throwsAsync(
|
|
223
|
+
fetchOrDeployGetDeployment(
|
|
224
|
+
version1,
|
|
225
|
+
provider,
|
|
226
|
+
deployment1,
|
|
227
|
+
{ timeout: 1, pollingInterval: 0 },
|
|
228
|
+
MERGE,
|
|
229
|
+
getDeploymentResponse1,
|
|
230
|
+
),
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
// simulate a failed previous deployment
|
|
234
|
+
const getDeploymentResponse2 = sinon.stub().returns({
|
|
235
|
+
status: 'failed',
|
|
236
|
+
txHash: '0x1',
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// redeploy with a new deployment id
|
|
240
|
+
async function deployment2() {
|
|
241
|
+
return {
|
|
242
|
+
...fakeDeploy,
|
|
243
|
+
txHash: '0x2',
|
|
244
|
+
remoteDeploymentId: 'def',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// make the contract code exist
|
|
249
|
+
provider.addContract(fakeDeploy.address);
|
|
250
|
+
|
|
251
|
+
const deployment = await fetchOrDeployGetDeployment(
|
|
252
|
+
version1,
|
|
253
|
+
provider,
|
|
254
|
+
deployment2,
|
|
255
|
+
{ timeout: 1, pollingInterval: 0 },
|
|
256
|
+
MERGE,
|
|
257
|
+
getDeploymentResponse2,
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
t.is(deployment.address, fakeDeploy.address);
|
|
261
|
+
t.is(deployment.txHash, '0x2');
|
|
262
|
+
t.is((deployment as RemoteDeploymentId).remoteDeploymentId, 'def');
|
|
263
|
+
});
|
package/src/impl-store.ts
CHANGED
|
@@ -72,12 +72,10 @@ async function fetchOrDeployGeneric<T extends Deployment, U extends T = T>(
|
|
|
72
72
|
);
|
|
73
73
|
if (updated !== stored) {
|
|
74
74
|
if (merge && deployment.merge) {
|
|
75
|
-
|
|
76
|
-
// but the above updated and stored objects are different instances representing the same entry
|
|
77
|
-
await checkForAddressClash(provider, data, updated, false);
|
|
75
|
+
await checkForAddressClash(provider, data, updated, true);
|
|
78
76
|
deployment.merge(updated);
|
|
79
77
|
} else {
|
|
80
|
-
await checkForAddressClash(provider, data, updated,
|
|
78
|
+
await checkForAddressClash(provider, data, updated, false);
|
|
81
79
|
deployment.set(updated);
|
|
82
80
|
}
|
|
83
81
|
await manifest.write(data);
|
|
@@ -172,12 +170,17 @@ export async function fetchOrDeployGetDeployment<T extends ImplDeployment>(
|
|
|
172
170
|
const implLens = (versionWithoutMetadata: string) =>
|
|
173
171
|
lens(`implementation ${versionWithoutMetadata}`, 'implementation', data => ({
|
|
174
172
|
get: () => data.impls[versionWithoutMetadata],
|
|
175
|
-
set: (value?: ImplDeployment) => (data.impls[versionWithoutMetadata] = value),
|
|
176
|
-
merge: (value?: ImplDeployment) => {
|
|
173
|
+
set: (value?: ImplDeployment & RemoteDeploymentId) => (data.impls[versionWithoutMetadata] = value),
|
|
174
|
+
merge: (value?: ImplDeployment & RemoteDeploymentId) => {
|
|
177
175
|
const existing = data.impls[versionWithoutMetadata];
|
|
178
176
|
if (existing !== undefined && value !== undefined) {
|
|
179
177
|
const { address, allAddresses } = mergeAddresses(existing, value);
|
|
180
|
-
data.impls[versionWithoutMetadata] = {
|
|
178
|
+
data.impls[versionWithoutMetadata] = {
|
|
179
|
+
...existing,
|
|
180
|
+
address,
|
|
181
|
+
allAddresses,
|
|
182
|
+
remoteDeploymentId: value.remoteDeploymentId,
|
|
183
|
+
};
|
|
181
184
|
} else {
|
|
182
185
|
data.impls[versionWithoutMetadata] = value;
|
|
183
186
|
}
|
|
@@ -223,14 +226,23 @@ async function checkForAddressClash(
|
|
|
223
226
|
provider: EthereumProvider,
|
|
224
227
|
data: ManifestData,
|
|
225
228
|
updated: Deployment & RemoteDeploymentId,
|
|
226
|
-
|
|
229
|
+
merge: boolean,
|
|
227
230
|
): Promise<void> {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
+
let clash;
|
|
232
|
+
const findClash = () => lookupDeployment(data, updated.address, !merge);
|
|
233
|
+
|
|
234
|
+
if (await isDevelopmentNetwork(provider)) {
|
|
235
|
+
// Look for clashes so that we can delete deployments from older runs.
|
|
236
|
+
// `merge` only checks primary addresses for clashes, since the address could already exist in an allAddresses field
|
|
237
|
+
// but the updated and stored objects are different instances representing the same entry.
|
|
238
|
+
clash = findClash();
|
|
239
|
+
if (clash !== undefined) {
|
|
231
240
|
debug('deleting a previous deployment at address', updated.address);
|
|
232
241
|
clash.set(undefined);
|
|
233
|
-
}
|
|
242
|
+
}
|
|
243
|
+
} else if (!merge) {
|
|
244
|
+
clash = findClash();
|
|
245
|
+
if (clash !== undefined) {
|
|
234
246
|
const existing = clash.get();
|
|
235
247
|
// it's a clash if there is no deployment id or if deployment ids don't match
|
|
236
248
|
if (
|
|
@@ -238,13 +250,12 @@ async function checkForAddressClash(
|
|
|
238
250
|
(existing.remoteDeploymentId === undefined || existing.remoteDeploymentId !== updated.remoteDeploymentId)
|
|
239
251
|
) {
|
|
240
252
|
throw new Error(
|
|
241
|
-
`The
|
|
242
|
-
JSON.stringify(updated, null, 2)
|
|
243
|
-
`\n\n`,
|
|
253
|
+
`The deployment clashes with an existing one at ${updated.address}.\n\n` +
|
|
254
|
+
`Deployments: ${JSON.stringify({ existing, updated }, null, 2)}\n\n`,
|
|
244
255
|
);
|
|
245
256
|
}
|
|
246
257
|
}
|
|
247
|
-
}
|
|
258
|
+
} // else, merge indicates that the user is force-importing or redeploying an implementation, so we simply allow merging the entries
|
|
248
259
|
}
|
|
249
260
|
|
|
250
261
|
function lookupDeployment(
|