@lidofinance/lsv-cli 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (211) hide show
  1. package/README.md +542 -1
  2. package/dist/abi/CLProofVerifier.js +279 -0
  3. package/dist/abi/CLProofVerifier.js.map +1 -0
  4. package/dist/abi/Dashboard.js +1498 -0
  5. package/dist/abi/Dashboard.js.map +1 -0
  6. package/dist/abi/Delegation.js +1786 -0
  7. package/dist/abi/Delegation.js.map +1 -0
  8. package/dist/abi/LidoLocator.js +426 -0
  9. package/dist/abi/LidoLocator.js.map +1 -0
  10. package/dist/abi/PredepositGuarantee.js +1733 -0
  11. package/dist/abi/PredepositGuarantee.js.map +1 -0
  12. package/dist/abi/StEth.js +493 -0
  13. package/dist/abi/StEth.js.map +1 -0
  14. package/dist/abi/StakingVault.js +978 -0
  15. package/dist/abi/StakingVault.js.map +1 -0
  16. package/dist/abi/TokenManager.js +756 -0
  17. package/dist/abi/TokenManager.js.map +1 -0
  18. package/dist/abi/VaultFactory.js +246 -0
  19. package/dist/abi/VaultFactory.js.map +1 -0
  20. package/dist/abi/VaultHub.js +1138 -439
  21. package/dist/abi/VaultHub.js.map +1 -1
  22. package/dist/abi/VaultHubViewer.js +297 -0
  23. package/dist/abi/VaultHubViewer.js.map +1 -0
  24. package/dist/abi/Voting.js +884 -0
  25. package/dist/abi/Voting.js.map +1 -0
  26. package/dist/abi/index.js +13 -0
  27. package/dist/abi/index.js.map +1 -0
  28. package/dist/command/index.js +4 -5
  29. package/dist/command/index.js.map +1 -1
  30. package/dist/configs/constants.js +3 -0
  31. package/dist/configs/constants.js.map +1 -0
  32. package/dist/configs/deployed.js +114 -53
  33. package/dist/configs/deployed.js.map +1 -1
  34. package/dist/configs/envs.js +10 -28
  35. package/dist/configs/envs.js.map +1 -1
  36. package/dist/configs/index.js +3 -18
  37. package/dist/configs/index.js.map +1 -1
  38. package/dist/configs/utils.js +26 -0
  39. package/dist/configs/utils.js.map +1 -0
  40. package/dist/contracts/clProofVerifier.js +29 -0
  41. package/dist/contracts/clProofVerifier.js.map +1 -0
  42. package/dist/contracts/dashboard.js +11 -0
  43. package/dist/contracts/dashboard.js.map +1 -0
  44. package/dist/contracts/delegation.js +11 -0
  45. package/dist/contracts/delegation.js.map +1 -0
  46. package/dist/contracts/index.js +12 -17
  47. package/dist/contracts/index.js.map +1 -1
  48. package/dist/contracts/locator.js +16 -0
  49. package/dist/contracts/locator.js.map +1 -0
  50. package/dist/contracts/pdg.js +17 -0
  51. package/dist/contracts/pdg.js.map +1 -0
  52. package/dist/contracts/steth.js +15 -0
  53. package/dist/contracts/steth.js.map +1 -0
  54. package/dist/contracts/token-manager.js +16 -0
  55. package/dist/contracts/token-manager.js.map +1 -0
  56. package/dist/contracts/vault-factory.js +14 -0
  57. package/dist/contracts/vault-factory.js.map +1 -0
  58. package/dist/contracts/vault-hub-viewer.js +14 -0
  59. package/dist/contracts/vault-hub-viewer.js.map +1 -0
  60. package/dist/contracts/vault-hub.js +14 -17
  61. package/dist/contracts/vault-hub.js.map +1 -1
  62. package/dist/contracts/vault.js +14 -0
  63. package/dist/contracts/vault.js.map +1 -0
  64. package/dist/contracts/voting.js +18 -0
  65. package/dist/contracts/voting.js.map +1 -0
  66. package/dist/features/advanced-config.js +16 -0
  67. package/dist/features/advanced-config.js.map +1 -0
  68. package/dist/features/dashboard-delegation.js +25 -0
  69. package/dist/features/dashboard-delegation.js.map +1 -0
  70. package/dist/features/index.js +5 -0
  71. package/dist/features/index.js.map +1 -0
  72. package/dist/features/token-manager.js +7 -0
  73. package/dist/features/token-manager.js.map +1 -0
  74. package/dist/features/vault-factory.js +25 -0
  75. package/dist/features/vault-factory.js.map +1 -0
  76. package/dist/features/voting.js +125 -0
  77. package/dist/features/voting.js.map +1 -0
  78. package/dist/index.js +6 -5
  79. package/dist/index.js.map +1 -1
  80. package/dist/programs/account.js +29 -0
  81. package/dist/programs/account.js.map +1 -0
  82. package/dist/programs/config.js +31 -0
  83. package/dist/programs/config.js.map +1 -0
  84. package/dist/programs/dashboard/config.js +65 -0
  85. package/dist/programs/dashboard/config.js.map +1 -0
  86. package/dist/programs/dashboard/index.js +4 -0
  87. package/dist/programs/dashboard/index.js.map +1 -0
  88. package/dist/programs/dashboard/main.js +12 -0
  89. package/dist/programs/dashboard/main.js.map +1 -0
  90. package/dist/programs/dashboard/read.js +25 -0
  91. package/dist/programs/dashboard/read.js.map +1 -0
  92. package/dist/programs/dashboard/write.js +302 -0
  93. package/dist/programs/dashboard/write.js.map +1 -0
  94. package/dist/programs/delegation/config.js +33 -0
  95. package/dist/programs/delegation/config.js.map +1 -0
  96. package/dist/programs/delegation/index.js +4 -0
  97. package/dist/programs/delegation/index.js.map +1 -0
  98. package/dist/programs/delegation/main.js +12 -0
  99. package/dist/programs/delegation/main.js.map +1 -0
  100. package/dist/programs/delegation/read.js +98 -0
  101. package/dist/programs/delegation/read.js.map +1 -0
  102. package/dist/programs/delegation/write.js +327 -0
  103. package/dist/programs/delegation/write.js.map +1 -0
  104. package/dist/programs/hub/config.js +127 -0
  105. package/dist/programs/hub/config.js.map +1 -0
  106. package/dist/programs/hub/index.js +4 -0
  107. package/dist/programs/hub/index.js.map +1 -0
  108. package/dist/programs/hub/main.js +12 -0
  109. package/dist/programs/hub/main.js.map +1 -0
  110. package/dist/programs/hub/read.js +62 -0
  111. package/dist/programs/hub/read.js.map +1 -0
  112. package/dist/programs/hub/write.js +109 -0
  113. package/dist/programs/hub/write.js.map +1 -0
  114. package/dist/programs/index.js +10 -17
  115. package/dist/programs/index.js.map +1 -1
  116. package/dist/programs/pdg/config.js +97 -0
  117. package/dist/programs/pdg/config.js.map +1 -0
  118. package/dist/programs/pdg/index.js +4 -0
  119. package/dist/programs/pdg/index.js.map +1 -0
  120. package/dist/programs/pdg/main.js +12 -0
  121. package/dist/programs/pdg/main.js.map +1 -0
  122. package/dist/programs/pdg/read.js +7 -0
  123. package/dist/programs/pdg/read.js.map +1 -0
  124. package/dist/programs/pdg/write.js +114 -0
  125. package/dist/programs/pdg/write.js.map +1 -0
  126. package/dist/programs/pdg-helpers.js +73 -0
  127. package/dist/programs/pdg-helpers.js.map +1 -0
  128. package/dist/programs/vault/config.js +66 -0
  129. package/dist/programs/vault/config.js.map +1 -0
  130. package/dist/programs/vault/index.js +4 -0
  131. package/dist/programs/vault/index.js.map +1 -0
  132. package/dist/programs/vault/main.js +10 -0
  133. package/dist/programs/vault/main.js.map +1 -0
  134. package/dist/programs/vault/read.js +53 -0
  135. package/dist/programs/vault/read.js.map +1 -0
  136. package/dist/programs/vault/write.js +123 -0
  137. package/dist/programs/vault/write.js.map +1 -0
  138. package/dist/programs/vault-factory/config.js +2 -0
  139. package/dist/programs/vault-factory/config.js.map +1 -0
  140. package/dist/programs/vault-factory/index.js +4 -0
  141. package/dist/programs/vault-factory/index.js.map +1 -0
  142. package/dist/programs/vault-factory/main.js +12 -0
  143. package/dist/programs/vault-factory/main.js.map +1 -0
  144. package/dist/programs/vault-factory/read.js +26 -0
  145. package/dist/programs/vault-factory/read.js.map +1 -0
  146. package/dist/programs/vault-factory/write.js +110 -0
  147. package/dist/programs/vault-factory/write.js.map +1 -0
  148. package/dist/programs/vault-hub-viewer.js +52 -0
  149. package/dist/programs/vault-hub-viewer.js.map +1 -0
  150. package/dist/programs/voting.js +33 -0
  151. package/dist/programs/voting.js.map +1 -0
  152. package/dist/providers/index.js +1 -17
  153. package/dist/providers/index.js.map +1 -1
  154. package/dist/providers/wallet.js +20 -32
  155. package/dist/providers/wallet.js.map +1 -1
  156. package/dist/types/common.js +2 -0
  157. package/dist/types/common.js.map +1 -0
  158. package/dist/types/config.js +2 -0
  159. package/dist/types/config.js.map +1 -0
  160. package/dist/types/index.js +3 -0
  161. package/dist/types/index.js.map +1 -0
  162. package/dist/utils/contract.js +98 -0
  163. package/dist/utils/contract.js.map +1 -0
  164. package/dist/utils/data-validators.js +69 -0
  165. package/dist/utils/data-validators.js.map +1 -0
  166. package/dist/utils/error-handler.js +7 -0
  167. package/dist/utils/error-handler.js.map +1 -0
  168. package/dist/utils/get-commands.js +11 -0
  169. package/dist/utils/get-commands.js.map +1 -0
  170. package/dist/utils/get-value.js +5 -11
  171. package/dist/utils/get-value.js.map +1 -1
  172. package/dist/utils/index.js +12 -17
  173. package/dist/utils/index.js.map +1 -1
  174. package/dist/utils/parse-string.js +20 -0
  175. package/dist/utils/parse-string.js.map +1 -0
  176. package/dist/utils/prompts/default.js +17 -0
  177. package/dist/utils/prompts/default.js.map +1 -0
  178. package/dist/utils/prompts/delegation-dashboard.js +29 -0
  179. package/dist/utils/prompts/delegation-dashboard.js.map +1 -0
  180. package/dist/utils/prompts/index.js +5 -0
  181. package/dist/utils/prompts/index.js.map +1 -0
  182. package/dist/utils/prompts/predeposit-guarantee.js +25 -0
  183. package/dist/utils/prompts/predeposit-guarantee.js.map +1 -0
  184. package/dist/utils/prompts/vault.js +11 -0
  185. package/dist/utils/prompts/vault.js.map +1 -0
  186. package/dist/utils/proof/create-proof.js +62 -0
  187. package/dist/utils/proof/create-proof.js.map +1 -0
  188. package/dist/utils/proof/first-validator-gindex.js +26 -0
  189. package/dist/utils/proof/first-validator-gindex.js.map +1 -0
  190. package/dist/utils/proof/index.js +4 -0
  191. package/dist/utils/proof/index.js.map +1 -0
  192. package/dist/utils/proof/merkle-utils.js +131 -0
  193. package/dist/utils/proof/merkle-utils.js.map +1 -0
  194. package/dist/utils/proof/proofs.js +52 -0
  195. package/dist/utils/proof/proofs.js.map +1 -0
  196. package/dist/utils/read-programs-by-abi.js +87 -0
  197. package/dist/utils/read-programs-by-abi.js.map +1 -0
  198. package/dist/utils/resolve-path.js +10 -0
  199. package/dist/utils/resolve-path.js.map +1 -0
  200. package/dist/utils/sleep.js +4 -0
  201. package/dist/utils/sleep.js.map +1 -0
  202. package/dist/utils/spinner/index.js +2 -0
  203. package/dist/utils/spinner/index.js.map +1 -0
  204. package/dist/utils/spinner/spinners.js +16 -0
  205. package/dist/utils/spinner/spinners.js.map +1 -0
  206. package/dist/utils/spinner/spinners.json +119 -0
  207. package/dist/version/index.js +1 -0
  208. package/dist/version/index.js.map +1 -0
  209. package/package.json +52 -7
  210. package/dist/programs/vault-hub.js +0 -137
  211. package/dist/programs/vault-hub.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../programs/vault/read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,qBAAqB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,kBAAkB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACvE,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,2BAA2B,GAC/B,MAAM,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClD,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,OAAO;YACd,qBAAqB;YACrB,UAAU;YACV,OAAO;YACP,SAAS;YACT,MAAM;YACN,QAAQ;YACR,2BAA2B;YAC3B,OAAO;YACP,kBAAkB;YAClB,eAAe;YACf,QAAQ;YACR,YAAY;YACZ,KAAK;YACL,eAAe;SAChB,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oBAAoB,CAClB,eAAe,EACf,uBAAuB,EACvB,KAAK,EACL,iBAAiB,CAClB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { getStakingVaultContract } from '../../contracts/index.js';
