Skip to content

Commit 35ec036

Browse files
authored
Add private network support (#39)
* Add private network support * Change model type * fix example * fix config * Fix config for update * Fix update mapping
1 parent 4c261ed commit 35ec036

File tree

38 files changed

+1390
-100
lines changed

38 files changed

+1390
-100
lines changed

examples/defender-test-project/serverless.yml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,34 @@ resources:
213213
forked-networks:
214214
mainnet-fork:
215215
name: mainnet-fork # restricted to alphanumeric characters and dashes (no whitespaces)
216-
forked-network: mainnet # must be of type SupportedNetwork
216+
supported-network: mainnet # must be of type SupportedNetwork
217217
rpc-url: https://rpc.phalcon.xyz/rpc_123
218218
# optional
219219
block-explorer-url: https://scan.phalcon.xyz/fork_123
220220
# optional
221221
api-key: null
222222

223+
private-networks:
224+
my-network:
225+
name: my-private-network # restricted to alphanumeric characters and dashes (no whitespaces)
226+
rpc-url: https://rpc.kaleido.io/
227+
# optional
228+
block-explorer-url: null
229+
# optional
230+
api-key: null
231+
configuration:
232+
symbol: ETH
233+
# optional
234+
safe-contracts:
235+
master: '0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552'
236+
proxy-factory: '0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2'
237+
multi-send-call-only: '0x40A2aCCbd92BCA938b02010E17A5b8929b49130D'
238+
create-call: '0x762fcF49C5EF21510755191BbeD6AA2a702f0348'
239+
# optional
240+
subgraph-url: null
241+
# optional
242+
eips:
243+
isEIP1559: true
244+
223245
plugins:
224246
- '@openzeppelin/defender-as-code'

src/cmd/deploy.ts

Lines changed: 199 additions & 21 deletions
Large diffs are not rendered by default.

src/cmd/info.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
TeamKey,
3030
YSecret,
3131
Resources,
32-
DefenderForkedNetwork,
32+
DefenderTenantNetwork,
3333
} from '../types';
3434
import {
3535
Action,
@@ -39,6 +39,7 @@ import {
3939
Notification,
4040
Category,
4141
ForkedNetworkRequest,
42+
PrivateNetworkRequest,
4243
} from '../types/types/resources.schema';
4344

4445
export default class DefenderInfo {
@@ -121,20 +122,33 @@ export default class DefenderInfo {
121122
categories: [],
122123
secrets: [],
123124
forkedNetworks: [],
125+
privateNetworks: [],
124126
};
125127

126128
// Forked Networks
127129
const listForkedNetworks = () => getNetworkClient(this.teamKey!).listForkedNetworks();
128130

129-
await this.wrapper<ForkedNetworkRequest, DefenderForkedNetwork>(
131+
await this.wrapper<ForkedNetworkRequest, DefenderTenantNetwork>(
130132
this.serverless,
131133
'Forked Networks',
132134
removeDefenderIdReferences(this.resources?.['forked-networks']),
133135
listForkedNetworks,
134-
(resource: DefenderForkedNetwork) => `${resource.stackResourceId}: ${resource.forkedNetworkId}`,
136+
(resource: DefenderTenantNetwork) => `${resource.stackResourceId}: ${resource.tenantNetworkId}`,
135137
stdOut.forkedNetworks,
136138
);
137139

140+
// Private Networks
141+
const listPrivateNetworks = () => getNetworkClient(this.teamKey!).listPrivateNetworks();
142+
143+
await this.wrapper<PrivateNetworkRequest, DefenderTenantNetwork>(
144+
this.serverless,
145+
'Private Networks',
146+
removeDefenderIdReferences(this.resources?.['private-networks']),
147+
listPrivateNetworks,
148+
(resource: DefenderTenantNetwork) => `${resource.stackResourceId}: ${resource.tenantNetworkId}`,
149+
stdOut.privateNetworks,
150+
);
151+
138152
// Monitors
139153
const listMonitors = () =>
140154
getMonitorClient(this.teamKey!)

src/cmd/remove.ts

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import {
3030
TeamKey,
3131
YSecret,
3232
Resources,
33-
DefenderForkedNetwork,
33+
DefenderTenantNetwork,
3434
} from '../types';
3535
import {
3636
Action,
@@ -39,6 +39,7 @@ import {
3939
Relayer,
4040
Notification,
4141
ForkedNetworkRequest,
42+
PrivateNetworkRequest,
4243
} from '../types/types/resources.schema';
4344

4445
export default class DefenderRemove {
@@ -131,7 +132,8 @@ export default class DefenderRemove {
131132
notifications: DefenderNotification[];
132133
categories: DefenderCategory[];
133134
secrets: string[];
134-
forkedNetworks: DefenderForkedNetwork[];
135+
forkedNetworks: DefenderTenantNetwork[];
136+
privateNetworks: DefenderTenantNetwork[];
135137
} = {
136138
stack: stackName,
137139
monitors: [],
@@ -142,31 +144,55 @@ export default class DefenderRemove {
142144
categories: [],
143145
secrets: [],
144146
forkedNetworks: [],
147+
privateNetworks: [],
145148
};
146149

147150
// Forked Networks
148151
const forkedNetworkClient = getNetworkClient(this.teamKey!);
149152
const listForkedNetworks = () => forkedNetworkClient.listForkedNetworks();
150-
await this.wrapper<ForkedNetworkRequest, DefenderForkedNetwork>(
153+
await this.wrapper<ForkedNetworkRequest, DefenderTenantNetwork>(
151154
this.serverless,
152155
'Forked Networks',
153156
removeDefenderIdReferences(this.resources?.['forked-networks']),
154157
listForkedNetworks,
155-
async (forkedNetworks: DefenderForkedNetwork[]) => {
158+
async (forkedNetworks: DefenderTenantNetwork[]) => {
156159
await Promise.all(
157160
forkedNetworks.map(async (e) => {
158161
this.log.progress(
159162
'component-remove-extra',
160-
`Removing ${e.stackResourceId} (${e.forkedNetworkId}) from Defender`,
163+
`Removing ${e.stackResourceId} (${e.tenantNetworkId}) from Defender`,
161164
);
162-
await forkedNetworkClient.deleteForkedNetwork(e.forkedNetworkId);
163-
this.log.success(`Removed ${e.stackResourceId} (${e.forkedNetworkId})`);
165+
await forkedNetworkClient.deleteForkedNetwork(e.tenantNetworkId);
166+
this.log.success(`Removed ${e.stackResourceId} (${e.tenantNetworkId})`);
164167
}),
165168
);
166169
},
167170
stdOut.forkedNetworks,
168171
);
169172

173+
// Private Networks
174+
const privateNetworkClient = getNetworkClient(this.teamKey!);
175+
const listPrivateNetworks = () => privateNetworkClient.listPrivateNetworks();
176+
await this.wrapper<PrivateNetworkRequest, DefenderTenantNetwork>(
177+
this.serverless,
178+
'Private Networks',
179+
removeDefenderIdReferences(this.resources?.['private-networks']),
180+
listPrivateNetworks,
181+
async (privateNetworks: DefenderTenantNetwork[]) => {
182+
await Promise.all(
183+
privateNetworks.map(async (e) => {
184+
this.log.progress(
185+
'component-remove-extra',
186+
`Removing ${e.stackResourceId} (${e.tenantNetworkId}) from Defender`,
187+
);
188+
await privateNetworkClient.deletePrivateNetwork(e.tenantNetworkId);
189+
this.log.success(`Removed ${e.stackResourceId} (${e.tenantNetworkId})`);
190+
}),
191+
);
192+
},
193+
stdOut.privateNetworks,
194+
);
195+
170196
// Monitors
171197
const monitorClient = getMonitorClient(this.teamKey!);
172198
const listMonitors = () => monitorClient.list().then((i) => i.items);

src/types/docs-schemas/definitions.schema.json

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
"type": "string",
6969
"enum": ["x-dfk-avax-chain", "x-dfk-avax-chain-test", "x-security-alliance"]
7070
},
71-
"forked-network": {
72-
"title": "ForkedNetwork",
71+
"tenant-network": {
72+
"title": "TenantNetwork",
7373
"type": "string"
7474
},
7575
"network": {
@@ -79,7 +79,7 @@
7979
"$ref": "definitions.schema.json#/definitions/supported-network"
8080
},
8181
{
82-
"$ref": "definitions.schema.json#/definitions/forked-network"
82+
"$ref": "definitions.schema.json#/definitions/tenant-network"
8383
}
8484
]
8585
},
@@ -610,6 +610,17 @@
610610
{ "type": "string", "$ref": "definitions.schema.json#/definitions/defender-id", "format": "uri-reference" }
611611
]
612612
},
613+
"private-network-or-defender-id": {
614+
"title": "PrivateNetworkOrDefenderID",
615+
"anyOf": [
616+
{
617+
"type": "object",
618+
"$ref": "definitions.schema.json#/definitions/private-network-request",
619+
"format": "uri-reference"
620+
},
621+
{ "type": "string", "$ref": "definitions.schema.json#/definitions/defender-id", "format": "uri-reference" }
622+
]
623+
},
613624
"block-explorer-api-key-or-defender-id": {
614625
"title": "BlockExplorerApiKeyOrDefenderID",
615626
"anyOf": [
@@ -725,17 +736,93 @@
725736
{ "title": "ArrayABI", "type": "array" }
726737
]
727738
},
739+
"safe-contracts": {
740+
"title": "SafeContracts",
741+
"type": "object",
742+
"additionalProperties": false,
743+
"required": ["master", "proxy-factory", "multi-send-call-only"],
744+
"properties": {
745+
"master": {
746+
"$ref": "definitions.schema.json#/definitions/address",
747+
"format": "uri-reference"
748+
},
749+
"proxy-factory": {
750+
"$ref": "definitions.schema.json#/definitions/address",
751+
"format": "uri-reference"
752+
},
753+
"multi-send-call-only": {
754+
"$ref": "definitions.schema.json#/definitions/address",
755+
"format": "uri-reference"
756+
},
757+
"create-call": {
758+
"$ref": "definitions.schema.json#/definitions/address",
759+
"format": "uri-reference"
760+
}
761+
}
762+
},
763+
"tenant-network-eip-configuration": {
764+
"title": "TenantNetworkEIPConfiguration",
765+
"type": "object",
766+
"additionalProperties": false,
767+
"properties": {
768+
"isEIP1559": {
769+
"type": "boolean"
770+
}
771+
}
772+
},
773+
"tenant-network-configuration": {
774+
"title": "TenantNetworkConfiguration",
775+
"type": "object",
776+
"additionalProperties": false,
777+
"required": ["symbol"],
778+
"properties": {
779+
"symbol": {
780+
"type": "string",
781+
"minLength": 3,
782+
"maxLength": 6
783+
},
784+
"eips": {
785+
"$ref": "definitions.schema.json#/definitions/tenant-network-eip-configuration"
786+
},
787+
"safe-contracts": {
788+
"$ref": "definitions.schema.json#/definitions/safe-contracts"
789+
},
790+
"subgraph-url": {
791+
"type": "string",
792+
"pattern": "^(http(s)?://)[\\w.-]+(?:\\.[\\w\\.-]+)+[\\w\\-\\._~:/?#[\\]@!\\$&'\\(\\)\\*\\+,;=.]+$"
793+
}
794+
}
795+
},
728796
"forked-network-request": {
729797
"title": "ForkedNetworkRequest",
730798
"type": "object",
731799
"additionalProperties": false,
732-
"required": ["name", "forked-network", "rpc-url"],
800+
"required": ["name", "supported-network", "rpc-url"],
733801
"properties": {
734-
"name": { "$ref": "definitions.schema.json#/definitions/forked-network" },
735-
"forked-network": { "$ref": "definitions.schema.json#/definitions/supported-network" },
802+
"name": { "$ref": "definitions.schema.json#/definitions/tenant-network" },
803+
"supported-network": { "$ref": "definitions.schema.json#/definitions/supported-network" },
736804
"rpc-url": {
805+
"type": "string",
806+
"pattern": "^(http|https)://"
807+
},
808+
"api-key": { "type": "string" },
809+
"block-explorer-url": {
737810
"type": "string",
738811
"pattern": "^(http(s)?://)[\\w.-]+(?:\\.[\\w\\.-]+)+[\\w\\-\\._~:/?#[\\]@!\\$&'\\(\\)\\*\\+,;=.]+$"
812+
}
813+
}
814+
},
815+
"private-network-request": {
816+
"title": "PrivateNetworkRequest",
817+
"type": "object",
818+
"additionalProperties": false,
819+
"required": ["name", "configuration", "rpc-url"],
820+
"properties": {
821+
"name": { "$ref": "definitions.schema.json#/definitions/tenant-network" },
822+
"configuration": { "$ref": "definitions.schema.json#/definitions/tenant-network-configuration" },
823+
"rpc-url": {
824+
"type": "string",
825+
"pattern": "^(http|https)://"
739826
},
740827
"api-key": { "type": "string" },
741828
"block-explorer-url": {

src/types/docs-schemas/resources.schema.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@
8585
"$ref": "definitions.schema.json#/definitions/forked-network-or-defender-id",
8686
"format": "uri-reference"
8787
}
88+
},
89+
"private-networks": {
90+
"title": "Private Networks",
91+
"type": "object",
92+
"additionalProperties": {
93+
"$ref": "definitions.schema.json#/definitions/private-network-or-defender-id",
94+
"format": "uri-reference"
95+
}
8896
}
8997
}
9098
}

src/types/docs/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,24 @@
8282

8383
* [Policy](./definitions-definitions-policy.md)`definitions.schema.json#/definitions/policy`
8484

85+
* [Private Networks](./resources-properties-private-networks.md)`resources.schema.json#/properties/private-networks`
86+
87+
* [PrivateNetworkRequest](./definitions-definitions-privatenetworkrequest.md)`definitions.schema.json#/definitions/private-network-request`
88+
8589
* [Relayer](./definitions-definitions-relayer.md)`definitions.schema.json#/definitions/relayer`
8690

8791
* [Relayers](./resources-properties-relayers.md)`resources.schema.json#/properties/relayers`
8892

93+
* [SafeContracts](./definitions-definitions-safecontracts.md)`definitions.schema.json#/definitions/safe-contracts`
94+
8995
* [StackSecrets](./resources-properties-actionsecrets-properties-stacksecrets.md)`resources.schema.json#/properties/secrets/properties/stack`
9096

9197
* [TelegramConfig](./definitions-definitions-telegramconfig.md)`definitions.schema.json#/definitions/telegramBotConfig`
9298

99+
* [TenantNetworkConfiguration](./definitions-definitions-tenantnetworkconfiguration.md)`definitions.schema.json#/definitions/tenant-network-configuration`
100+
101+
* [TenantNetworkEIPConfiguration](./definitions-definitions-tenantnetworkeipconfiguration.md)`definitions.schema.json#/definitions/tenant-network-eip-configuration`
102+
93103
* [Trigger](./definitions-definitions-action-properties-trigger.md)`definitions.schema.json#/definitions/action/properties/trigger`
94104

95105
* [Untitled object in Definitions](./definitions-definitions-relayer-properties-addressfromrelayer-anyof-0.md)`definitions.schema.json#/definitions/relayer/properties/address-from-relayer/anyOf/0`

src/types/docs/definitions-definitions-address.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
## items Type
1+
## create-call Type
22

33
`string` ([Address](definitions-definitions-address.md))
44

5-
## items Constraints
5+
## create-call Constraints
66

77
**pattern**: the string must match the following regular expression:&#x20;
88

src/types/docs/definitions-definitions-blockexplorerapikey.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ any of
5353

5454
* [CustomNetwork](definitions-definitions-customnetwork.md "check type definition")
5555

56-
* [ForkedNetwork](definitions-definitions-forkednetwork.md "check type definition")
56+
* [TenantNetwork](definitions-definitions-tenantnetwork.md "check type definition")
5757

5858
### network Constraints
5959

src/types/docs/definitions-definitions-blockmonitor.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ any of
9696

9797
* [CustomNetwork](definitions-definitions-customnetwork.md "check type definition")
9898

99-
* [ForkedNetwork](definitions-definitions-forkednetwork.md "check type definition")
99+
* [TenantNetwork](definitions-definitions-tenantnetwork.md "check type definition")
100100

101101
### network Constraints
102102

src/types/docs/definitions-definitions-contract.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ any of
9090

9191
* [CustomNetwork](definitions-definitions-customnetwork.md "check type definition")
9292

93-
* [ForkedNetwork](definitions-definitions-forkednetwork.md "check type definition")
93+
* [TenantNetwork](definitions-definitions-tenantnetwork.md "check type definition")
9494

9595
### network Constraints
9696

src/types/docs/definitions-definitions-forkednetwork.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)