예제 #1
0
 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);
 }
예제 #2
0
        // 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);
        }