public override bool TryGetRequiredValidations(ILedgerState state, Address address, List <TxDeclaration> declarations, out TransactionRequiredValidation required) { switch (address.Type) { case AddressType.ECDSA: required = new AddressRequiredSignature(address); return(true); } required = null; return(false); }
// returns false if over the limit private bool TryGetRequiredValidationsRecursive(ILedgerState state, Address address, List <TxDeclaration> declarations, out TransactionRequiredValidation required, int depth) { // we check max depth to limit computation if (depth >= MAX_DEPTH) { required = null; return(false); } // try get account switch (address.Type) { case AddressType.ECDSA: required = new AddressRequiredSignature(address); break; case AddressType.MultiSignatureECDSA: if (!state.TryGetDeclaration <MultiSignature>(address, out var multi)) { if (!TryGetMultiSigFromDeclarations(declarations, address, out multi)) { required = NotDeclaredRequiredValidation.Instance; break; } } var list = new List <TransactionRequiredValidation>(); foreach (var signer in multi.Signers) { if (!TryGetRequiredValidationsRecursive(state, signer, declarations, out var required2, depth + 1)) { required = null; return(false); } list.Add(required2); } required = new MultiAddressRequiredSignature(multi, list); break; case AddressType.HashLock: if (!state.TryGetDeclaration <HashLock>(address, out var hashlock)) { if (!TryGetHashLockFromDeclarations(declarations, address, out hashlock)) { required = NotDeclaredRequiredValidation.Instance; break; } } required = new HashLockRequiredSignature(hashlock); break; case AddressType.TimeLock: if (!state.TryGetDeclaration <TimeLock>(address, out var timelock)) { if (!TryGetTimeLockFromDeclarations(declarations, address, out timelock)) { required = NotDeclaredRequiredValidation.Instance; break; } } required = new TimeLockRequiredSignature(timelock); //TODO break; case AddressType.VendingMachine: if (!state.TryGetDeclaration <VendingMachine>(address, out var machine)) { if (!TryGetVendingMachineFromDeclarations(declarations, address, out machine)) { required = NotDeclaredRequiredValidation.Instance; break; } } required = new VendingMachineRequiredSignature(machine); //TODO break; default: required = null; return(false); } return(true); }