@safe-global/safe-deployments 1.37.0 → 1.37.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.
Files changed (106) hide show
  1. package/README.md +56 -28
  2. package/dist/accessors.js +1 -3
  3. package/dist/assets/v1.0.0/gnosis_safe.json +477 -103
  4. package/dist/assets/v1.0.0/proxy_factory.json +9 -6
  5. package/dist/assets/v1.1.1/default_callback_handler.json +12 -9
  6. package/dist/assets/v1.1.1/gnosis_safe.json +12 -9
  7. package/dist/assets/v1.1.1/multi_send.json +12 -9
  8. package/dist/assets/v1.1.1/proxy_factory.json +12 -9
  9. package/dist/assets/v1.2.0/gnosis_safe.json +12 -9
  10. package/dist/assets/v1.3.0/compatibility_fallback_handler.json +247 -235
  11. package/dist/assets/v1.3.0/create_call.json +247 -235
  12. package/dist/assets/v1.3.0/gnosis_safe.json +247 -235
  13. package/dist/assets/v1.3.0/gnosis_safe_l2.json +247 -235
  14. package/dist/assets/v1.3.0/multi_send.json +247 -235
  15. package/dist/assets/v1.3.0/multi_send_call_only.json +247 -235
  16. package/dist/assets/v1.3.0/proxy_factory.json +247 -235
  17. package/dist/assets/v1.3.0/sign_message_lib.json +248 -236
  18. package/dist/assets/v1.3.0/simulate_tx_accessor.json +247 -235
  19. package/dist/assets/v1.4.1/compatibility_fallback_handler.json +114 -108
  20. package/dist/assets/v1.4.1/create_call.json +114 -108
  21. package/dist/assets/v1.4.1/multi_send.json +114 -108
  22. package/dist/assets/v1.4.1/multi_send_call_only.json +114 -108
  23. package/dist/assets/v1.4.1/safe.json +114 -108
  24. package/dist/assets/v1.4.1/safe_l2.json +114 -108
  25. package/dist/assets/v1.4.1/safe_proxy_factory.json +115 -109
  26. package/dist/assets/v1.4.1/sign_message_lib.json +115 -109
  27. package/dist/assets/v1.4.1/simulate_tx_accessor.json +114 -108
  28. package/dist/factories.js +4 -1
  29. package/dist/handler.js +6 -5
  30. package/dist/libs.js +4 -12
  31. package/dist/safes.d.ts +3 -3
  32. package/dist/safes.js +6 -4
  33. package/dist/types.d.ts +28 -2
  34. package/dist/types.js +11 -0
  35. package/dist/utils.d.ts +9 -2
  36. package/dist/utils.js +34 -5
  37. package/package.json +15 -17
  38. package/src/__tests__/assets/v1/v1.0.0/gnosis_safe.json +794 -0
  39. package/src/__tests__/assets/v1/v1.0.0/proxy_factory.json +109 -0
  40. package/src/__tests__/assets/v1/v1.1.1/create_and_add_modules.json +57 -0
  41. package/src/__tests__/assets/v1/v1.1.1/create_call.json +88 -0
  42. package/src/__tests__/assets/v1/v1.1.1/default_callback_handler.json +210 -0
  43. package/src/__tests__/assets/v1/v1.1.1/gnosis_safe.json +999 -0
  44. package/src/__tests__/assets/v1/v1.1.1/multi_send.json +43 -0
  45. package/src/__tests__/assets/v1/v1.1.1/proxy_factory.json +189 -0
  46. package/src/__tests__/assets/v1/v1.2.0/gnosis_safe.json +1020 -0
  47. package/src/__tests__/assets/v1/v1.3.0/compatibility_fallback_handler.json +580 -0
  48. package/src/__tests__/assets/v1/v1.3.0/create_call.json +323 -0
  49. package/src/__tests__/assets/v1/v1.3.0/gnosis_safe.json +1288 -0
  50. package/src/__tests__/assets/v1/v1.3.0/gnosis_safe_l2.json +1393 -0
  51. package/src/__tests__/assets/v1/v1.3.0/multi_send.json +275 -0
  52. package/src/__tests__/assets/v1/v1.3.0/multi_send_call_only.json +270 -0
  53. package/src/__tests__/assets/v1/v1.3.0/proxy_factory.json +418 -0
  54. package/src/__tests__/assets/v1/v1.3.0/sign_message_lib.json +302 -0
  55. package/src/__tests__/assets/v1/v1.3.0/simulate_tx_accessor.json +306 -0
  56. package/src/__tests__/assets/v1/v1.4.1/compatibility_fallback_handler.json +445 -0
  57. package/src/__tests__/assets/v1/v1.4.1/create_call.json +190 -0
  58. package/src/__tests__/assets/v1/v1.4.1/multi_send.json +142 -0
  59. package/src/__tests__/assets/v1/v1.4.1/multi_send_call_only.json +137 -0
  60. package/src/__tests__/assets/v1/v1.4.1/safe.json +1121 -0
  61. package/src/__tests__/assets/v1/v1.4.1/safe_l2.json +1226 -0
  62. package/src/__tests__/assets/v1/v1.4.1/safe_proxy_factory.json +261 -0
  63. package/src/__tests__/assets/v1/v1.4.1/sign_message_lib.json +169 -0
  64. package/src/__tests__/assets/v1/v1.4.1/simulate_tx_accessor.json +173 -0
  65. package/src/__tests__/assets.test.ts +101 -38
  66. package/src/__tests__/factories.test.ts +3 -3
  67. package/src/__tests__/handler.test.ts +5 -5
  68. package/src/__tests__/libs.test.ts +9 -9
  69. package/src/__tests__/safes.test.ts +9 -12
  70. package/src/__tests__/utils.test.ts +271 -0
  71. package/src/accessors.ts +5 -7
  72. package/src/assets/v1.0.0/gnosis_safe.json +477 -103
  73. package/src/assets/v1.0.0/proxy_factory.json +9 -6
  74. package/src/assets/v1.1.1/create_and_add_modules.json +17 -10
  75. package/src/assets/v1.1.1/create_call.json +12 -9
  76. package/src/assets/v1.1.1/default_callback_handler.json +12 -9
  77. package/src/assets/v1.1.1/gnosis_safe.json +12 -9
  78. package/src/assets/v1.1.1/multi_send.json +12 -9
  79. package/src/assets/v1.1.1/proxy_factory.json +12 -9
  80. package/src/assets/v1.2.0/gnosis_safe.json +12 -9
  81. package/src/assets/v1.3.0/compatibility_fallback_handler.json +247 -235
  82. package/src/assets/v1.3.0/create_call.json +247 -235
  83. package/src/assets/v1.3.0/gnosis_safe.json +247 -235
  84. package/src/assets/v1.3.0/gnosis_safe_l2.json +247 -235
  85. package/src/assets/v1.3.0/multi_send.json +247 -235
  86. package/src/assets/v1.3.0/multi_send_call_only.json +247 -235
  87. package/src/assets/v1.3.0/proxy_factory.json +247 -235
  88. package/src/assets/v1.3.0/sign_message_lib.json +248 -236
  89. package/src/assets/v1.3.0/simulate_tx_accessor.json +247 -235
  90. package/src/assets/v1.4.1/compatibility_fallback_handler.json +114 -108
  91. package/src/assets/v1.4.1/create_call.json +114 -108
  92. package/src/assets/v1.4.1/multi_send.json +114 -108
  93. package/src/assets/v1.4.1/multi_send_call_only.json +114 -108
  94. package/src/assets/v1.4.1/safe.json +114 -108
  95. package/src/assets/v1.4.1/safe_l2.json +114 -108
  96. package/src/assets/v1.4.1/safe_proxy_factory.json +115 -109
  97. package/src/assets/v1.4.1/sign_message_lib.json +115 -109
  98. package/src/assets/v1.4.1/simulate_tx_accessor.json +114 -108
  99. package/src/factories.ts +14 -11
  100. package/src/handler.ts +24 -21
  101. package/src/index.ts +6 -6
  102. package/src/libs.ts +23 -31
  103. package/src/safes.ts +21 -19
  104. package/src/types.ts +84 -10
  105. package/src/utils.ts +50 -12
  106. package/src/__tests__/utilts.test.ts +0 -385
