viem 0.0.0-main.20240324T200829 → 0.0.0-main.20240324T211636

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 (94) hide show
  1. package/_cjs/chains/zksync/actions/deployContract.js +26 -0
  2. package/_cjs/chains/zksync/actions/deployContract.js.map +1 -0
  3. package/_cjs/chains/zksync/constants/abis.js +427 -0
  4. package/_cjs/chains/zksync/constants/abis.js.map +1 -0
  5. package/_cjs/chains/zksync/constants/address.js +5 -0
  6. package/_cjs/chains/zksync/constants/address.js.map +1 -0
  7. package/_cjs/chains/zksync/constants/contract.js +6 -0
  8. package/_cjs/chains/zksync/constants/contract.js.map +1 -0
  9. package/_cjs/chains/zksync/constants/number.js +6 -0
  10. package/_cjs/chains/zksync/constants/number.js.map +1 -0
  11. package/_cjs/chains/zksync/decorators/eip712.js +2 -0
  12. package/_cjs/chains/zksync/decorators/eip712.js.map +1 -1
  13. package/_cjs/chains/zksync/errors/bytecode.js +41 -0
  14. package/_cjs/chains/zksync/errors/bytecode.js.map +1 -0
  15. package/_cjs/chains/zksync/formatters.js +5 -1
  16. package/_cjs/chains/zksync/formatters.js.map +1 -1
  17. package/_cjs/chains/zksync/index.js +3 -1
  18. package/_cjs/chains/zksync/index.js.map +1 -1
  19. package/_cjs/chains/zksync/types/contract.js +3 -0
  20. package/_cjs/chains/zksync/types/contract.js.map +1 -0
  21. package/_cjs/chains/zksync/utils/abi/encodeDeployData.js +68 -0
  22. package/_cjs/chains/zksync/utils/abi/encodeDeployData.js.map +1 -0
  23. package/_cjs/chains/zksync/utils/getEip712Domain.js +4 -2
  24. package/_cjs/chains/zksync/utils/getEip712Domain.js.map +1 -1
  25. package/_cjs/chains/zksync/utils/hashBytecode.js +36 -0
  26. package/_cjs/chains/zksync/utils/hashBytecode.js.map +1 -0
  27. package/_cjs/errors/version.js +1 -1
  28. package/_esm/chains/zksync/actions/deployContract.js +52 -0
  29. package/_esm/chains/zksync/actions/deployContract.js.map +1 -0
  30. package/_esm/chains/zksync/constants/abis.js +425 -0
  31. package/_esm/chains/zksync/constants/abis.js.map +1 -0
  32. package/_esm/chains/zksync/constants/address.js +2 -0
  33. package/_esm/chains/zksync/constants/address.js.map +1 -0
  34. package/_esm/chains/zksync/constants/contract.js +3 -0
  35. package/_esm/chains/zksync/constants/contract.js.map +1 -0
  36. package/_esm/chains/zksync/constants/number.js +3 -0
  37. package/_esm/chains/zksync/constants/number.js.map +1 -0
  38. package/_esm/chains/zksync/decorators/eip712.js +2 -0
  39. package/_esm/chains/zksync/decorators/eip712.js.map +1 -1
  40. package/_esm/chains/zksync/errors/bytecode.js +35 -0
  41. package/_esm/chains/zksync/errors/bytecode.js.map +1 -0
  42. package/_esm/chains/zksync/formatters.js +5 -1
  43. package/_esm/chains/zksync/formatters.js.map +1 -1
  44. package/_esm/chains/zksync/index.js +1 -0
  45. package/_esm/chains/zksync/index.js.map +1 -1
  46. package/_esm/chains/zksync/types/contract.js +2 -0
  47. package/_esm/chains/zksync/types/contract.js.map +1 -0
  48. package/_esm/chains/zksync/utils/abi/encodeDeployData.js +65 -0
  49. package/_esm/chains/zksync/utils/abi/encodeDeployData.js.map +1 -0
  50. package/_esm/chains/zksync/utils/getEip712Domain.js +4 -2
  51. package/_esm/chains/zksync/utils/getEip712Domain.js.map +1 -1
  52. package/_esm/chains/zksync/utils/hashBytecode.js +36 -0
  53. package/_esm/chains/zksync/utils/hashBytecode.js.map +1 -0
  54. package/_esm/errors/version.js +1 -1
  55. package/_types/chains/zksync/actions/deployContract.d.ts +49 -0
  56. package/_types/chains/zksync/actions/deployContract.d.ts.map +1 -0
  57. package/_types/chains/zksync/constants/abis.d.ts +70 -0
  58. package/_types/chains/zksync/constants/abis.d.ts.map +1 -0
  59. package/_types/chains/zksync/constants/address.d.ts +2 -0
  60. package/_types/chains/zksync/constants/address.d.ts.map +1 -0
  61. package/_types/chains/zksync/constants/contract.d.ts +3 -0
  62. package/_types/chains/zksync/constants/contract.d.ts.map +1 -0
  63. package/_types/chains/zksync/constants/number.d.ts +2 -0
  64. package/_types/chains/zksync/constants/number.d.ts.map +1 -0
  65. package/_types/chains/zksync/decorators/eip712.d.ts +32 -0
  66. package/_types/chains/zksync/decorators/eip712.d.ts.map +1 -1
  67. package/_types/chains/zksync/errors/bytecode.d.ts +30 -0
  68. package/_types/chains/zksync/errors/bytecode.d.ts.map +1 -0
  69. package/_types/chains/zksync/formatters.d.ts.map +1 -1
  70. package/_types/chains/zksync/index.d.ts +1 -0
  71. package/_types/chains/zksync/index.d.ts.map +1 -1
  72. package/_types/chains/zksync/types/contract.d.ts +2 -0
  73. package/_types/chains/zksync/types/contract.d.ts.map +1 -0
  74. package/_types/chains/zksync/utils/abi/encodeDeployData.d.ts +13 -0
  75. package/_types/chains/zksync/utils/abi/encodeDeployData.d.ts.map +1 -0
  76. package/_types/chains/zksync/utils/getEip712Domain.d.ts.map +1 -1
  77. package/_types/chains/zksync/utils/hashBytecode.d.ts +3 -0
  78. package/_types/chains/zksync/utils/hashBytecode.d.ts.map +1 -0
  79. package/_types/errors/version.d.ts +1 -1
  80. package/chains/zksync/actions/deployContract.ts +100 -0
  81. package/chains/zksync/constants/abis.ts +424 -0
  82. package/chains/zksync/constants/address.ts +2 -0
  83. package/chains/zksync/constants/contract.ts +2 -0
  84. package/chains/zksync/constants/number.ts +3 -0
  85. package/chains/zksync/decorators/eip712.ts +47 -0
  86. package/chains/zksync/errors/bytecode.ts +46 -0
  87. package/chains/zksync/formatters.ts +7 -1
  88. package/chains/zksync/index.ts +6 -0
  89. package/chains/zksync/types/contract.ts +6 -0
  90. package/chains/zksync/utils/abi/encodeDeployData.ts +120 -0
  91. package/chains/zksync/utils/getEip712Domain.ts +4 -2
  92. package/chains/zksync/utils/hashBytecode.ts +48 -0
  93. package/errors/version.ts +1 -1
  94. package/package.json +1 -1
