resolveContractCreationMethod method

  1. @override
Future<SafeContractEncodedCall> resolveContractCreationMethod({
  1. required ETHAddress singleton,
  2. required List<int> initializer,
  3. BigInt? saltNonce,
  4. SafeCreationMode mode = SafeCreationMode.standard,
  5. SafeContractLayer layer = SafeContractLayer.l1,
  6. 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],
  );
}