2
+ import { callWriteMethodWithReceipt, confirmFund } from '../../utils/index.js';
3
+ import { vault } from './main.js';
4
+ vault
5
+ .command('fund')
6
+ .description('fund vault')
7
+ .option('-a, --address <address>', 'vault address')
8
+ .option('-e, --ether <ether>', 'amount of ether to be funded (in WEI)')
9
+ .action(async ({ address, ether }) => {
10
+ const { address: vault, amount } = await confirmFund(address, ether);
11
+ if (!vault || !amount)
12
+ return;
13
+ const contract = getStakingVaultContract(address);
14
+ await callWriteMethodWithReceipt(contract, 'fund', [], BigInt(amount));
15
+ });
16
+ // TODO: investigate why only owner can fund vault
17
+ vault
18
+ .command('withdraw')
19
+ .description('withdraw from vault')
20
+ .argument('<address>', 'vault address')
21
+ .argument('<recipient>', 'recipient address')
22
+ .argument('<wei>', 'amount to withdraw (in WEI)')
23
+ .action(async (address, recipient, amount) => {
24
+ const contract = getStakingVaultContract(address);
25
+ await callWriteMethodWithReceipt(contract, 'withdraw', [
26
+ recipient,
27
+ BigInt(amount),
28
+ ]);
29
+ });
30
+ // NOs
31
+ // TODO: get more details
32
+ vault
33
+ .command('no-deposit-beacon')
34
+ .description('deposit to beacon chain')
35
+ .argument('<address>', 'vault address')
36
+ .argument('<amountOfDeposit>', 'amount of deposits')
37
+ .argument('<pubkey>', 'pubkey')
38
+ .argument('<signature>', 'signature')
39
+ .argument('<depositDataRoot>', 'depositDataRoot')
40
+ .action(async (vault, amountOfDeposit, pubkey, signature, depositDataRoot) => {
41
+ const amount = BigInt(amountOfDeposit);
42
+ const contract = getStakingVaultContract(vault);
43
+ const payload = [
44
+ {
45
+ pubkey,
46
+ signature,
47
+ amount,
48
+ depositDataRoot,
49
+ },
50
+ ];
51
+ await callWriteMethodWithReceipt(contract, 'depositToBeaconChain', [
52
+ payload,
53
+ ]);
54
+ });
55
+ // TODO: get more details
56
+ vault
57
+ .command('no-val-exit')
58
+ .description('request to exit validator')
59
+ .argument('<address>', 'vault address')
60
+ .argument('<validatorPublicKey>', 'validator public key')
61
+ .action(async (address, validatorPublicKey) => {
62
+ const contract = getStakingVaultContract(address);
63
+ await callWriteMethodWithReceipt(contract, 'requestValidatorExit', [
64
+ validatorPublicKey,
65
+ ]);
66
+ });
67
+ vault
68
+ .command('bc-resume')
69
+ .description('Resumes deposits to beacon chain')
70
+ .argument('<address>', 'vault address')
71
+ .action(async (address) => {
72
+ const contract = getStakingVaultContract(address);
73
+ await callWriteMethodWithReceipt(contract, 'resumeBeaconChainDeposits', []);
74
+ });
75
+ vault
76
+ .command('bc-pause')
77
+ .description('Pauses deposits to beacon chain')
78
+ .argument('<address>', 'vault address')
79
+ .action(async (address) => {
80
+ const contract = getStakingVaultContract(address);
81
+ await callWriteMethodWithReceipt(contract, 'pauseBeaconChainDeposits', []);
82
+ });
83
+ vault
84
+ .command('report')
85
+ .description('Submits a report containing valuation, inOutDelta, and locked amount')
86
+ .argument('<address>', 'vault address')
87
+ .argument('<valuation>', 'New total valuation: validator balances + StakingVault balance')
88
+ .argument('<inOutDelta>', 'New net difference between funded and withdrawn ether')
89
+ .argument('<locked>', 'New amount of locked ether')
90
+ .action(async (address, valuation, inOutDelta, locked) => {
91
+ const contract = getStakingVaultContract(address);
92
+ await callWriteMethodWithReceipt(contract, 'report', [
93
+ BigInt(valuation),
94
+ BigInt(inOutDelta),
95
+ BigInt(locked),
96
+ ]);
97
+ });
98
+ vault
99
+ .command('rebalance')
100
+ .description('Rebalances the vault')
101
+ .argument('<address>', 'vault address')
102
+ .argument('<amount>', 'amount to rebalance (in WEI)')
103
+ .action(async (address, amount) => {
104
+ const contract = getStakingVaultContract(address);
105
+ await callWriteMethodWithReceipt(contract, 'rebalance', [BigInt(amount)]);
106
+ });
107
+ vault
108
+ .command('trigger-v-w')
109
+ .description('Trigger validator withdrawal')
110
+ .argument('<address>', 'vault address')
111
+ .argument('<pubkeys>', 'validator public keys')
112
+ .argument('<amounts>', 'amounts to withdraw (in WEI)')
113
+ .argument('<refundRecipient>', 'refund recipient address')
114
+ .action(async (address, pubkeys, amount, refundRecipient) => {
115
+ const contract = getStakingVaultContract(address);
116
+ const concatenatedPubkeys = pubkeys.join('');
117
+ await callWriteMethodWithReceipt(contract, 'triggerValidatorWithdrawal', [
118
+ concatenatedPubkeys,
119
+ amount.map((a) => BigInt(a)),
120
+ refundRecipient,
121
+ ]);
122
+ });
123
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../programs/vault/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export const readCommandConfig = {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../programs/vault-factory/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAA6B,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './main.js';
2
+ export * from './read.js';
3
+ export * from './write.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../programs/vault-factory/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { program } from '../../command/index.js';
2
+ import { Option } from 'commander';
3
+ import { getCommandsJson } from '../../utils/index.js';
4
+ export const vaultFactory = program
5
+ .command('factory')
6
+ .description('vault factory contract');
7
+ vaultFactory.addOption(new Option('-cmd2json'));
8
+ vaultFactory.on('option:-cmd2json', function () {
9
+ console.info(getCommandsJson(vaultFactory));
10
+ process.exit();
11
+ });
12
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../programs/vault-factory/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAExC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO;KAChC,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC,CAAC;AAEzC,YAAY,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAChD,YAAY,CAAC,EAAE,CAAC,kBAAkB,EAAE;IAClC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { getVaultFactoryContract } from '../../contracts/index.js';
2
+ import { VaultFactoryAbi } from '../../abi/index.js';
3
+ import { generateReadCommands } from '../../utils/index.js';
4
+ import { vaultFactory } from './main.js';
5
+ import { readCommandConfig } from './config.js';
6
+ vaultFactory
7
+ .command('constants')
8
+ .description('get vault factory constants info')
9
+ .action(async () => {
10
+ const contract = getVaultFactoryContract();
11
+ try {
12
+ const beaconAddress = await contract.read.BEACON();
13
+ const delegationImplAddress = await contract.read.DELEGATION_IMPL();
14
+ console.table({
15
+ beaconAddress,
16
+ delegationImplAddress,
17
+ });
18
+ }
19
+ catch (err) {
20
+ if (err instanceof Error) {
21
+ console.info('Error when getting constants:\n', err.message);
22
+ }
23
+ }
24
+ });
25
+ generateReadCommands(VaultFactoryAbi, getVaultFactoryContract, vaultFactory, readCommandConfig);
26
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../programs/vault-factory/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY;KACT,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,qBAAqB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEpE,OAAO,CAAC,KAAK,CAAC;YACZ,aAAa;YACb,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oBAAoB,CAClB,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,iBAAiB,CAClB,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { program } from '../../command/index.js';
2
+ import { createVault } from '../../features/index.js';
3
+ import { validateAddressesMap, validateAddressMap, transformAddressesToArray, confirmCreateVaultParams, } from '../../utils/index.js';
4
+ import { vaultFactory } from './main.js';
5
+ vaultFactory
6
+ .command('create-vault')
7
+ .description('create vault contract')
8
+ .option('-f, --funders <funders>', 'funders role address')
9
+ .option('-w, --withdrawers <withdrawers>', 'withdrawers role address')
10
+ .option('-m, --minters <minters>', 'minters role address')
11
+ .option('-b, --burners <burners>', 'burners role address')
12
+ .option('-r, --rebalancers <rebalancers>', 'rebalancers role address')
13
+ .option('-p, --depositPausers <depositPausers>', 'depositPausers role address')
14
+ .option('-d, --depositResumers <depositResumers>', 'depositResumers role address')
15
+ .option('-e, --exitRequesters <exitRequesters>', 'exitRequesters role address')
16
+ .option('-u, --disconnecters <disconnecters>', 'disconnecters role address')
17
+ .option('-c, --curators <curators>', 'curators role address')
18
+ .option('-ve, --validatorExitRequesters <validatorExitRequesters>', 'validator exit requesters role addresses')
19
+ .option('-vt, --validatorWithdrawalTriggerers <validatorWithdrawalTriggerers>', 'validator withdrawal triggerers role address')
20
+ .option('-o, --nodeOperatorFeeClaimer <nodeOperatorFeeClaimer>', 'node operator fee claimer address')
21
+ .option('-cfs, --curatorFeeSetters <curatorFeeSetters>', 'curator fee setters role addresses')
22
+ .option('-cfc, --curatorFeeClaimers <curatorFeeClaimers>', 'curator fee claimers role addresses')
23
+ .option('-nofc, --nodeOperatorFeeClaimers <nodeOperatorFeeClaimers>', 'node operator fee claimers role addresses')
24
+ .argument('<defaultAdmin>', 'default admin address')
25
+ .argument('<nodeOperatorManager>', 'node operator manager address')
26
+ .argument('<assetRecoverer>', 'asset recoverer address')
27
+ .argument('<confirmExpiry>', 'confirm expiry')
28
+ .argument('<curatorFeeBP>', 'Vault curator fee, for e.g. 100 == 1%')
29
+ .argument('<nodeOperatorFeeBP>', 'Node operator fee, for e.g. 100 == 1%')
30
+ .argument('[quantity]', 'quantity of vaults to create, default 1', '1')
31
+ .action(async (defaultAdmin, nodeOperatorManager, assetRecoverer, confirmExpiry, curatorFeeBP, nodeOperatorFeeBP, quantity, options) => {
32
+ const curatorFee = parseInt(curatorFeeBP);
33
+ const nodeOperatorFee = parseInt(nodeOperatorFeeBP);
34
+ const confirmExpiryNumber = Number(confirmExpiry);
35
+ const qnt = parseInt(quantity);
36
+ if (isNaN(curatorFee) || curatorFee < 0) {
37
+ program.error('curator fee must be a positive number', { exitCode: 1 });
38
+ }
39
+ if (isNaN(nodeOperatorFee) || nodeOperatorFee < 0) {
40
+ program.error('operator fee must be a positive number', {
41
+ exitCode: 1,
42
+ });
43
+ }
44
+ if (isNaN(confirmExpiryNumber) || confirmExpiryNumber < 0) {
45
+ program.error('confirm expiry must be a positive number', {
46
+ exitCode: 1,
47
+ });
48
+ }
49
+ if (isNaN(qnt)) {
50
+ program.error('quantity must be a number', { exitCode: 1 });
51
+ }
52
+ const extraKeys = [
53
+ 'funders',
54
+ 'withdrawers',
55
+ 'minters',
56
+ 'burners',
57
+ 'rebalancers',
58
+ 'depositPausers',
59
+ 'depositResumers',
60
+ 'validatorExitRequesters',
61
+ 'validatorWithdrawalTriggerers',
62
+ 'disconnecters',
63
+ 'curatorFeeSetters',
64
+ 'curatorFeeClaimers',
65
+ 'nodeOperatorFeeClaimers',
66
+ ];
67
+ const addresses = transformAddressesToArray(options, extraKeys);
68
+ const errorsAddressesList = validateAddressesMap(addresses);
69
+ const errorsList = [
70
+ ...errorsAddressesList,
71
+ ...validateAddressMap([
72
+ assetRecoverer,
73
+ defaultAdmin,
74
+ nodeOperatorManager,
75
+ ]),
76
+ ];
77
+ if (errorsList.length > 0) {
78
+ errorsList.forEach((error) => program.error(error));
79
+ return;
80
+ }
81
+ // eslint-disable-next-line unicorn/new-for-builtins
82
+ const list = Array.from(Array(qnt));
83
+ const payload = {
84
+ ...options,
85
+ ...addresses,
86
+ defaultAdmin,
87
+ nodeOperatorManager,
88
+ assetRecoverer,
89
+ confirmExpiry: BigInt(confirmExpiry),
90
+ curatorFeeBP: curatorFee,
91
+ nodeOperatorFeeBP: nodeOperatorFee,
92
+ };
93
+ const transactions = [];
94
+ const { confirm } = await confirmCreateVaultParams(payload);
95
+ if (!confirm)
96
+ program.error('Vault creation cancelled', { exitCode: 1 });
97
+ try {
98
+ for (const _ of list) {
99
+ const tx = await createVault(payload);
100
+ transactions.push(tx);
101
+ }
102
+ console.table(transactions);
103
+ }
104
+ catch (err) {
105
+ if (err instanceof Error) {
106
+ console.info('Error occurred while creating vaults', err.message);
107
+ }
108
+ }
109
+ });
110
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../programs/vault-factory/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { program } from '../command/index.js';
2
+ import { getVaultHubViewerContract } from '../contracts/index.js';
3
+ import { getAccount } from '../providers/index.js';
4
+ import { callReadMethod } from '../utils/index.js';
5
+ // TODO: move to config
6
+ const ADDRESS = '0x5D73Eec220C7428eEAa26aF0F6d65B4dD1bb95aA';
7
+ // TODO: add methods with pagination
8
+ const vaultHubViewer = program
9
+ .command('hub-viewer')
10
+ .description('vault hub viewer');
11
+ vaultHubViewer
12
+ .command('connected')
13
+ .description('get vaults connected to vault hub')
14
+ .action(async () => {
15
+ const contract = getVaultHubViewerContract(ADDRESS);
16
+ await callReadMethod(contract, 'vaultsConnected');
17
+ });
18
+ vaultHubViewer
19
+ .command('my')
20
+ .description('get my vaults')
21
+ .action(async () => {
22
+ const contract = getVaultHubViewerContract(ADDRESS);
23
+ const account = getAccount();
24
+ await callReadMethod(contract, 'vaultsByOwner', [account.address]);
25
+ });
26
+ vaultHubViewer
27
+ .command('by-owner')
28
+ .description('get vaults by owner')
29
+ .argument('<address>', 'owner address')
30
+ .action(async (address) => {
31
+ const contract = getVaultHubViewerContract(ADDRESS);
32
+ await callReadMethod(contract, 'vaultsByOwner', [address]);
33
+ });
34
+ vaultHubViewer
35
+ .command('by-role')
36
+ .description('get vaults by role')
37
+ .argument('<role>', 'role')
38
+ .action(async (role) => {
39
+ const contract = getVaultHubViewerContract(ADDRESS);
40
+ const account = getAccount();
41
+ await callReadMethod(contract, 'vaultsByRole', [role, account.address]);
42
+ });
43
+ vaultHubViewer
44
+ .command('by-role-and-address')
45
+ .description('get vaults by role and address')
46
+ .argument('<role>', 'role')
47
+ .argument('<address>', 'address')
48
+ .action(async (role, address) => {
49
+ const contract = getVaultHubViewerContract(ADDRESS);
50
+ await callReadMethod(contract, 'vaultsByRole', [role, address]);
51
+ });
52
+ //# sourceMappingURL=vault-hub-viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-hub-viewer.js","sourceRoot":"","sources":["../../programs/vault-hub-viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,uBAAuB;AACvB,MAAM,OAAO,GAAG,4CAA4C,CAAC;AAE7D,oCAAoC;AAEpC,MAAM,cAAc,GAAG,OAAO;KAC3B,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAEnC,cAAc;KACX,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,eAAe,CAAC;KAC5B,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,oBAAoB,CAAC;KACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1B,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;IAC9B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEL,cAAc;KACX,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;KAChC,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,OAAgB,EAAE,EAAE;IAChD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { program } from '../command/index.js';
2
+ import {
3
+ // getTokenManagerContract,
4
+ getVaultHubContract, getVotingContract, } from '../contracts/index.js';
5
+ import { voteLastVoting } from '../features/index.js';
6
+ import { callWriteMethodWithReceipt, callReadMethod } from '../utils/index.js';
7
+ const voting = program.command('vote').description('voting contract');
8
+ voting
9
+ .command('connect-vault')
10
+ .description('vote and connect vault to the hub')
11
+ .description('connects a vault to the hub (vault master role needed)')
12
+ .argument('<address>', 'vault address')
13
+ .argument('<shareLimit>', 'maximum number of stETH shares that can be minted by the vault')
14
+ .argument('<reserveRatio>', 'minimum Reserve ratio in basis points')
15
+ .argument('<reserveRatioThreshold>', 'reserve ratio that makes possible to force rebalance on the vault (in basis points)')
16
+ .argument('<treasuryFeeBP>', 'treasury fee in basis points')
17
+ .action(async (address, shareLimit, reserveRatio, reserveRatioThreshold, treasuryFeeBP) => {
18
+ const contract = await getVaultHubContract();
19
+ await callWriteMethodWithReceipt(contract, 'connectVault', [
20
+ address,
21
+ shareLimit,
22
+ reserveRatio,
23
+ reserveRatioThreshold,
24
+ treasuryFeeBP,
25
+ ]);
26
+ });
27
+ voting.command('get-lv').action(async () => {
28
+ const { contract } = getVotingContract();
29
+ const tx = await callReadMethod(contract, 'votesLength');
30
+ console.info({ 'Votes length': tx });
31
+ });
32
+ voting.command('connect-and-vote').action(async () => await voteLastVoting());
33
+ //# sourceMappingURL=voting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voting.js","sourceRoot":"","sources":["../../programs/voting.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO;AACL,2BAA2B;AAC3B,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEnE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAEtE,MAAM;KACH,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,mCAAmC,CAAC;KAChD,WAAW,CAAC,wDAAwD,CAAC;KACrE,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;KACtC,QAAQ,CACP,cAAc,EACd,gEAAgE,CACjE;KACA,QAAQ,CAAC,gBAAgB,EAAE,uCAAuC,CAAC;KACnE,QAAQ,CACP,yBAAyB,EACzB,qFAAqF,CACtF;KACA,QAAQ,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KAC3D,MAAM,CACL,KAAK,EACH,OAAgB,EAChB,UAAkB,EAClB,YAAoB,EACpB,qBAA6B,EAC7B,aAAqB,EACrB,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAE7C,MAAM,0BAA0B,CAAC,QAAQ,EAAE,cAAc,EAAE;QACzD,OAAO;QACP,UAAU;QACV,YAAY;QACZ,qBAAqB;QACrB,aAAa;KACd,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEJ,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAEzC,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEzD,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC"}
@@ -1,18 +1,2 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./wallet"), exports);
1
+ export * from "./wallet.js";
18
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -1,39 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWalletWithAccount = exports.getAccount = exports.getWalletClient = void 0;
4
- const viem_1 = require("viem");
5
- const accounts_1 = require("viem/accounts");
6
- const _configs_1 = require("../configs");
7
- const getWalletClient = (chainId) => {
8
- const currentChainId = chainId ?? process.env.CHAIN_ID;
9
- const rpcUrl = _configs_1.envs?.[`RPC_URL_${currentChainId}`];
10
- const client = (0, viem_1.createWalletClient)({
11
- chain: chainId,
12
- transport: (0, viem_1.http)(rpcUrl),
13
- });
14
- return client;
15
- };
16
- exports.getWalletClient = getWalletClient;
17
- const getAccount = (chainId) => {
18
- const currentChainId = chainId ?? process.env.CHAIN_ID;
19
- const privateKey = _configs_1.envs?.[`PRIVATE_KEY_${currentChainId}`];
1
+ import { createPublicClient, createWalletClient, http } from 'viem';
2
+ import { privateKeyToAccount } from 'viem/accounts';
3
+ import { envs, getConfig, getChainId, getRpcUrl, getChain } from '../configs/index.js';
4
+ export const getAccount = () => {
5
+ const config = getConfig();
6
+ const id = getChainId();
7
+ const privateKey = config?.privateKey ?? envs?.[`PRIVATE_KEY_${id}`];
20
8
  if (!privateKey) {
21
- throw new Error(`PRIVATE_KEY_${chainId} is not set`);
9
+ throw new Error(`Private key for ${id} chain is not set`);
22
10
  }
23
- const account = (0, accounts_1.privateKeyToAccount)(privateKey);
24
- return account;
11
+ return privateKeyToAccount(privateKey);
12
+ };
13
+ export const getPublicClient = () => {
14
+ return createPublicClient({
15
+ chain: getChain(),
16
+ transport: http(getRpcUrl()),
17
+ });
25
18
  };
26
- exports.getAccount = getAccount;
27
- const getWalletWithAccount = (chainId) => {
28
- const currentChainId = chainId ?? process.env.CHAIN_ID;
29
- const rpcUrl = _configs_1.envs?.[`RPC_URL_${currentChainId}`];
30
- const account = (0, exports.getAccount)(chainId);
31
- const client = (0, viem_1.createWalletClient)({
19
+ export const getWalletWithAccount = () => {
20
+ const account = getAccount();
21
+ return createWalletClient({
32
22
  account,
33
- chain: chainId,
34
- transport: (0, viem_1.http)(rpcUrl),
23
+ chain: getChain(),
24
+ transport: http(getRpcUrl()),
35
25
  });
36
- return { client, account };
37
26
  };
38
- exports.getWalletWithAccount = getWalletWithAccount;
39
27
  //# sourceMappingURL=wallet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../providers/wallet.ts"],"names":[],"mappings":";;;AAAA,+BAAgE;AAChE,4CAAoD;AACpD,uCAAgC;AAEzB,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE;IACjD,MAAM,cAAc,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvD,MAAM,MAAM,GAAG,eAAI,EAAE,CAAC,WAAW,cAAc,EAAE,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC;QAChC,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,IAAA,WAAI,EAAC,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEK,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE;IAC5C,MAAM,cAAc,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvD,MAAM,UAAU,GAAG,eAAI,EAAE,CAAC,eAAe,cAAc,EAAE,CAAC,CAAC;IAE3D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,8BAAmB,EAAC,UAAqB,CAAC,CAAC;IAE3D,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAXW,QAAA,UAAU,cAWrB;AAEK,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,EAAE;IACtD,MAAM,cAAc,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvD,MAAM,MAAM,GAAG,eAAI,EAAE,CAAC,WAAW,cAAc,EAAE,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC;QAChC,OAAO;QACP,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,IAAA,WAAI,EAAC,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC,CAAC;AAZW,QAAA,oBAAoB,wBAY/B"}
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../providers/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE3E,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,mBAAmB,CAAC,UAAqB,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,OAAO,kBAAkB,CAAC;QACxB,KAAK,EAAE,QAAQ,EAAE;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,KAAK,EAAE,QAAQ,EAAE;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../types/common.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from "./config.js";
2
+ export * from "./common.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}