@@ -0,0 +1,120 @@
1
+ import type { Abi } from 'abitype'
2
+
3
+ import { zeroHash } from '../../../../constants/bytes.js'
4
+ import {
5
+ AbiConstructorNotFoundError,
6
+ AbiConstructorParamsNotFoundError,
7
+ } from '../../../../errors/abi.js'
8
+ import type { ContractConstructorArgs } from '../../../../types/contract.js'
9
+ import type { Hash } from '../../../../types/misc.js'
10
+ import type { Hex } from '../../../../types/misc.js'
11
+ import { encodeAbiParameters } from '../../../../utils/abi/encodeAbiParameters.js'
12
+ import {
13
+ type EncodeDeployDataParameters as EncodeDeployDataParameters_,
14
+ type EncodeDeployDataReturnType,
15
+ } from '../../../../utils/abi/encodeDeployData.js'
16
+ import { encodeFunctionData } from '../../../../utils/abi/encodeFunctionData.js'
17
+ import { toHex } from '../../../../utils/encoding/toHex.js'
18
+ import { contractDeployerAbi } from '../../constants/abis.js'
19
+ import { accountAbstractionVersion1 } from '../../constants/contract.js'
20
+ import type { ContractDeploymentType } from '../../types/contract.js'
21
+ import { hashBytecode } from '../hashBytecode.js'
22
+
23
+ const docsPath = '/docs/contract/encodeDeployData'
24
+
25
+ export type EncodeDeployDataParameters<
26
+ abi extends Abi | readonly unknown[] = Abi,
27
+ hasConstructor = abi extends Abi
28
+ ? Abi extends abi
29
+ ? true
30
+ : [Extract<abi[number], { type: 'constructor' }>] extends [never]
31
+ ? false
32
+ : true
33
+ : true,
34
+ allArgs = ContractConstructorArgs<abi>,
35
+ > = EncodeDeployDataParameters_<abi, hasConstructor, allArgs> & {
36
+ deploymentType?: ContractDeploymentType | undefined
37
+ salt?: Hash | undefined
38
+ }
39
+
40
+ export function encodeDeployData<const abi extends Abi | readonly unknown[]>(
41
+ parameters: EncodeDeployDataParameters<abi>,
42
+ ): EncodeDeployDataReturnType {
43
+ const { abi, args, bytecode, deploymentType, salt } =
44
+ parameters as EncodeDeployDataParameters
45
+
46
+ if (!args || args.length === 0) {
47
+ const { functionName, argsContractDeployer } = getDeploymentDetails(
48
+ deploymentType,
49
+ salt ?? zeroHash,
50
+ toHex(hashBytecode(bytecode)),
51
+ '0x',
52
+ )
53
+ return encodeFunctionData({
54
+ abi: contractDeployerAbi,
55
+ functionName,
56
+ args: argsContractDeployer,
57
+ })
58
+ }
59
+
60
+ const description = abi.find((x) => 'type' in x && x.type === 'constructor')
61
+ if (!description) throw new AbiConstructorNotFoundError({ docsPath })
62
+ if (!('inputs' in description))
63
+ throw new AbiConstructorParamsNotFoundError({ docsPath })
64
+ if (!description.inputs || description.inputs.length === 0)
65
+ throw new AbiConstructorParamsNotFoundError({ docsPath })
66
+
67
+ const data = encodeAbiParameters(description.inputs, args)
68
+ const { functionName, argsContractDeployer } = getDeploymentDetails(
69
+ deploymentType,
70
+ salt ?? zeroHash,
71
+ toHex(hashBytecode(bytecode)),
72
+ data,
73
+ )
74
+
75
+ return encodeFunctionData({
76
+ abi: contractDeployerAbi,
77
+ functionName,
78
+ args: argsContractDeployer,
79
+ })
80
+ }
81
+
82
+ function getDeploymentDetails(
83
+ deploymentType: ContractDeploymentType,
84
+ salt: Hash,
85
+ bytecodeHash: Hex,
86
+ data: Hex,
87
+ ): {
88
+ functionName: string
89
+ argsContractDeployer: readonly unknown[]
90
+ } {
91
+ const contractDeploymentArgs = [salt, bytecodeHash, data]
92
+
93
+ const deploymentOptions = {
94
+ create: {
95
+ functionName: 'create',
96
+ argsContractDeployer: contractDeploymentArgs,
97
+ },
98
+ create2: {
99
+ functionName: 'create2',
100
+ argsContractDeployer: contractDeploymentArgs,
101
+ },
102
+ createAccount: {
103
+ functionName: 'createAccount',
104
+ argsContractDeployer: [
105
+ ...contractDeploymentArgs,
106
+ accountAbstractionVersion1,
107
+ ],
108
+ },
109
+ create2Account: {
110
+ functionName: 'create2Account',
111
+ argsContractDeployer: [
112
+ ...contractDeploymentArgs,
113
+ accountAbstractionVersion1,
114
+ ],
115
+ },
116
+ }
117
+
118
+ const deploymentKey = deploymentType || 'create'
119
+ return deploymentOptions[deploymentKey]
120
+ }
@@ -1,3 +1,4 @@
1
+ import { toHex } from '../../../utils/encoding/toHex.js'
1
2
  import type { EIP712DomainFn } from '../types/eip712.js'
