deploy static method
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,
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,
);
}