Implementation
factory HostFunction.fromXdr(XdrHostFunction xdr) {
XdrHostFunctionType type = xdr.args.type;
switch (type) {
// Account effects
case XdrHostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM:
if (xdr.args.uploadContractWasm != null) {
return UploadContractWasmHostFunction(
xdr.args.uploadContractWasm!.code.dataValue,
auth: ContractAuth.fromXdrList(xdr.auth));
}
break;
case XdrHostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT:
if (xdr.args.invokeContract != null) {
List<XdrSCVal> invokeArgsList = xdr.args.invokeContract!;
if (invokeArgsList.length < 2 ||
invokeArgsList.elementAt(0).discriminant !=
XdrSCValType.SCV_BYTES ||
invokeArgsList.elementAt(0).bytes == null ||
invokeArgsList.elementAt(1).discriminant !=
XdrSCValType.SCV_SYMBOL ||
invokeArgsList.elementAt(1).sym == null) {
throw UnimplementedError();
}
String contractID =
Util.bytesToHex(invokeArgsList.elementAt(0).bytes!.dataValue);
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,
auth: ContractAuth.fromXdrList(xdr.auth));
}
break;
case XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT:
if (xdr.args.createContract != null) {
if (xdr.args.createContract!.contractID.discriminant ==
XdrContractIDType.CONTRACT_ID_FROM_SOURCE_ACCOUNT) {
if (xdr.args.createContract!.executable.discriminant ==
XdrSCContractExecutableType
.SCCONTRACT_EXECUTABLE_WASM_REF &&
xdr.args.createContract!.executable.wasmId != null) {
String wasmId = Util.bytesToHex(
xdr.args.createContract!.executable.wasmId!.hash);
return CreateContractHostFunction(
wasmId, salt: xdr.args.createContract!.contractID.salt!,
auth: ContractAuth.fromXdrList(xdr.auth));
} else if (xdr.args.createContract!.executable.discriminant ==
XdrSCContractExecutableType.SCCONTRACT_EXECUTABLE_TOKEN) {
return DeploySACWithSourceAccountHostFunction(
salt: xdr.args.createContract!.contractID.salt!,
auth: ContractAuth.fromXdrList(xdr.auth));
}
} else if (xdr.args.createContract!.contractID.discriminant ==
XdrContractIDType.CONTRACT_ID_FROM_ASSET &&
xdr.args.createContract!.executable.discriminant ==
XdrSCContractExecutableType.SCCONTRACT_EXECUTABLE_TOKEN) {
return DeploySACWithAssetHostFunction(
Asset.fromXdr(xdr.args.createContract!.contractID.asset!),
auth: ContractAuth.fromXdrList(xdr.auth));
}
}
break;
}
throw UnimplementedError();
}