@safe-global/safe-deployments 1.36.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 -222
  11. package/dist/assets/v1.3.0/create_call.json +247 -222
  12. package/dist/assets/v1.3.0/gnosis_safe.json +247 -222
  13. package/dist/assets/v1.3.0/gnosis_safe_l2.json +247 -222
  14. package/dist/assets/v1.3.0/multi_send.json +247 -222
  15. package/dist/assets/v1.3.0/multi_send_call_only.json +247 -222
  16. package/dist/assets/v1.3.0/proxy_factory.json +247 -222
  17. package/dist/assets/v1.3.0/sign_message_lib.json +248 -223
  18. package/dist/assets/v1.3.0/simulate_tx_accessor.json +247 -222
  19. package/dist/assets/v1.4.1/compatibility_fallback_handler.json +114 -41
  20. package/dist/assets/v1.4.1/create_call.json +114 -41
  21. package/dist/assets/v1.4.1/multi_send.json +114 -41
  22. package/dist/assets/v1.4.1/multi_send_call_only.json +114 -41
  23. package/dist/assets/v1.4.1/safe.json +114 -41
  24. package/dist/assets/v1.4.1/safe_l2.json +114 -41
  25. package/dist/assets/v1.4.1/safe_proxy_factory.json +115 -42
  26. package/dist/assets/v1.4.1/sign_message_lib.json +115 -42
  27. package/dist/assets/v1.4.1/simulate_tx_accessor.json +114 -41
  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 -222
  82. package/src/assets/v1.3.0/create_call.json +247 -222
  83. package/src/assets/v1.3.0/gnosis_safe.json +247 -222
  84. package/src/assets/v1.3.0/gnosis_safe_l2.json +247 -222
  85. package/src/assets/v1.3.0/multi_send.json +247 -222
  86. package/src/assets/v1.3.0/multi_send_call_only.json +247 -222
  87. package/src/assets/v1.3.0/proxy_factory.json +247 -222
  88. package/src/assets/v1.3.0/sign_message_lib.json +248 -223
  89. package/src/assets/v1.3.0/simulate_tx_accessor.json +247 -222
  90. package/src/assets/v1.4.1/compatibility_fallback_handler.json +115 -42
  91. package/src/assets/v1.4.1/create_call.json +115 -42
  92. package/src/assets/v1.4.1/multi_send.json +115 -42
  93. package/src/assets/v1.4.1/multi_send_call_only.json +115 -42
  94. package/src/assets/v1.4.1/safe.json +115 -42
  95. package/src/assets/v1.4.1/safe_l2.json +115 -42
  96. package/src/assets/v1.4.1/safe_proxy_factory.json +116 -43
  97. package/src/assets/v1.4.1/sign_message_lib.json +116 -43
  98. package/src/assets/v1.4.1/simulate_tx_accessor.json +115 -42
  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
+ };