Implementation
factory HostFunction.fromXdr(XdrHostFunction xdr) {
XdrHostFunctionType type = xdr.type;
switch (type) {
// Account effects
case XdrHostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM:
if (xdr.wasm != null) {
return UploadContractWasmHostFunction(xdr.wasm!.dataValue);
}
break;
case XdrHostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT:
if (xdr.invokeContract != null) {
List<XdrSCVal> invokeArgsList = xdr.invokeContract!;
if (invokeArgsList.length < 2 ||
invokeArgsList.elementAt(0).discriminant !=
XdrSCValType.SCV_ADDRESS ||
invokeArgsList.elementAt(0).address?.contractId == null ||
invokeArgsList.elementAt(1).discriminant !=
XdrSCValType.SCV_SYMBOL ||
invokeArgsList.elementAt(1).sym == null) {
throw UnimplementedError();
}
String contractID = Util.bytesToHex(
invokeArgsList.elementAt(0).address!.contractId!.hash);
String functionName = invokeArgsList.elementAt(1).sym!;
List<XdrSCVal>? funcArgs;
if (invokeArgsList.length > 2) {
funcArgs = List<XdrSCVal>.empty(growable: true);
for (int i = 2; i < invokeArgsList.length; i++) {
funcArgs.add(invokeArgsList[i]);
}
}
return InvokeContractHostFunction(contractID, functionName,
arguments: funcArgs);
}
break;
case XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT:
if (xdr.createContract != null) {
if (xdr.createContract!.contractIDPreimage.type ==
XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ADDRESS) {
if (xdr.createContract!.executable.type ==
XdrContractExecutableType.CONTRACT_EXECUTABLE_WASM &&
xdr.createContract!.executable.wasmHash != null) {
String wasmId = Util.bytesToHex(
xdr.createContract!.executable.wasmHash!.hash);
return CreateContractHostFunction(
Address.fromXdr(
xdr.createContract!.contractIDPreimage.address!),
wasmId,
salt: xdr.createContract!.contractIDPreimage.salt!);
} else if (xdr.createContract!.executable.type ==
XdrContractExecutableType.CONTRACT_EXECUTABLE_TOKEN) {
return DeploySACWithSourceAccountHostFunction(
Address.fromXdr(
xdr.createContract!.contractIDPreimage.address!),
salt: xdr.createContract!.contractIDPreimage.salt!);
}
} else if (xdr.createContract!.contractIDPreimage.type ==
XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ASSET &&
xdr.createContract!.executable.type ==
XdrContractExecutableType.CONTRACT_EXECUTABLE_TOKEN) {
return DeploySACWithAssetHostFunction(Asset.fromXdr(
xdr.createContract!.contractIDPreimage.fromAsset!));
}
}
break;
}
throw UnimplementedError();
}