2
3
  import type {
3
4
  ZkSyncEIP712TransactionSignable,
@@ -5,6 +6,7 @@ import type {
5
6
  ZkSyncTransactionSerializableEIP712,
6
7
  } from '../types/transaction.js'
7
8
  import { assertEip712Transaction } from './assertEip712Transaction.js'
9
+ import { hashBytecode } from './hashBytecode.js'
8
10
 
9
11
  export const getEip712Domain: EIP712DomainFn<
10
12
  ZkSyncTransactionSerializable,
@@ -77,7 +79,7 @@ function transactionToMessage(
77
79
  nonce: nonce ? BigInt(nonce) : 0n,
78
80
  value: value ?? 0n,
79
81
  data: data ? data : '0x0',
80
- factoryDeps: factoryDeps ?? [],
81
- paymasterInput: paymasterInput ? paymasterInput : '0x0',
82
+ factoryDeps: factoryDeps?.map((dep) => toHex(hashBytecode(dep))) ?? [],
83
+ paymasterInput: paymasterInput ? paymasterInput : '0x',
82
84
  }
83
85
  }
@@ -0,0 +1,48 @@
1
+ import type { Hex } from '../../../types/misc.js'
2
+ import { pad } from '../../../utils/data/pad.js'
3
+ import { toBytes } from '../../../utils/encoding/toBytes.js'
4
+ import { sha256 } from '../../../utils/hash/sha256.js'
5
+ import { maxBytecodeSize } from '../constants/number.js'
6
+ import {
7
+ BytecodeLengthExceedsMaxSizeError,
8
+ BytecodeLengthInWordsMustBeOddError,
9
+ BytecodeLengthMustBeDivisibleBy32Error,
10
+ } from '../errors/bytecode.js'
11
+
12
+ export function hashBytecode(bytecode: Hex): Uint8Array {
13
+ const bytecodeBytes = toBytes(bytecode)
14
+ if (bytecodeBytes.length % 32 !== 0)
15
+ throw new BytecodeLengthMustBeDivisibleBy32Error({
16
+ givenLength: bytecodeBytes.length,
17
+ })
18
+
19
+ if (bytecodeBytes.length > maxBytecodeSize)
20
+ throw new BytecodeLengthExceedsMaxSizeError({
21
+ givenLength: bytecodeBytes.length,
22
+ maxBytecodeSize,
23
+ })
24
+
25
+ const hashStr = sha256(bytecodeBytes)
26
+ const hash = toBytes(hashStr)
27
+
28
+ // Note that the length of the bytecode
29
+ // should be provided in 32-byte words.
30
+ const bytecodeLengthInWords = bytecodeBytes.length / 32
31
+ if (bytecodeLengthInWords % 2 === 0) {
32
+ throw new BytecodeLengthInWordsMustBeOddError({
33
+ givenLengthInWords: bytecodeLengthInWords,
34
+ })
35
+ }
36
+
37
+ const bytecodeLength = toBytes(bytecodeLengthInWords)
38
+
39
+ // The bytecode should always take the first 2 bytes of the bytecode hash,
40
+ // so we pad it from the left in case the length is smaller than 2 bytes.
41
+ const bytecodeLengthPadded = pad(bytecodeLength, { size: 2 })
42
+
43
+ const codeHashVersion = new Uint8Array([1, 0])
44
+ hash.set(codeHashVersion, 0)
45
+ hash.set(bytecodeLengthPadded, 2)
46
+
47
+ return hash
48
+ }
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.0.0-main.20240324T200829'
1
+ export const version = '0.0.0-main.20240324T211636'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "0.0.0-main.20240324T200829",
4
+ "version": "0.0.0-main.20240324T211636",
5
5
  "type": "module",
6
6
  "main": "./_cjs/index.js",
7
7
  "module": "./_esm/index.js",