You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.4 KiB
36 lines
1.4 KiB
import { concat } from '../data/concat.js';
|
|
import { isBytes } from '../data/isBytes.js';
|
|
import { pad } from '../data/pad.js';
|
|
import { slice } from '../data/slice.js';
|
|
import { toBytes } from '../encoding/toBytes.js';
|
|
import { toRlp } from '../encoding/toRlp.js';
|
|
import { keccak256 } from '../hash/keccak256.js';
|
|
import { getAddress } from './getAddress.js';
|
|
export function getContractAddress(opts) {
|
|
if (opts.opcode === 'CREATE2')
|
|
return getCreate2Address(opts);
|
|
return getCreateAddress(opts);
|
|
}
|
|
export function getCreateAddress(opts) {
|
|
const from = toBytes(getAddress(opts.from));
|
|
let nonce = toBytes(opts.nonce);
|
|
if (nonce[0] === 0)
|
|
nonce = new Uint8Array([]);
|
|
return getAddress(`0x${keccak256(toRlp([from, nonce], 'bytes')).slice(26)}`);
|
|
}
|
|
export function getCreate2Address(opts) {
|
|
const from = toBytes(getAddress(opts.from));
|
|
const salt = pad(isBytes(opts.salt) ? opts.salt : toBytes(opts.salt), {
|
|
size: 32,
|
|
});
|
|
const bytecodeHash = (() => {
|
|
if ('bytecodeHash' in opts) {
|
|
if (isBytes(opts.bytecodeHash))
|
|
return opts.bytecodeHash;
|
|
return toBytes(opts.bytecodeHash);
|
|
}
|
|
return keccak256(opts.bytecode, 'bytes');
|
|
})();
|
|
return getAddress(slice(keccak256(concat([toBytes('0xff'), from, salt, bytecodeHash])), 12));
|
|
}
|
|
//# sourceMappingURL=getContractAddress.js.map
|