@@ -1,8 +1,11 @@
1
- import fs from "fs";
2
- import path from "path";
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { SingletonDeploymentJSON } from '../types';
4
+
5
+ const KNOWN_ADDRESS_TYPES = ['canonical', 'eip155', 'zksync'];
3
6
 
4
7
  function assetPath(...paths: string[]) {
5
- return path.join(__dirname, "..", "assets", ...paths);
8
+ return path.join(__dirname, '..', 'assets', ...paths);
6
9
  }
7
10
 
8
11
  function versions() {
@@ -16,67 +19,93 @@ function versionFiles(version: string) {
16
19
  }
17
20
 
18
21
  async function readAsset(version: string, file: string) {
19
- return await fs.promises.readFile(assetPath(version, file), "utf-8");
22
+ return await fs.promises.readFile(assetPath(version, file), 'utf-8');
20
23
  }
21
24
 
22
- async function readAssetJSON(version: string, file: string) {
25
+ async function readAssetJSON(version: string, file: string): Promise<SingletonDeploymentJSON | undefined> {
23
26
  return JSON.parse(await readAsset(version, file));
24
27
  }
25
28
 
26
- describe("assets/", () => {
29
+ describe('assets/', () => {
27
30
  for (const version of versions()) {
28
31
  describe(version, () => {
29
32
  for (const file of versionFiles(version)) {
30
33
  describe(file, () => {
31
- describe("networkAddresses", () => {
32
- it("should be sorted by chain ID", async () => {
34
+ describe('networkAddresses', () => {
35
+ it('should be sorted by chain ID', async () => {
33
36
  // We manually parse the JSON here, since ECMA `JSON.parse` will
34
37
  // always order fields with numeric keys.
35
38
  const json = await readAsset(version, file);
36
- const networkAddresses = json
37
- .replace(
38
- /^[\s\S]*"networkAddresses" *: *\{([^}]*)\}[\s\S]*$/,
39
- "$1"
40
- )
41
- .trim();
42
- const keys = networkAddresses.split(",").map((pair) => {
43
- const [key] = pair.split(":");
44
- return parseInt(key.trim().replace(/^"(.*)"$/, "$1"));
39
+ const networkAddresses = json.replace(/^[\s\S]*"networkAddresses" *: *\{([^}]*)\}[\s\S]*$/, '$1').trim();
40
+ const keys = networkAddresses.split(',').map((pair) => {
41
+ const [key] = pair.split(':');
42
+ return parseInt(key.trim().replace(/^"(.*)"$/, '$1'));
45
43
  });
46
44
  const sorted = [...keys].sort((a, b) => a - b);
47
45
  expect(keys).toEqual(sorted);
48
46
  });
49
47
 
50
- it("should only contain canonical addresses", async () => {
51
- const { networkAddresses } = await readAssetJSON(version, file);
52
- const canonicalAddresses = [
53
- // Ethereum Mainnet address
54
- networkAddresses[1],
55
- // For v1.3.0, support alternate address with different
56
- // `CREATE2` deployer, notably used for Optimism Mainnet
57
- ...(version === "v1.3.0" ? [networkAddresses[10]] : []),
58
- // zkSync Mainnet address
59
- networkAddresses[324],
60
- ].filter((address) => address !== undefined);
61
-
62
- for (const [network, address] of Object.entries(
63
- networkAddresses
64
- )) {
65
- expect(
66
- canonicalAddresses.map((address) => [network, address])
67
- ).toContainEqual([network, address]);
48
+ it('networks should only contain canonical address types', async () => {
49
+ const deploymentJson = await readAssetJSON(version, file);
50
+ if (!deploymentJson) {
51
+ throw new Error(`Failed to read asset ${version}/${file}`);
52
+ }
53
+
54
+ const { networkAddresses, addresses } = deploymentJson;
55
+ const canonicalAddressTypes = Object.keys(addresses);
56
+
57
+ for (const addressType of Object.values(networkAddresses)) {
58
+ if (Array.isArray(addressType)) {
59
+ for (const type of addressType) {
60
+ expect(canonicalAddressTypes).toContain(type);
61
+ }
62
+ } else {
63
+ expect(canonicalAddressTypes).toContain(addressType);
64
+ }
68
65
  }
69
66
  });
70
67
  });
68
+
69
+ it('should only contain known address types', async () => {
70
+ const deploymentJson = await readAssetJSON(version, file);
71
+ if (!deploymentJson) {
72
+ throw new Error(`Failed to read asset ${version}/${file}`);
73
+ }
74
+ const { addresses } = deploymentJson;
75
+
76
+ for (const addressType of Object.keys(addresses)) {
77
+ expect(KNOWN_ADDRESS_TYPES).toContain(addressType);
78
+ }
79
+ });
80
+
81
+ it('no network can contain zksync address together with other address types', async () => {
82
+ const deploymentJson = await readAssetJSON(version, file);
83
+ if (!deploymentJson) {
84
+ throw new Error(`Failed to read asset ${version}/${file}`);
85
+ }
86
+ const { networkAddresses } = deploymentJson;
87
+
88
+ for (const network of Object.keys(networkAddresses)) {
89
+ const addressTypes = networkAddresses[network];
90
+
91
+ if (Array.isArray(addressTypes)) {
92
+ expect(addressTypes).not.toContain('zksync');
93
+ }
94
+ }
95
+ });
71
96
  });
72
97
  }
73
98
 
74
- describe("networkAddresses", () => {
75
- it("should contain the same networks in all files", async () => {
99
+ describe('networkAddresses', () => {
100
+ it('should contain the same networks in all files', async () => {
76
101
  const files = versionFiles(version);
77
102
  const networkCounts: Record<string, number> = {};
78
103
  for (const file of files) {
79
- const { networkAddresses } = await readAssetJSON(version, file);
104
+ const deploymentJson = await readAssetJSON(version, file);
105
+ if (!deploymentJson) {
106
+ throw new Error(`Failed to read asset ${version}/${file}`);
107
+ }
108
+ const { networkAddresses } = deploymentJson;
80
109
  for (const network of Object.keys(networkAddresses)) {
81
110
  networkCounts[network] = (networkCounts[network] ?? 0) + 1;
82
111
  }
@@ -85,6 +114,40 @@ describe("assets/", () => {
85
114
  expect([network, count]).toEqual([network, files.length]);
86
115
  }
87
116
  });
117
+
118
+ it('the address types for a network should be the same in all files', async () => {
119
+ const files = versionFiles(version);
120
+ const networkAddressMap: Record<string, string | string[]> = {};
121
+
122
+ for (const file of files) {
123
+ const deploymentJson = await readAssetJSON(version, file);
124
+ if (!deploymentJson) {
125
+ throw new Error(`Failed to read asset ${version}/${file}`);
126
+ }
127
+ const { networkAddresses } = deploymentJson;
128
+
129
+ for (const [network, addressTypes] of Object.entries(networkAddresses)) {
130
+ if (!networkAddressMap[network]) {
131
+ networkAddressMap[network] = addressTypes;
132
+ } else {
133
+ // We use try/catch here to make the error message more readable.
134
+ // Without it the error message looks like:
135
+ // Expected: "canonical"
136
+ // Actual: ["canonical", "eip155"]
137
+ try {
138
+ expect(addressTypes).toEqual(networkAddressMap[network]);
139
+ } catch (e) {
140
+ console.log(`
141
+ Discrepancy in network ${network}
142
+ Expected: ${networkAddressMap[network]}
143
+ Actual: ${addressTypes}
144
+ `);
145
+ throw e;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ });
88
151
  });
89
152
  });
90
153
  }
@@ -1,12 +1,12 @@
1
- import ProxyFactory130 from '../assets/v1.3.0/proxy_factory.json';
2
- import ProxyFactory141 from '../assets/v1.4.1/safe_proxy_factory.json';
1
+ import ProxyFactory130 from './assets/v1/v1.3.0/proxy_factory.json';
2
+ import ProxyFactory141 from './assets/v1/v1.4.1/safe_proxy_factory.json';
3
3
  import { getProxyFactoryDeployment } from '../factories';
4
4
 
5
5
  describe('factories.ts', () => {
6
6
  describe('getProxyFactoryDeployment', () => {
7
7
  it('should find the latest deployment first', () => {
8
8
  const result = getProxyFactoryDeployment();
9
- expect(result).toBe(ProxyFactory141);
9
+ expect(result).toMatchObject(ProxyFactory141);
10
10
  expect(result).not.toBe(ProxyFactory130);
11
11
  });
12
12
  });
@@ -1,5 +1,5 @@
1
- import DefaultCallbackHandler130 from '../assets/v1.1.1/default_callback_handler.json';
2
- import CompatibilityFallbackHandler141 from '../assets/v1.4.1/compatibility_fallback_handler.json';
1
+ import DefaultCallbackHandler130 from './assets/v1/v1.1.1/default_callback_handler.json';
2
+ import CompatibilityFallbackHandler141 from './assets/v1/v1.4.1/compatibility_fallback_handler.json';
3
3
  import {
4
4
  getDefaultCallbackHandlerDeployment,
5
5
  getCompatibilityFallbackHandlerDeployment,
@@ -10,21 +10,21 @@ describe('handler.ts', () => {
10
10
  describe('getDefaultCallbackHandlerDeployment', () => {
11
11
  it('should find the preferred deployment first', () => {
12
12
  const result = getDefaultCallbackHandlerDeployment();
13
- expect(result).toBe(DefaultCallbackHandler130);
13
+ expect(result).toMatchObject(DefaultCallbackHandler130);
14
14
  });
15
15
  });
16
16
 
17
17
  describe('getCompatibilityFallbackHandlerDeployment', () => {
18
18
  it('should find the preferred deployment first', () => {
19
19
  const result = getCompatibilityFallbackHandlerDeployment();
20
- expect(result).toBe(CompatibilityFallbackHandler141);
20
+ expect(result).toMatchObject(CompatibilityFallbackHandler141);
21
21
  });
22
22
  });
23
23
 
24
24
  describe('getFallbackHandlerDeployment', () => {
25
25
  it('should find the preferred deployment first', () => {
26
26
  const result = getFallbackHandlerDeployment();
27
- expect(result).toBe(CompatibilityFallbackHandler141);
27
+ expect(result).toMatchObject(CompatibilityFallbackHandler141);
28
28
  expect(result).not.toBe(DefaultCallbackHandler130);
29
29
  });
30
30
  });
@@ -1,8 +1,8 @@
1
- import CreateCall141 from '../assets/v1.4.1/create_call.json';
2
- import MultiSend111 from '../assets/v1.1.1/multi_send.json';
3
- import MultiSend141 from '../assets/v1.4.1/multi_send.json';
4
- import MultiSendCallOnly141 from '../assets/v1.4.1/multi_send_call_only.json';
5
- import SignMessageLib141 from '../assets/v1.4.1/sign_message_lib.json';
1
+ import CreateCall141 from './assets/v1/v1.4.1/create_call.json';
2
+ import MultiSend111 from './assets/v1/v1.1.1/multi_send.json';
3
+ import MultiSend141 from './assets/v1/v1.4.1/multi_send.json';
4
+ import MultiSendCallOnly141 from './assets/v1/v1.4.1/multi_send_call_only.json';
5
+ import SignMessageLib141 from './assets/v1/v1.4.1/sign_message_lib.json';
6
6
  import {
7
7
  getMultiSendDeployment,
8
8
  getMultiSendCallOnlyDeployment,
@@ -14,26 +14,26 @@ describe('libs.ts', () => {
14
14
  describe('getMultiSendDeployment', () => {
15
15
  it('should find the preferred deployment first', () => {
16
16
  const result = getMultiSendDeployment();
17
- expect(result).toBe(MultiSend141);
17
+ expect(result).toMatchObject(MultiSend141);
18
18
  expect(result).not.toBe(MultiSend111);
19
19
  });
20
20
  });
21
21
  describe('getMultiSendCallOnlyDeployment', () => {
22
22
  it('should find the preferred deployment first', () => {
23
23
  const result = getMultiSendCallOnlyDeployment();
24
- expect(result).toBe(MultiSendCallOnly141);
24
+ expect(result).toMatchObject(MultiSendCallOnly141);
25
25
  });
26
26
  });
27
27
  describe('getCreateCallDeployment', () => {
28
28
  it('should find the preferred deployment first', () => {
29
29
  const result = getCreateCallDeployment();
30
- expect(result).toBe(CreateCall141);
30
+ expect(result).toMatchObject(CreateCall141);
31
31
  });
32
32
  });
33
33
  describe('getSignMessageLibDeployment', () => {
34
34
  it('should find the preferred deployment first', () => {
35
35
  const result = getSignMessageLibDeployment();
36
- expect(result).toBe(SignMessageLib141);
36
+ expect(result).toMatchObject(SignMessageLib141);
37
37
  });
38
38
  });
39
39
  });
@@ -1,19 +1,16 @@
1
- import SafeL2141 from '../assets/v1.4.1/safe_l2.json';
2
- import Safe141 from '../assets/v1.4.1/safe.json';
3
- import GnosisSafe130 from '../assets/v1.3.0/gnosis_safe.json';
4
- import GnosisSafe120 from '../assets/v1.2.0/gnosis_safe.json';
5
- import GnosisSafe111 from '../assets/v1.1.1/gnosis_safe.json';
6
- import GnosisSafe100 from '../assets/v1.0.0/gnosis_safe.json';
7
- import {
8
- getSafeSingletonDeployment,
9
- getSafeL2SingletonDeployment,
10
- } from '../safes';
1
+ import SafeL2141 from './assets/v1/v1.4.1/safe_l2.json';
2
+ import Safe141 from './assets/v1/v1.4.1/safe.json';
3
+ import GnosisSafe130 from './assets/v1/v1.3.0/gnosis_safe.json';
4
+ import GnosisSafe120 from './assets/v1/v1.2.0/gnosis_safe.json';
5
+ import GnosisSafe111 from './assets/v1/v1.1.1/gnosis_safe.json';
6
+ import GnosisSafe100 from './assets/v1/v1.0.0/gnosis_safe.json';
7
+ import { getSafeSingletonDeployment, getSafeL2SingletonDeployment } from '../safes';
11
8
 
12
9
  describe('safes.ts', () => {
13
10
  describe('getSafeSingletonDeployment', () => {
14
11
  it('should find the latest deployment first', () => {
15
12
  const result = getSafeSingletonDeployment();
16
- expect(result).toBe(Safe141);
13
+ expect(result).toMatchObject(Safe141);
17
14
  [GnosisSafe130, GnosisSafe120, GnosisSafe111, GnosisSafe100].forEach((version) => {
18
15
  expect(result).not.toBe(version);
19
16
  });
@@ -22,7 +19,7 @@ describe('safes.ts', () => {
22
19
  describe('getSafeL2SingletonDeployment', () => {
23
20
  it('should find the latest deployment first', () => {
24
21
  const result = getSafeL2SingletonDeployment();
25
- expect(result).toBe(SafeL2141);
22
+ expect(result).toMatchObject(SafeL2141);
26
23
  });
27
24
  });
28
25
  });
@@ -0,0 +1,271 @@
1
+ import SafeL2141 from './assets/v1/v1.4.1/safe_l2.json';
2
+ import Safe141 from './assets/v1/v1.4.1/safe.json';
3
+
4
+ import GnosisSafeL2130 from './assets/v1/v1.3.0/gnosis_safe_l2.json';
5
+ import GnosisSafe130 from './assets/v1/v1.3.0/gnosis_safe.json';
6
+ import GnosisSafe120 from './assets/v1/v1.2.0/gnosis_safe.json';
7
+ import GnosisSafe111 from './assets/v1/v1.1.1/gnosis_safe.json';
8
+ import GnosisSafe100 from './assets/v1/v1.0.0/gnosis_safe.json';
9
+ import { findDeployment } from '../utils';
10
+ import { _safeDeployments, _safeL2Deployments } from '../safes';
11
+ import { SingletonDeployment, SingletonDeploymentJSON } from '../types';
12
+
13
+ const _safeDeploymentsReverse = [..._safeDeployments].reverse();
14
+
15
+ describe('utils.ts', () => {
16
+ describe('findDeployment', () => {
17
+ it('should filter by released by default', () => {
18
+ const testUnreleasedDeploymentJson: SingletonDeploymentJSON = {
19
+ version: '',
20
+ abi: [],
21
+ addresses: {
22
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
23
+ },
24
+ networkAddresses: { '1': 'canonical' },
25
+ contractName: '',
26
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
27
+ released: false,
28
+ };
29
+ const testReleasedDeploymentJson: SingletonDeploymentJSON = {
30
+ version: '',
31
+ abi: [],
32
+ addresses: {
33
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
34
+ },
35
+ networkAddresses: { '1': 'canonical' },
36
+ contractName: '',
37
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
38
+ released: true, // Default filter value
39
+ };
40
+ const testReleasedDeployment: SingletonDeployment = {
41
+ defaultAddress: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
42
+ addresses: {
43
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
44
+ },
45
+ networkAddresses: { '1': '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef' },
46
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
47
+ released: true,
48
+ abi: [],
49
+ version: '',
50
+ contractName: '',
51
+ };
52
+
53
+ const testDeployments = [testUnreleasedDeploymentJson, testUnreleasedDeploymentJson, testReleasedDeploymentJson];
54
+
55
+ expect(findDeployment(undefined, testDeployments)).toMatchObject(testReleasedDeployment);
56
+
57
+ // should preserve the released flag even if its not explicitly passed
58
+ expect(findDeployment({ network: '1' }, testDeployments)).toMatchObject(testReleasedDeployment);
59
+ });
60
+
61
+ it('should return the correct deployment (filtered by version)', () => {
62
+ // Chronological deployments
63
+ expect(findDeployment({ version: '1.3.0' }, _safeDeployments)).toMatchObject(GnosisSafe130);
64
+ expect(findDeployment({ version: '1.2.0' }, _safeDeployments)).toMatchObject(GnosisSafe120);
65
+ expect(findDeployment({ version: '1.1.1' }, _safeDeployments)).toMatchObject(GnosisSafe111);
66
+ expect(findDeployment({ version: '1.0.0' }, _safeDeployments)).toMatchObject(GnosisSafe100);
67
+ // Incorrect filter:
68
+ expect(findDeployment({ version: '2.0.0' }, _safeDeployments)).toBeUndefined();
69
+
70
+ // L2 deployments
71
+ expect(findDeployment({ version: '1.3.0+L2' }, _safeL2Deployments)).toMatchObject(GnosisSafeL2130);
72
+ // Incorrect filter:
73
+ expect(findDeployment({ version: '2.0.0+L2' }, _safeL2Deployments)).toBeUndefined();
74
+ });
75
+
76
+ it('should return the correct deployment (filtered by released flag)', () => {
77
+ const testUnreleasedDeploymentJson: SingletonDeploymentJSON = {
78
+ version: '',
79
+ abi: [],
80
+ addresses: {
81
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
82
+ },
83
+ networkAddresses: { '1': 'canonical' },
84
+ contractName: '',
85
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
86
+ released: false,
87
+ };
88
+ const testReleasedDeploymentJson: SingletonDeploymentJSON = {
89
+ version: '',
90
+ abi: [],
91
+ addresses: {
92
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
93
+ },
94
+ networkAddresses: { '1': 'canonical' },
95
+ contractName: '',
96
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
97
+ released: true, // Default filter value
98
+ };
99
+ const testUnreleasedDeployment: SingletonDeployment = {
100
+ defaultAddress: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
101
+ addresses: {
102
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
103
+ },
104
+ networkAddresses: { '1': '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef' },
105
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
106
+ released: false,
107
+ abi: [],
108
+ version: '',
109
+ contractName: '',
110
+ };
111
+
112
+ const testDeployments = [testUnreleasedDeploymentJson, testReleasedDeploymentJson];
113
+
114
+ // Chronological deployments
115
+ expect(findDeployment({ released: true }, _safeDeployments)).toMatchObject(Safe141);
116
+
117
+ // Reverse chronological deployments
118
+ expect(findDeployment({ released: true }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe100);
119
+ // Released flag set to false:
120
+ expect(findDeployment({ released: false }, testDeployments)).toMatchObject(testUnreleasedDeployment);
121
+
122
+ // L2 deployments
123
+ expect(findDeployment({ released: true }, _safeL2Deployments)).toMatchObject(SafeL2141);
124
+ });
125
+
126
+ it('should return the correct deployment (filtered by network)', () => {
127
+ // Reverse chronological deployments
128
+ expect(findDeployment({ network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe100);
129
+ expect(findDeployment({ network: '73799' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe111);
130
+ expect(findDeployment({ network: '11297108109' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe130);
131
+ // Incorrect filter:
132
+ expect(findDeployment({ network: '0' }, _safeDeploymentsReverse)).toBeUndefined();
133
+
134
+ // L2 deployments
135
+ expect(findDeployment({ network: '100' }, _safeL2Deployments)).toMatchObject(SafeL2141);
136
+ // Incorrect filter:
137
+ expect(findDeployment({ network: '0' }, _safeL2Deployments)).toBeUndefined();
138
+ });
139
+ it('should return the correct deployment (filtered by version and released)', () => {
140
+ // Chronological deployments
141
+ expect(findDeployment({ version: '1.3.0', released: true }, _safeDeployments)).toMatchObject(GnosisSafe130);
142
+ expect(findDeployment({ version: '1.2.0', released: true }, _safeDeployments)).toMatchObject(GnosisSafe120);
143
+ expect(findDeployment({ version: '1.1.1', released: true }, _safeDeployments)).toMatchObject(GnosisSafe111);
144
+ expect(findDeployment({ version: '1.0.0', released: true }, _safeDeployments)).toMatchObject(GnosisSafe100);
145
+ // Incorrect filter:
146
+ expect(findDeployment({ version: '1.0.0', released: false }, _safeDeployments)).toBeUndefined();
147
+
148
+ // L2 deployments
149
+ expect(findDeployment({ version: '1.3.0', released: true }, _safeL2Deployments)).toMatchObject(GnosisSafeL2130);
150
+ expect(findDeployment({ version: '1.3.0+L2', released: true }, _safeL2Deployments)).toMatchObject(
151
+ GnosisSafeL2130,
152
+ );
153
+ // Incorrect filter:
154
+ expect(findDeployment({ version: '1.3.0+L2', released: false }, _safeL2Deployments)).toBeUndefined();
155
+ });
156
+ it('should return the correct deployment (filtered by version and network)', () => {
157
+ // Reverse chronological deployments
158
+ expect(findDeployment({ version: '1.0.0', network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe100);
159
+ expect(findDeployment({ version: '1.1.1', network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe111);
160
+ expect(findDeployment({ version: '1.2.0', network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe120);
161
+ expect(findDeployment({ version: '1.3.0', network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe130);
162
+ // Incorrect filter:
163
+ expect(findDeployment({ version: '1.3.0', network: '0' }, _safeDeploymentsReverse)).toBeUndefined();
164
+
165
+ // L2 deployments
166
+ expect(findDeployment({ version: '1.3.0', network: '100' }, _safeL2Deployments)).toMatchObject(GnosisSafeL2130);
167
+ expect(findDeployment({ version: '1.3.0+L2', network: '100' }, _safeL2Deployments)).toMatchObject(
168
+ GnosisSafeL2130,
169
+ );
170
+ // Incorrect filter:
171
+ expect(findDeployment({ version: '1.3.0+L2', network: '0' }, _safeL2Deployments)).toBeUndefined();
172
+ });
173
+ it('should return the correct deployment (filtered by released and network)', () => {
174
+ const testUnreleasedDeploymentJson: SingletonDeploymentJSON = {
175
+ version: '',
176
+ abi: [],
177
+ addresses: {
178
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
179
+ },
180
+ networkAddresses: { '1': 'canonical' },
181
+ contractName: '',
182
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
183
+ released: false,
184
+ };
185
+ const testReleasedDeploymentJson: SingletonDeploymentJSON = {
186
+ version: '',
187
+ abi: [],
188
+ addresses: {
189
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
190
+ },
191
+ networkAddresses: { '1': 'canonical' },
192
+ contractName: '',
193
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
194
+ released: true, // Default filter value
195
+ };
196
+ const testUnreleasedDeployment: SingletonDeployment = {
197
+ defaultAddress: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
198
+ addresses: {
199
+ canonical: '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef',
200
+ },
201
+ networkAddresses: { '1': '0xbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef' },
202
+ codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
203
+ released: false,
204
+ abi: [],
205
+ version: '',
206
+ contractName: '',
207
+ };
208
+
209
+ const testDeployments = [testUnreleasedDeploymentJson, testUnreleasedDeploymentJson, testReleasedDeploymentJson];
210
+
211
+ // Reverse chronological deployments
212
+ expect(findDeployment({ released: true, network: '1' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe100);
213
+ expect(findDeployment({ released: true, network: '246' }, _safeDeploymentsReverse)).toMatchObject(GnosisSafe111);
214
+ expect(findDeployment({ released: true, network: '11297108109' }, _safeDeploymentsReverse)).toMatchObject(
215
+ GnosisSafe130,
216
+ );
217
+ // Incorrect filter:
218
+ expect(findDeployment({ released: true, network: '0' }, _safeDeploymentsReverse)).toBeUndefined();
219
+ expect(findDeployment({ released: false, network: '1' }, testDeployments)).toMatchObject(
220
+ testUnreleasedDeployment,
221
+ );
222
+
223
+ // L2 deployments
224
+ expect(findDeployment({ released: true, network: '100' }, _safeL2Deployments)).toMatchObject(SafeL2141);
225
+ // Incorrect filter:
226
+ expect(findDeployment({ released: true, network: '0' }, _safeL2Deployments)).toBeUndefined();
227
+ expect(findDeployment({ released: false, network: '100' }, testDeployments)).toBeUndefined();
228
+ });
229
+ it('should return the correct deployment (filtered by version, released and network)', () => {
230
+ // Reverse chronological deployments
231
+ expect(findDeployment({ version: '1.0.0', released: true, network: '1' }, _safeDeploymentsReverse)).toMatchObject(
232
+ GnosisSafe100,
233
+ );
234
+ expect(
235
+ findDeployment({ version: '1.1.1', released: true, network: '246' }, _safeDeploymentsReverse),
236
+ ).toMatchObject(GnosisSafe111);
237
+ expect(
238
+ findDeployment({ version: '1.2.0', released: true, network: '73799' }, _safeDeploymentsReverse),
239
+ ).toMatchObject(GnosisSafe120);
240
+ expect(
241
+ findDeployment({ version: '1.3.0', released: true, network: '11297108109' }, _safeDeploymentsReverse),
242
+ ).toMatchObject(GnosisSafe130);
243
+ // Incorrect filter:
244
+ expect(
245
+ findDeployment({ version: '1.3.0', released: false, network: '11297108109' }, _safeDeploymentsReverse),
246
+ ).toBeUndefined();
247
+ expect(
248
+ findDeployment({ version: '1.3.0', released: true, network: '0' }, _safeDeploymentsReverse),
249
+ ).toBeUndefined();
250
+ expect(
251
+ findDeployment({ version: '2.0.0', released: true, network: '11297108109' }, _safeDeploymentsReverse),
252
+ ).toBeUndefined();
253
+
254
+ // L2 deployments
255
+ expect(findDeployment({ version: '1.3.0', released: true, network: '100' }, _safeL2Deployments)).toMatchObject(
256
+ GnosisSafeL2130,
257
+ );
258
+ expect(findDeployment({ version: '1.3.0+L2', released: true, network: '100' }, _safeL2Deployments)).toMatchObject(
259
+ GnosisSafeL2130,
260
+ );
261
+ // Incorrect filter:
262
+ expect(
263
+ findDeployment({ version: '1.3.0+L2', released: false, network: '100' }, _safeL2Deployments),
264
+ ).toBeUndefined();
265
+ expect(findDeployment({ version: '1.3.0+L2', released: true, network: '0' }, _safeL2Deployments)).toBeUndefined();
266
+ expect(
267
+ findDeployment({ version: '2.0.0+L2', released: true, network: '100' }, _safeL2Deployments),
268
+ ).toBeUndefined();
269
+ });
270
+ });
271
+ });
package/src/accessors.ts CHANGED
@@ -1,14 +1,12 @@
1
1
  import SimulateTxAccessor130 from './assets/v1.3.0/simulate_tx_accessor.json';
2
2
  import SimulateTxAccessor141 from './assets/v1.4.1/simulate_tx_accessor.json';
3
3
 
4
- import { DeploymentFilter, SingletonDeployment } from './types'
5
- import { findDeployment } from './utils'
4
+ import { DeploymentFilter, SingletonDeploymentJSON, SingletonDeployment } from './types';
5
+ import { findDeployment } from './utils';
6
6
 
7
7
  // This is a sorted array (newest to oldest)
8
- const accessorDeployments: SingletonDeployment[] = [
9
- SimulateTxAccessor141, SimulateTxAccessor130
10
- ]
8
+ const accessorDeployments: SingletonDeploymentJSON[] = [SimulateTxAccessor141, SimulateTxAccessor130];
11
9
 
12
10
  export const getSimulateTxAccessorDeployment = (filter?: DeploymentFilter): SingletonDeployment | undefined => {
13
- return findDeployment(filter, accessorDeployments)
14
- }
11
+ return findDeployment(filter, accessorDeployments);
12
+ };