deploy static method

Future<SafeContractDeployResult> deploy({
  1. required ONREQUESTETHPROVIDER onRequestProvider,
  2. required EthereumSigner signer,
  3. required SafeContractVersionedManifest manifest,
  4. required ETHAddress from,
  5. required List<ETHAddress> owners,
  6. required int threshold,
  7. SafeCreationMode mode = SafeCreationMode.standard,
  8. SafeContractLayer layer = SafeContractLayer.l1,
  9. BigInt? chainId,
  10. SafeContractFlavor flavor = SafeContractFlavor.canonical,
  11. ETHAddress? to,
  12. ETHAddress? factory,
  13. ETHAddress? singleton,
  14. ETHAddress? handler,
  15. List<int>? data,
  16. BigInt? saletNonce,
  17. ETHAddress? paymentToken,
  18. BigInt? payment,
  19. ETHAddress? paymentReceiver,
  20. bool disableNonceForCreateProxy = false,
})

Implementation

static Future<SafeContractDeployResult> deploy({
  required ONREQUESTETHPROVIDER onRequestProvider,
  required EthereumSigner signer,
  required SafeContractVersionedManifest manifest,
  required ETHAddress from,
  required List<ETHAddress> owners,
  required int threshold,
  SafeCreationMode mode = SafeCreationMode.standard,
  SafeContractLayer layer = SafeContractLayer.l1,
  BigInt? chainId,
  SafeContractFlavor flavor = SafeContractFlavor.canonical,
  ETHAddress? to,
  ETHAddress? factory,
  ETHAddress? singleton,
  ETHAddress? handler,
  List<int>? data,
  BigInt? saletNonce,
  ETHAddress? paymentToken,
  BigInt? payment,
  ETHAddress? paymentReceiver,
  bool disableNonceForCreateProxy = false,
}) async {
  final provider = await onRequestProvider();
  chainId ??= await provider.request(EthereumRequestGetChainId());
  factory ??=
      manifest
          .getSafeFactoryDeployment(chainId: chainId!, flavor: flavor)
          .address;
  singleton ??=
      manifest
          .getSafeSingletonDeployment(
            chainId: chainId!,
            flavor: flavor,
            layer: layer,
          )
          .address;
  handler ??=
      manifest
          .tryGetSafeFallBackHandlerDeployment(
            chainId: chainId!,
            flavor: flavor,
          )
          ?.address;
  switch (manifest.version) {
    case SafeContractVersion.v1_0_0:
      if (handler != null) {
        throw ETHPluginException(
          "Fallback handler is not supported in version ${manifest.version.version}.",
        );
      }
      break;
    default:
      break;
  }
  final singletonAbi = manifest.getSingletonContractAbi(layer: layer);
  final signletonContract = SafeSingletonContract(
    contract: singletonAbi,
    contractAddress: singleton,
    version: manifest.version,
  );
  final factoryContract = SafeFactoryContract(
    contract: manifest.proxy.abi,
    contractAddress: factory,
    version: manifest.proxy.version,
  );
  final setupData = await signletonContract.setup(
    owners: owners,
    threshold: BigInt.from(threshold),
    to: to,
    data: data,
    fallbackHandler: handler,
    paymentToken: paymentToken,
    payment: payment,
    paymentReceiver: paymentReceiver,
  );
  final factoryCreationionData = await factoryContract
      .resolveContractCreationMethod(
        singleton: singleton,
        initializer: setupData.encode,
        disableNonceForCreateProxy: disableNonceForCreateProxy,
        layer: layer,
        mode: mode,
        saltNonce: saletNonce,
      );
  final tx = ETHTransactionBuilder(
    from: from,
    data: factoryCreationionData.encode,
    to: factoryContract.contractAddress,
    value: BigInt.zero,
    chainId: chainId!,
  );
  await tx.autoFill(provider);
  await tx.signAsync(signer);
  // throw Exception();
  final receipt = await tx.submitAndWatchTransactionAsync(provider);
  List<SafeContractEvent> events = [];
  for (final i in receipt.logs) {
    if (i.topics.isEmpty) continue;
    final event = factoryContract.contract.tryEventFromSignature(
      i.topics.elementAt(0),
    );
    if (event == null) continue;
    final type = SafeContractEventType.fromEventName(event.name);
    events.add(
      SafeContractEvent.deserialize(
        type: type,
        result: event.decode(
          BytesUtils.fromHexString(i.data),
          i.topics.map((e) => BytesUtils.fromHexString(e)).toList(),
        ),
      ),
    );
  }
  final creationEvent =
      events
          .firstWhere(
            (e) => SafeContractEventConst.proxyCreationEventTypes.contains(
              e.type,
            ),
            orElse:
                () =>
                    throw ETHPluginException(
                      'No proxy creation event found in the transaction events.',
                    ),
          )
          .cast<BaseSafeContractEventProxyCreation>();

  // final events = receipt.from.m
  return SafeContractDeployResult(
    controller: SafeContractController(
      chainId: chainId,
      contract: SafeSingletonContract(
        version: manifest.version,
        contract: signletonContract.contract,
        contractAddress: creationEvent.proxy,
      ),
      onRequestProvider: onRequestProvider,
    ),
    events: events,
    creationEvent: creationEvent,
  );
}