lib/zold/commands/propagate.rb
def propagate(id, _)
      start = Time.now
      modified = []
      total = 0
      network = @wallets.acq(id, &:network)
      @wallets.acq(id, &:txns).select { |t| t.amount.negative? }.each do |t|
        total += 1
        if t.bnf == id
          @log.error("Paying itself in #{id}? #{t}")
          next
        end
        @wallets.acq(t.bnf, exclusive: true) do |target|
          unless target.exists?
            @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wallet is absent")
            next
          end
          unless target.network == network
            @log.debug("#{t.amount * -1} to #{t.bnf}: network mismatch, '#{target.network}'!='#{network}'")
            next
          end
          next if target.includes_positive?(t.id, id)
          unless target.prefix?(t.prefix)
            @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wrong prefix \"#{t.prefix}\" in \"#{t}\"")
            next
          end
          target.add(t.inverse(id))
          @log.info("#{t.amount * -1} arrived to #{t.bnf}: #{t.details}")
          modified << t.bnf
        end
      end
      modified.uniq!
      @log.debug("Wallet #{id} propagated successfully, #{total} txns \
in #{Age.new(start, limit: 20 + total * 0.005)}, #{modified.count} wallets affected")
      modified.each do |w|
        @wallets.acq(w, &:refurbish)
      end
      modified
    end
def propagate(id, _)
      start = Time.now
      modified = []
      total = 0
      network = @wallets.acq(id, &:network)
      @wallets.acq(id, &:txns).select { |t| t.amount.negative? }.each do |t|
        total += 1
        if t.bnf == id
          @log.error("Paying itself in #{id}? #{t}")
          next
        end
        @wallets.acq(t.bnf, exclusive: true) do |target|
          unless target.exists?
            @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wallet is absent")
            next
          end
          unless target.network == network
            @log.debug("#{t.amount * -1} to #{t.bnf}: network mismatch, '#{target.network}'!='#{network}'")
            next
          end
          next if target.includes_positive?(t.id, id)
          unless target.prefix?(t.prefix)
            @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wrong prefix \"#{t.prefix}\" in \"#{t}\"")
            next
          end
          target.add(t.inverse(id))
          @log.info("#{t.amount * -1} arrived to #{t.bnf}: #{t.details}")
          modified << t.bnf
        end
      end
      modified.uniq!
      @log.debug("Wallet #{id} propagated successfully, #{total} txns \
in #{Age.new(start, limit: 20 + total * 0.005)}, #{modified.count} wallets affected")
      modified.each do |w|
        @wallets.acq(w, &:refurbish)
      end
      modified
    end
Returns list of Wallet IDs which were affected