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.
- package/_cjs/chains/zksync/actions/deployContract.js +26 -0
- package/_cjs/chains/zksync/actions/deployContract.js.map +1 -0
- package/_cjs/chains/zksync/constants/abis.js +427 -0
- package/_cjs/chains/zksync/constants/abis.js.map +1 -0
- package/_cjs/chains/zksync/constants/address.js +5 -0
- package/_cjs/chains/zksync/constants/address.js.map +1 -0
- package/_cjs/chains/zksync/constants/contract.js +6 -0
- package/_cjs/chains/zksync/constants/contract.js.map +1 -0
- package/_cjs/chains/zksync/constants/number.js +6 -0
- package/_cjs/chains/zksync/constants/number.js.map +1 -0
- package/_cjs/chains/zksync/decorators/eip712.js +2 -0
- package/_cjs/chains/zksync/decorators/eip712.js.map +1 -1
- package/_cjs/chains/zksync/errors/bytecode.js +41 -0
- package/_cjs/chains/zksync/errors/bytecode.js.map +1 -0
- package/_cjs/chains/zksync/formatters.js +5 -1
- package/_cjs/chains/zksync/formatters.js.map +1 -1
- package/_cjs/chains/zksync/index.js +3 -1
- package/_cjs/chains/zksync/index.js.map +1 -1
- package/_cjs/chains/zksync/types/contract.js +3 -0
- package/_cjs/chains/zksync/types/contract.js.map +1 -0
- package/_cjs/chains/zksync/utils/abi/encodeDeployData.js +68 -0
- package/_cjs/chains/zksync/utils/abi/encodeDeployData.js.map +1 -0
- package/_cjs/chains/zksync/utils/getEip712Domain.js +4 -2
- package/_cjs/chains/zksync/utils/getEip712Domain.js.map +1 -1
- package/_cjs/chains/zksync/utils/hashBytecode.js +36 -0
- package/_cjs/chains/zksync/utils/hashBytecode.js.map +1 -0
- package/_cjs/errors/version.js +1 -1
- package/_esm/chains/zksync/actions/deployContract.js +52 -0
- package/_esm/chains/zksync/actions/deployContract.js.map +1 -0
- package/_esm/chains/zksync/constants/abis.js +425 -0
- package/_esm/chains/zksync/constants/abis.js.map +1 -0
- package/_esm/chains/zksync/constants/address.js +2 -0
- package/_esm/chains/zksync/constants/address.js.map +1 -0
- package/_esm/chains/zksync/constants/contract.js +3 -0
- package/_esm/chains/zksync/constants/contract.js.map +1 -0
- package/_esm/chains/zksync/constants/number.js +3 -0
- package/_esm/chains/zksync/constants/number.js.map +1 -0
- package/_esm/chains/zksync/decorators/eip712.js +2 -0
- package/_esm/chains/zksync/decorators/eip712.js.map +1 -1
- package/_esm/chains/zksync/errors/bytecode.js +35 -0
- package/_esm/chains/zksync/errors/bytecode.js.map +1 -0
- package/_esm/chains/zksync/formatters.js +5 -1
- package/_esm/chains/zksync/formatters.js.map +1 -1
- package/_esm/chains/zksync/index.js +1 -0
- package/_esm/chains/zksync/index.js.map +1 -1
- package/_esm/chains/zksync/types/contract.js +2 -0
- package/_esm/chains/zksync/types/contract.js.map +1 -0
- package/_esm/chains/zksync/utils/abi/encodeDeployData.js +65 -0
- package/_esm/chains/zksync/utils/abi/encodeDeployData.js.map +1 -0
- package/_esm/chains/zksync/utils/getEip712Domain.js +4 -2
- package/_esm/chains/zksync/utils/getEip712Domain.js.map +1 -1
- package/_esm/chains/zksync/utils/hashBytecode.js +36 -0
- package/_esm/chains/zksync/utils/hashBytecode.js.map +1 -0
- package/_esm/errors/version.js +1 -1
- package/_types/chains/zksync/actions/deployContract.d.ts +49 -0
- package/_types/chains/zksync/actions/deployContract.d.ts.map +1 -0
- package/_types/chains/zksync/constants/abis.d.ts +70 -0
- package/_types/chains/zksync/constants/abis.d.ts.map +1 -0
- package/_types/chains/zksync/constants/address.d.ts +2 -0
- package/_types/chains/zksync/constants/address.d.ts.map +1 -0
- package/_types/chains/zksync/constants/contract.d.ts +3 -0
- package/_types/chains/zksync/constants/contract.d.ts.map +1 -0
- package/_types/chains/zksync/constants/number.d.ts +2 -0
- package/_types/chains/zksync/constants/number.d.ts.map +1 -0
- package/_types/chains/zksync/decorators/eip712.d.ts +32 -0
- package/_types/chains/zksync/decorators/eip712.d.ts.map +1 -1
- package/_types/chains/zksync/errors/bytecode.d.ts +30 -0
- package/_types/chains/zksync/errors/bytecode.d.ts.map +1 -0
- package/_types/chains/zksync/formatters.d.ts.map +1 -1
- package/_types/chains/zksync/index.d.ts +1 -0
- package/_types/chains/zksync/index.d.ts.map +1 -1
- package/_types/chains/zksync/types/contract.d.ts +2 -0
- package/_types/chains/zksync/types/contract.d.ts.map +1 -0
- package/_types/chains/zksync/utils/abi/encodeDeployData.d.ts +13 -0
- package/_types/chains/zksync/utils/abi/encodeDeployData.d.ts.map +1 -0
- package/_types/chains/zksync/utils/getEip712Domain.d.ts.map +1 -1
- package/_types/chains/zksync/utils/hashBytecode.d.ts +3 -0
- package/_types/chains/zksync/utils/hashBytecode.d.ts.map +1 -0
- package/_types/errors/version.d.ts +1 -1
- package/chains/zksync/actions/deployContract.ts +100 -0
- package/chains/zksync/constants/abis.ts +424 -0
- package/chains/zksync/constants/address.ts +2 -0
- package/chains/zksync/constants/contract.ts +2 -0
- package/chains/zksync/constants/number.ts +3 -0
- package/chains/zksync/decorators/eip712.ts +47 -0
- package/chains/zksync/errors/bytecode.ts +46 -0
- package/chains/zksync/formatters.ts +7 -1
- package/chains/zksync/index.ts +6 -0
- package/chains/zksync/types/contract.ts +6 -0
- package/chains/zksync/utils/abi/encodeDeployData.ts +120 -0
- package/chains/zksync/utils/getEip712Domain.ts +4 -2
- package/chains/zksync/utils/hashBytecode.ts +48 -0
- package/errors/version.ts +1 -1
- 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 : '
|
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.
|
1
|
+
export const version = '0.0.0-main.20240324T211636'
|
package/package.json
CHANGED