resolveContractCreationMethod method
Future<SafeContractEncodedCall>
resolveContractCreationMethod({
- required ETHAddress singleton,
- required List<
int> initializer, - BigInt? saltNonce,
- SafeCreationMode mode = SafeCreationMode.standard,
- SafeContractLayer layer = SafeContractLayer.l1,
- bool disableNonceForCreateProxy = false,
override
Implementation
@override
Future<SafeContractEncodedCall> resolveContractCreationMethod({
required ETHAddress singleton,
required List<int> initializer,
BigInt? saltNonce,
SafeCreationMode mode = SafeCreationMode.standard,
SafeContractLayer layer = SafeContractLayer.l1,
bool disableNonceForCreateProxy = false,
}) async {
final methods = getMethods();
SafeContractFunction? method;
if (version < SafeContractVersion.v1_4_1 && layer == SafeContractLayer.l2) {
throw ETHPluginException(
"This Safe contract version (${version.version}) does not support L2 with explicit layer selection.",
details: {
"layer": layer.name,
"mode": mode.name,
"disableNonceForCreateProxy": disableNonceForCreateProxy,
},
);
}
bool isL2 = layer == SafeContractLayer.l2;
switch (mode) {
case SafeCreationMode.standard:
if (isL2 && disableNonceForCreateProxy) break;
if (isL2 &&
methods.contains(SafeContractFunction.createProxyWithNonceL2)) {
method = SafeContractFunction.createProxyWithNonceL2;
} else if (methods.contains(
SafeContractFunction.createProxyWithNonce,
) &&
!disableNonceForCreateProxy) {
method = SafeContractFunction.createProxyWithNonce;
} else if (methods.contains(SafeContractFunction.createProxy)) {
method = SafeContractFunction.createProxy;
}
case SafeCreationMode.chainSpecific:
if (disableNonceForCreateProxy) break;
if (isL2 &&
methods.contains(
SafeContractFunction.createChainSpecificProxyWithNonceL2,
)) {
method = SafeContractFunction.createChainSpecificProxyWithNonceL2;
} else if (methods.contains(
SafeContractFunction.createChainSpecificProxyWithNonce,
)) {
method = SafeContractFunction.createChainSpecificProxyWithNonce;
}
}
if (method == null) {
throw ETHPluginException(
"Failed to find a valid contract creation method for the provided configuration",
details: {
"layer": layer.name,
"mode": mode.name,
"disableNonceForCreateProxy": disableNonceForCreateProxy,
},
);
}
if (method != SafeContractFunction.createProxy) {
saltNonce ??=
BigintUtils.fromBytes(QuickCrypto.generateRandom()) &
BinaryOps.maxU256;
} else {
saltNonce = null;
}
return encodeTransactionCall(
functionName: method,
params: [singleton, initializer, if (saltNonce != null) saltNonce],
);
}